1#[no_mangle]
8pub static mb_magic: u64 = 0;
9#[no_mangle]
13pub static mb_info_pm_addr: u64 = 0;
14
15#[inline]
16pub fn roundup_4k(addr: u64) -> u64 { (addr + 0xfff) & !0xfff }
17
18#[inline]
19pub fn rounddown_4k(addr: u64) -> u64 { addr & !0xfff }
20
21#[inline]
22pub fn is_aligned_4k(addr: u64) -> bool { (addr & 0xfff) == 0 }
23
24pub mod Mem {
26 pub const K: u64 = 1024;
28 pub const M: u64 = 1024 * K;
29 pub const G: u64 = 1024 * M;
30 pub const PAGE_SIZE: u64 = 0x1000;
32 pub const PAGE_SHIFT: u64 = 12;
33 pub const PAGE_MASK: u64 = 0xfff;
34 pub const MAX_PHY_MEM: u64 = 0x1000000000;
36 pub const MIN_PHY_MEM: u64 = 64 * M;
38 pub const ID_MAP_START: u64 = 0xffff_8000_0000_0000;
39 pub const ID_MAP_END: u64 = 0xffff_8010_0000_0000;
40 pub const KERNEL_OFFSET: u64 = 0xffff_8020_0000_0000;
42 pub const KERNEL_HEAP_START: u64 = 0xffff_8030_0000_0000;
45 pub const KERNEL_HEAP_END: u64 = 0xffff_8040_0000_0000;
46 pub const KERNEL_STACK_SIZE: u64 = 0x4000;
49 pub const KERNEL_STACK_MASK: u64 = KERNEL_STACK_SIZE - 1;
50 pub const KERNEL_STACK_TASK_MAGIC: u64 = 0x1A2B3C4D5E6F6969;
51 pub const USER_STACK_START: u64 = 0x0000_7000_0000_0000;
53 pub const USER_STACK_SIZE: u64 = 8 * M;
54}
55
56pub mod ExternSyms {
58 use crate::EXTERN_SYM_PTR;
59 EXTERN_SYM_PTR!(pub GDT , gdt);
61 EXTERN_SYM_PTR!(pub GDT_80 , gdt_80);
62 EXTERN_SYM_PTR!(pub TSS_DESC , tss_desc);
63 EXTERN_SYM_PTR!(pub TSS0, tss0);
64
65 EXTERN_SYM_PTR!(pub VECTORS_START, vectors_start);
66 EXTERN_SYM_PTR!(pub VECTOR_128, vector_128);
67 EXTERN_SYM_PTR!(pub VECTOR_INV, vector_invalid);
68 EXTERN_SYM_PTR!(pub IDT, idt);
69 EXTERN_SYM_PTR!(pub IDT_DESCR, idt_descr);
70 EXTERN_SYM_PTR!(pub KERNEL_PM_START, ___KERNEL_PM_START__);
72 EXTERN_SYM_PTR!(pub KERNEL_PM_END, ___KERNEL_PM_END__);
73 EXTERN_SYM_PTR!(pub BSS_START, ___BSS_START__);
74 EXTERN_SYM_PTR!(pub BSS_END, ___BSS_END__);
75 EXTERN_SYM_PTR!(pub RAMFS_START, ___RAMFS_START__);
76 EXTERN_SYM_PTR!(pub RAMFS_END, ___RAMFS_END__);
77 EXTERN_SYM_PTR!(pub FREE_PAGE_STACK, ___FREE_PAGE_STACK__);
82
83 }
87
88#[cfg(target_arch = "x86_64")]
89pub mod HWDefs {
90 pub const IDT_CAPACITY: usize = 256;
92 pub const IDT_VALID: usize = 48;
94 pub const VECTOR_SIZE: usize = 16;
96 pub const SEG_KERNEL_DATA: u16 = 0x08;
100 pub const SEG_KERNEL_CODE: u16 = 0x10;
101 pub const SEG_USER_CODE: u16 = 0x18;
103 pub const SEG_USER_DATA: u16 = 0x20;
104}
105
106pub mod Limits {
107 pub const SEM_WAIT_QUEUE_MIN_CAP: usize = 16;
110 pub const SCHED_RUN_QUEUE_MIN_CAP: usize = 24;
111}
112
113#[allow(non_snake_case)]
117#[inline]
118pub const fn V2P(va: u64) -> Option<u64> {
119 if va >= Mem::ID_MAP_END || va < Mem::ID_MAP_START {
120 return None;
121 }
122 return Some(va - Mem::ID_MAP_START);
123}
124
125#[allow(non_snake_case)]
127#[inline]
128pub const fn P2V(pa: u64) -> Option<u64> {
129 if pa >= Mem::MAX_PHY_MEM {
130 return None;
131 }
132 return Some(pa + Mem::ID_MAP_START);
133}
134
135pub struct IntNumber {}
138impl IntNumber {
139 pub const PAGEFAULT: u16 = 0xe;
140 pub const TIMER: u16 = 0x20;
141 pub const KEYBOARD: u16 = 0x21;
142 pub const SYSCALL: u16 = 0x80;
143}