Xenon/src/gdt.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);
}
};