diff options
Diffstat (limited to 'mirai.old/common/constants/memory.zig')
| -rw-r--r-- | mirai.old/common/constants/memory.zig | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/mirai.old/common/constants/memory.zig b/mirai.old/common/constants/memory.zig new file mode 100644 index 0000000..08b7409 --- /dev/null +++ b/mirai.old/common/constants/memory.zig @@ -0,0 +1,90 @@ +//! Memory constants + +pub const PAGE_SIZE: u64 = 4096; +pub const PAGE_OFFSET_MASK: u64 = 0xFFF; +pub const PAGE_FRAME_MASK: u64 = ~PAGE_OFFSET_MASK; + +pub const HIGHER_HALF_START: u64 = 0xFFFF800000000000; +pub const MIRAI_PHYSICAL_START: u64 = 0x100000; +pub const MIRAI_PHYSICAL_END: u64 = 0x500000; +pub const MIRAI_VIRTUAL_START: u64 = HIGHER_HALF_START + MIRAI_PHYSICAL_START; + +extern const _kernel_end: u8; + +pub fn MIRAI_END() u64 { + const link_addr = @intFromPtr(&_kernel_end); + if (link_addr >= HIGHER_HALF_START) { + return link_addr - HIGHER_HALF_START; + } else { + return link_addr; + } +} + +pub const KATA_SPACE_START: u64 = 0x1000; +pub const KATA_SPACE_END: u64 = 0x0000800000000000; + +// Stack configuration +pub const USER_STACK_TOP: u64 = 0x00007FFFFFF00000; +pub const USER_STACK_MAX_PAGES: u64 = 512; // 2MB max +pub const USER_STACK_INITIAL_PAGES: u64 = 16; // 64KB initial, grows on demand +pub const USER_STACK_SIZE: u64 = USER_STACK_MAX_PAGES * PAGE_SIZE; +pub const KERNEL_STACK_PAGES: u64 = 4; // 16KB +pub const KERNEL_STACK_SIZE: u64 = KERNEL_STACK_PAGES * PAGE_SIZE; + +pub const PTE_PRESENT: u64 = 1 << 0; +pub const PTE_WRITABLE: u64 = 1 << 1; +pub const PTE_USER: u64 = 1 << 2; +pub const PTE_WRITE_THROUGH: u64 = 1 << 3; +pub const PTE_CACHE_DISABLE: u64 = 1 << 4; +pub const PTE_ACCESSED: u64 = 1 << 5; +pub const PTE_DIRTY: u64 = 1 << 6; +pub const PTE_HUGE_PAGE: u64 = 1 << 7; +pub const PTE_GLOBAL: u64 = 1 << 8; +pub const PTE_NO_EXECUTE: u64 = 1 << 63; + +pub const PAGE_TABLE_ENTRIES: usize = 512; +pub const PML4_SHIFT: u6 = 39; +pub const PDPT_SHIFT: u6 = 30; +pub const PD_SHIFT: u6 = 21; +pub const PT_SHIFT: u6 = 12; +pub const TABLE_INDEX_MASK: u64 = 0x1FF; + +pub inline fn align_down(addr: u64) u64 { + return addr & PAGE_FRAME_MASK; +} + +pub inline fn align_up(addr: u64) u64 { + return (addr + PAGE_SIZE - 1) & PAGE_FRAME_MASK; +} + +pub inline fn pages_for_size(size: u64) u64 { + return (size + PAGE_SIZE - 1) / PAGE_SIZE; +} + +pub inline fn is_page_aligned(addr: u64) bool { + return (addr & PAGE_OFFSET_MASK) == 0; +} + +pub inline fn pml4_index(vaddr: u64) u64 { + return (vaddr >> PML4_SHIFT) & TABLE_INDEX_MASK; +} + +pub inline fn pdpt_index(vaddr: u64) u64 { + return (vaddr >> PDPT_SHIFT) & TABLE_INDEX_MASK; +} + +pub inline fn pd_index(vaddr: u64) u64 { + return (vaddr >> PD_SHIFT) & TABLE_INDEX_MASK; +} + +pub inline fn pt_index(vaddr: u64) u64 { + return (vaddr >> PT_SHIFT) & TABLE_INDEX_MASK; +} + +pub inline fn virt_to_phys(vaddr: u64) u64 { + return vaddr - HIGHER_HALF_START; +} + +pub inline fn phys_to_virt(paddr: u64) u64 { + return paddr + HIGHER_HALF_START; +} |
