76 lines
1.5 KiB
Zig
76 lines
1.5 KiB
Zig
const GdtDescriptor = packed struct {
|
|
limit: u16,
|
|
base_address: *align(8) SegmentDescriptor,
|
|
};
|
|
|
|
const SegmentDescriptor = packed union {
|
|
Code: CodeSegementDescriptor,
|
|
Data: DataSegementDescriptor,
|
|
|
|
comptime {
|
|
assert(@sizeOf(@This()) == 4);
|
|
}
|
|
}
|
|
|
|
const CodeSegementDescriptor = packed struct {
|
|
base_address_24: u8,
|
|
g: bool,
|
|
|
|
/// Used in long mode
|
|
/// Operand size if 16 bit (false) or 32 bit (true)
|
|
/// Must be false if long is true
|
|
default_operand_size: bool,
|
|
|
|
/// Used in long mode
|
|
/// Processor is running in long mode (true) or compatibility mode (false)
|
|
long: bool,
|
|
|
|
avl: bool,
|
|
segment_limit_16: u4,
|
|
|
|
/// Used in long mode
|
|
present: bool,
|
|
|
|
/// Used in long mode
|
|
/// DPL from 0 (highest) to 3 (lowest)
|
|
descriptor_privilege_level: u2,
|
|
|
|
_forced: u2,
|
|
|
|
/// Used in long mode
|
|
/// Restrict transfer from lower privilege code
|
|
conforming: bool,
|
|
|
|
r: bool,
|
|
a: bool,
|
|
base_address_0: u24,
|
|
segment_limit_0: u16,
|
|
|
|
comptime {
|
|
assert(@sizeOf(@This()) == 4);
|
|
}
|
|
};
|
|
|
|
const DataSegementDescriptor = packed struct {
|
|
base_address_24: u8,
|
|
g: bool,
|
|
d_b: bool,
|
|
_blank: bool,
|
|
avl: bool,
|
|
segment_limit_16: u4,
|
|
|
|
/// Used in long mode
|
|
present: bool,
|
|
dpl: u2,
|
|
_forced: u2,
|
|
e: bool,
|
|
w: bool,
|
|
a: bool,
|
|
base_address_0: u24,
|
|
segment_limit_0: u16,
|
|
|
|
comptime {
|
|
assert(@sizeOf(@This()) == 4);
|
|
}
|
|
};
|