55 lines
1.8 KiB
Rust

use core::time::Duration;
use alloc::{string::String, sync::Arc};
use device_api::interrupt::MessageInterruptController;
use yggdrasil_abi::{
error::Error,
process::{ExitCode, Signal},
};
use crate::{
mem::{address::PhysicalAddress, device::RawDeviceMemoryMapping},
thread::{CurrentThread, Thread},
};
extern "Rust" {
pub fn __acquire_irq_guard() -> bool;
pub fn __release_irq_guard(mask: bool);
pub fn __cpu_index() -> usize;
pub fn __cpu_count() -> usize;
pub fn __allocate_2m_page() -> Result<PhysicalAddress, Error>;
pub fn __allocate_page() -> Result<PhysicalAddress, Error>;
pub fn __allocate_contiguous_pages(count: usize) -> Result<PhysicalAddress, Error>;
pub fn __free_page(page: PhysicalAddress);
pub fn __virtualize(phys: u64) -> usize;
pub fn __physicalize(virt: usize) -> u64;
pub fn __map_device_pages(
base: PhysicalAddress,
count: usize,
) -> Result<RawDeviceMemoryMapping, Error>;
pub fn __unmap_device_pages(mapping: &RawDeviceMemoryMapping);
// SAFETY: Both the kernel-side and api-side Threads are sized and Arc<___> has the same value
// for them
pub fn __create_kthread(
name: String,
func: extern "C" fn(usize) -> !,
arg: usize,
) -> Result<Arc<Thread>, Error>;
pub fn __enqueue(t: &Arc<Thread>);
pub fn __current_thread() -> CurrentThread;
pub fn __suspend_current(t: &CurrentThread) -> Result<(), Error>;
pub fn __exit_current(t: &CurrentThread, code: ExitCode) -> !;
pub fn __yield();
pub fn __monotonic_timestamp() -> Result<Duration, Error>;
pub fn __message_interrupt_controller() -> &'static dyn MessageInterruptController;
pub fn __signal_process_group(group_id: u32, signal: Signal);
}