StuBS
|
Describes the structure of segment descriptors. More...
#include <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 __pad0__: 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 __pad1__: 9 | |
Ignored (set via privilege_level ... available ) | |
Size operation_size: 2 | |
Default address width (custom field bit) | |
uint64_t __pad2__: 0 | |
Remainder ignored (set via base_high ) | |
}; | |
Fields specific for Code Segment (for debugging purposes) | |
struct { | |
uint64_t __pad0__: 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 __pad1__: 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) More... | |
uint64_t __pad2__: 0 | |
Remainder ignored. | |
}; | |
Fields specific for Data Segment (for debugging purposes) | |
struct { | |
uint64_t __pad0__: 40 | |
Ignored (set voa limit_low and base_low ) | |
enum Gate gate: 3 | |
TSS or LDT entry. | |
bool not16bit: 1 | |
false for 16-bit, true for 32-bit/64-bit | |
uint64_t __pad1__: 0 | |
Remainder ignored. | |
}; | |
Fields specific to the Task State Segment. | |
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 | |
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.
|
inlineconstexpr |
!< Merged value; useful for debugging
Constructor for a specific value
|
inlineconstexpr |
Constructor for a code/data GDT entry.
base | Base Address of segment |
limit | Size of segment |
code | Code or data segment |
ring | Privilege level |
size | Address width |
struct { ... } GDT::SegmentDescriptor::@29 |
Fields specific for Code Segment (for debugging purposes)
struct { ... } GDT::SegmentDescriptor::@31 |
Fields specific for Data Segment (for debugging purposes)
struct { ... } GDT::SegmentDescriptor::@33 |
Fields specific to the Task State Segment.
uint64_t GDT::SegmentDescriptor::__pad0__ |
Ignored (set via limit_low
and base_low
)
Ignored (set voa limit_low
and base_low
)
Ignored (set via limit_low
and base_low
)
uint64_t GDT::SegmentDescriptor::__pad1__ |
Ignored (set via privilege_level
... available
)
Remainder ignored.
uint64_t GDT::SegmentDescriptor::__pad2__ |
Remainder ignored (set via base_high
)
Remainder ignored.
bool GDT::SegmentDescriptor::big |
Size of the stack pointer (false
= 16 bit, true
= 32 bit)
1
.