kernel_api/
bridge.rs

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	// FIXME: replace with extern type when alignment can be specified
41	#[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}