2
0

extra.rs 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. use core::{mem::size_of, ptr, slice};
  2. use crate::platform::{sys::e, types::*};
  3. #[no_mangle]
  4. pub unsafe extern "C" fn redox_fpath(fd: c_int, buf: *mut c_void, count: size_t) -> ssize_t {
  5. e(syscall::fpath(
  6. fd as usize,
  7. slice::from_raw_parts_mut(buf as *mut u8, count),
  8. )) as ssize_t
  9. }
  10. #[no_mangle]
  11. pub unsafe extern "C" fn redox_physalloc(size: size_t) -> *mut c_void {
  12. let res = e(syscall::physalloc(size));
  13. if res == !0 {
  14. return ptr::null_mut();
  15. } else {
  16. return res as *mut c_void;
  17. }
  18. }
  19. #[no_mangle]
  20. pub unsafe extern "C" fn redox_physfree(physical_address: *mut c_void, size: size_t) -> c_int {
  21. e(syscall::physfree(physical_address as usize, size)) as c_int
  22. }
  23. #[no_mangle]
  24. pub unsafe extern "C" fn redox_physmap(
  25. physical_address: *mut c_void,
  26. size: size_t,
  27. flags: c_int,
  28. ) -> *mut c_void {
  29. let res = e(syscall::physmap(
  30. physical_address as usize,
  31. size,
  32. syscall::PhysmapFlags::from_bits(flags as usize).expect("physmap: invalid bit pattern"),
  33. ));
  34. if res == !0 {
  35. return ptr::null_mut();
  36. } else {
  37. return res as *mut c_void;
  38. }
  39. }
  40. #[no_mangle]
  41. pub unsafe extern "C" fn redox_physunmap(virtual_address: *mut c_void) -> c_int {
  42. e(syscall::physunmap(virtual_address as usize)) as c_int
  43. }
  44. pub struct FdGuard {
  45. fd: usize,
  46. taken: bool,
  47. }
  48. impl FdGuard {
  49. pub fn new(fd: usize) -> Self {
  50. Self {
  51. fd, taken: false,
  52. }
  53. }
  54. pub fn take(&mut self) -> usize {
  55. self.taken = true;
  56. self.fd
  57. }
  58. }
  59. impl core::ops::Deref for FdGuard {
  60. type Target = usize;
  61. fn deref(&self) -> &Self::Target {
  62. &self.fd
  63. }
  64. }
  65. impl Drop for FdGuard {
  66. fn drop(&mut self) {
  67. if !self.taken {
  68. let _ = syscall::close(self.fd);
  69. }
  70. }
  71. }
  72. pub fn create_set_addr_space_buf(space: usize, ip: usize, sp: usize) -> [u8; size_of::<usize>() * 3] {
  73. let mut buf = [0_u8; 3 * size_of::<usize>()];
  74. let mut chunks = buf.array_chunks_mut::<{size_of::<usize>()}>();
  75. *chunks.next().unwrap() = usize::to_ne_bytes(space);
  76. *chunks.next().unwrap() = usize::to_ne_bytes(sp);
  77. *chunks.next().unwrap() = usize::to_ne_bytes(ip);
  78. buf
  79. }