diff --git a/include/sys/redox.h b/include/sys/redox.h index 4fb4bebdc0..6dd2322368 100644 --- a/include/sys/redox.h +++ b/include/sys/redox.h @@ -10,6 +10,10 @@ extern "C" { #ifdef __redox__ ssize_t redox_fpath(int fd, void * buf, size_t count); +void * redox_physalloc(size_t size); +int redox_physfree(void * physical_address, size_t size); +void * redox_physmap(void * physical_address, size_t size, int flags); +int redox_physunmap(void * virtual_address); #endif diff --git a/src/platform/redox/extra.rs b/src/platform/redox/extra.rs index 11fddfdb61..d0a50770ed 100644 --- a/src/platform/redox/extra.rs +++ b/src/platform/redox/extra.rs @@ -1,10 +1,39 @@ -use core::slice; +use core::{ptr, slice}; +use platform::sys::e; use platform::types::*; -use super::e; - #[no_mangle] pub unsafe extern "C" fn redox_fpath(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t { e(syscall::fpath(fd as usize, slice::from_raw_parts_mut(buf as *mut u8, count))) as ssize_t } + +#[no_mangle] +pub unsafe extern "C" fn redox_physalloc(size: size_t) -> *mut c_void { + let res = e(syscall::physalloc(size)); + if res == !0 { + return ptr::null_mut(); + } else { + return res as *mut c_void + } +} + +#[no_mangle] +pub unsafe extern "C" fn redox_physfree(physical_address: *mut c_void, size: size_t) -> c_int { + e(syscall::physfree(physical_address as usize, size)) as c_int +} + +#[no_mangle] +pub unsafe extern "C" fn redox_physmap(physical_address: *mut c_void, size: size_t, flags: c_int) -> *mut c_void { + let res = e(syscall::physmap(physical_address as usize, size, flags as usize)); + if res == !0 { + return ptr::null_mut(); + } else { + return res as *mut c_void + } +} + +#[no_mangle] +pub unsafe extern "C" fn redox_physunmap(virtual_address: *mut c_void) -> c_int { + e(syscall::physunmap(virtual_address as usize)) as c_int +}