aboutsummaryrefslogtreecommitdiff
path: root/mirai.old/common/constants/memory.zig
blob: 08b7409a8b58068aed56edc2fecfe5a7d1152779 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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;
}