Browse Source

Add more special redox functions

Jeremy Soller 6 years ago
parent
commit
0d2332d368
2 changed files with 36 additions and 3 deletions
  1. 4 0
      include/sys/redox.h
  2. 32 3
      src/platform/redox/extra.rs

+ 4 - 0
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
 

+ 32 - 3
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
+}