StuBS
GDT::SegmentDescriptor Union Reference

Describes the structure of segment descriptors. More...

#include <machine/gdt.h>

Public Member Functions

constexpr SegmentDescriptor (uint64_t val=0)
 !< Merged value; useful for debugging
constexpr SegmentDescriptor (uintptr_t base, uint32_t limit, bool code, int ring, Size size)
 Constructor for a code/data GDT entry.

Public Attributes

struct { 
uint64_t limit_low: 16
 Least-significant bits of segment size (influenced by granularity!).
uint64_t base_low: 24
 Least-significant bits of base address.
uint64_t type: 4
 Meaning of those 4 bits depends on descriptor_type below.
DescriptorType descriptor_type: 1
 Descriptor type (influences the meaning of the 3 bits above).
uint64_t privilege_level: 2
 Ring for this segment.
bool present: 1
 Entry is valid iff set to true.
uint64_t limit_high: 4
 Most-significant bits of segment size.
bool available: 1
 Bit which can be used for other purposes (in software).
uint64_t custom: 2
 Meaning of those 2 bits relate to descriptor_type and type.
Granularity granularity: 1
 Unit used as granularity for the segment limit.
uint64_t base_high: 8
 most-significant bits of base address
}; 
struct { 
uint64_t : 40
 Ignored (set via limit_low and base_low ).
bool code_accessed: 1
 If set, the code segment was used since the last reset of this value.
bool readable: 1
 If set, the code is readable (otherwise only executable).
bool conforming: 1
 If set, the execution of code from this segment is only allowed when running at a privilege of numerically less than or equal to privilege_level (i.e. the executor has the same or higher privileges). However, the executor's privileges remain unchanged. For nonconforming code segments (i.e., conforming is set to 0), execution is allowed only if the privileges are equal. Execution will cause a GPF in case of privilege violation.
bool code: 1
 Has to be set to true.
uint64_t : 9
 Ignored (set via privilege_level ... available).
Size operation_size: 2
 Default address width (custom field bit).
uint64_t : 0
 Remainder ignored (set via base_high).
}; 
 Fields specific for Code Segment (for debugging purposes).
struct { 
uint64_t : 40
 Ignored (set via limit_low and base_low).
bool data_accessed: 1
 If set, the data segment was used since the last reset of this value.
bool writeable: 1
 If set, data is writable (otherwise read only).
bool expand_down: 1
 Growing direction for dynamically growing segments.
bool notData: 1
 Has to be cleared (false).
uint64_t : 9
 Ignored (set via privilege_level ... available).
uint64_t reserved: 1
 Reserved, always set to 0!
bool big: 1
 Size of the stack pointer (false = 16 bit, true = 32 bit).
uint64_t : 0
 Remainder ignored.
}; 
 Fields specific for Data Segment (for debugging purposes).
uint64_t value

Detailed Description

Describes the structure of segment descriptors.

A data structure that contains size, position, access rights, and purpose of any segment. Segment descriptors are used in both the GDT, as well as in LDTs.

See also
ISDMv3, 3.4.5; Segment Descriptors
AAPMv2, 4.7 Legacy Segment Descriptors
AAPMv2, 4.8 Long-Mode Segment Descriptors

Constructor & Destructor Documentation

◆ SegmentDescriptor() [1/2]

GDT::SegmentDescriptor::SegmentDescriptor ( uint64_t val = 0)
inlineconstexpr

!< Merged value; useful for debugging

Constructor for a specific value

◆ SegmentDescriptor() [2/2]

GDT::SegmentDescriptor::SegmentDescriptor ( uintptr_t base,
uint32_t limit,
bool code,
int ring,
Size size )
inlineconstexpr

Constructor for a code/data GDT entry.

Parameters
baseBase Address of segment
limitSize of segment
codeCode or data segment
ringPrivilege level
sizeAddress width

Member Data Documentation

◆ [struct]

struct { ... } GDT::SegmentDescriptor

Fields specific for Code Segment (for debugging purposes).

See also
ISDMv3, 3.4.5.1; Code- and Data-Segment Descriptor Types

◆ [struct]

struct { ... } GDT::SegmentDescriptor

Fields specific for Data Segment (for debugging purposes).

See also
ISDMv3, 3.4.5.1; Code- and Data-Segment Descriptor Types

The documentation for this union was generated from the following file: