This commit is contained in:
Mathieu Strypsteen 2024-06-30 17:44:10 +02:00
parent 5de81b0166
commit 37f8c7d1ae
2 changed files with 73 additions and 3 deletions

View file

@ -1 +1,72 @@
pub fn setup_gdt() {} use core::{arch::asm, mem::size_of};
#[repr(C)]
struct GDTEntry {
limit_low: u16,
base_low: u16,
base_middle: u8,
access: u8,
flags: u8,
base_high: u8,
}
#[repr(C)]
struct GDT {
entries: [GDTEntry; 3],
}
#[repr(C, packed)]
struct GDTDescriptor {
limit: u16,
base: u64,
}
const GDT: GDT = GDT {
entries: [
GDTEntry {
limit_low: 0,
base_low: 0,
base_middle: 0,
access: 0,
flags: 0,
base_high: 0,
},
GDTEntry {
limit_low: 0,
base_low: 0,
base_middle: 0,
access: 0x9a,
flags: 0x20,
base_high: 0,
},
GDTEntry {
limit_low: 0,
base_low: 0,
base_middle: 0,
access: 0x92,
flags: 0,
base_high: 0,
},
],
};
pub fn setup_gdt() {
let gdt_descriptor = GDTDescriptor {
limit: (size_of::<GDT>() - 1) as u16,
base: GDT.entries.as_ptr() as u64,
};
unsafe {
asm!("
lgdt ({})
push $8
push $1f
lretq
1:
mov $0x10, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
mov %ax, %ss
", in(reg) &gdt_descriptor, out("rax") _, options(att_syntax));
}
}

View file

@ -21,8 +21,7 @@ bitfield! {
address, set_address: 63, 12; address, set_address: 63, 12;
} }
#[repr(C)] #[repr(C, align(0x1000))]
#[repr(align(0x1000))]
struct PageTable { struct PageTable {
entries: [PageEntry; 512], entries: [PageEntry; 512],
} }