1#![unstable(feature = "kernel_internals", issue = "none")]
2
3pub mod alloc {
4 use core::alloc::Layout;
5
6 extern "Rust" {
7 pub fn __popcorn_alloc(layout: Layout) -> *mut u8;
8 pub fn __popcorn_dealloc(ptr: *mut u8, layout: Layout);
9 pub fn __popcorn_alloc_zeroed(layout: Layout) -> *mut u8;
10 pub fn __popcorn_realloc(ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8;
11 }
12}
13
14pub mod panic {
15 use core::panic::PanicInfo;
16
17 extern "Rust" {
18 pub fn __popcorn_panic_handler(info: &PanicInfo) -> !;
19 pub fn __popcorn_backtrace();
20 pub fn __popcorn_is_panicking() -> bool;
21 }
22}
23
24pub mod hal {
25 extern "Rust" {
26 pub fn __popcorn_enable_irq();
27 pub fn __popcorn_set_irq(state: usize);
28 pub fn __popcorn_disable_irq() -> usize;
29 }
30}
31
32pub mod paging {
33 use core::marker::PhantomData;
34 use core::ops::DerefMut;
35 use crate::memory::{Frame, Page, PhysicalAddress, VirtualAddress, AllocError};
36 use crate::memory::mapping::Protection;
37 use crate::sync::RwWriteGuard;
38 use crate::memory::r#virtual::address_space::AddressSpaceInner;
39
40 #[repr(align(8))]
42 pub struct KTable((), PhantomData<KTableInner>);
43
44 extern "Rust" {
45 type KTableInner;
46
47 pub fn __popcorn_paging_ktable_translate_page(this: &KTable, page: Page) -> Option<Frame>;
48 pub fn __popcorn_paging_ktable_translate_address(this: &KTable, addr: VirtualAddress) -> Option<PhysicalAddress>;
49 pub fn __popcorn_paging_ktable_map_page(this: &mut KTable, page: Page, frame: Frame, reason: u16, protection: Protection) -> Result<(), MapPageError>;
50 pub fn __popcorn_paging_ktable_unmap_page(this: &mut KTable, page: Page) -> Result<(), ()>;
51 pub fn __popcorn_paging_ttable_translate_page(this: &AddressSpaceInner, page: Page) -> Option<Frame>;
52 pub fn __popcorn_paging_ttable_translate_address(this: &AddressSpaceInner, addr: VirtualAddress) -> Option<PhysicalAddress>;
53 pub fn __popcorn_paging_ttable_map_page(this: &AddressSpaceInner, page: Page, frame: Frame, reason: u16, protection: Protection) -> Result<(), MapPageError>;
54 pub fn __popcorn_paging_ttable_unmap_page(this: &AddressSpaceInner, page: Page) -> Result<(), ()>;
55 pub fn __popcorn_address_space_load(this: &AddressSpaceInner);
56 }
57
58 pub unsafe fn __popcorn_paging_get_ktable() -> impl DerefMut<Target = KTable> {
59 extern "Rust" {
60 pub fn __popcorn_paging_get_ktable() -> RwWriteGuard<'static, KTable>;
61 }
62
63 __popcorn_paging_get_ktable()
64 }
65
66 #[derive(Debug, Copy, Clone)]
67 pub enum MapPageError {
68 AllocError,
69 AlreadyMapped(u16)
70 }
71
72 #[doc(hidden)]
73 impl From<AllocError> for MapPageError {
74 fn from(_value: AllocError) -> Self {
75 Self::AllocError
76 }
77 }
78}
79
80pub mod memory {
81 use core::ptr::NonNull;
82 use crate::memory::physical::GlobalAllocator;
83 use crate::memory::{AllocError, Page};
84 use crate::memory::r#virtual::address_space::AddressSpaceInner;
85
86 extern "Rust" {
87 #[link_name = "__popcorn_memory_physical_highmem"]
88 pub static GLOBAL_HIGHMEM: GlobalAllocator;
89
90 #[link_name = "__popcorn_memory_physical_dmamem"]
91 pub static GLOBAL_DMA: GlobalAllocator;
92
93 pub fn __popcorn_check_address_space(to_check: NonNull<AddressSpaceInner>) -> bool;
94 pub fn __popcorn_address_space_allocate(this: &AddressSpaceInner, len: usize) -> Result<Page, AllocError>;
95 pub fn __popcorn_address_space_allocate_at(this: &AddressSpaceInner, at: Page, len: usize) -> Result<Page, AllocError>;
96 pub fn __popcorn_address_space_deallocate(this: &AddressSpaceInner, base: Page, len: usize);
97 }
98}
99
100pub mod time {
101 use core::num::NonZero;
102
103 extern "Rust" {
104 #[link_name = "__popcorn_system_time"]
105 pub fn system_time() -> u128;
106
107 #[link_name = "__popcorn_system_time_scale"]
108 pub fn system_time_to_nanos() -> (u128, NonZero<u128>);
109 }
110}