sysinfo.rs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. use crate::{
  2. kernel::{
  3. constants::{CLOCK_MONOTONIC, CLOCK_REALTIME, EINVAL},
  4. task::Thread,
  5. timer::ticks,
  6. user::UserPointerMut,
  7. },
  8. prelude::*,
  9. };
  10. use posix_types::syscall_no::*;
  11. #[derive(Clone, Copy)]
  12. struct NewUTSName {
  13. sysname: [u8; 65],
  14. nodename: [u8; 65],
  15. release: [u8; 65],
  16. version: [u8; 65],
  17. machine: [u8; 65],
  18. domainname: [u8; 65],
  19. }
  20. fn copy_cstr_to_array(cstr: &[u8], array: &mut [u8]) {
  21. let len = cstr.len().min(array.len() - 1);
  22. array[..len].copy_from_slice(&cstr[..len]);
  23. array[len] = 0;
  24. }
  25. #[eonix_macros::define_syscall(SYS_NEWUNAME)]
  26. fn newuname(buffer: *mut NewUTSName) -> KResult<()> {
  27. let buffer = UserPointerMut::new(buffer)?;
  28. let mut uname = NewUTSName {
  29. sysname: [0; 65],
  30. nodename: [0; 65],
  31. release: [0; 65],
  32. version: [0; 65],
  33. machine: [0; 65],
  34. domainname: [0; 65],
  35. };
  36. // Linux compatible
  37. copy_cstr_to_array(b"Linux", &mut uname.sysname);
  38. copy_cstr_to_array(b"(none)", &mut uname.nodename);
  39. copy_cstr_to_array(b"5.17.1", &mut uname.release);
  40. copy_cstr_to_array(b"eonix 1.1.4", &mut uname.version);
  41. #[cfg(target_arch = "x86_64")]
  42. copy_cstr_to_array(b"x86", &mut uname.machine);
  43. #[cfg(target_arch = "riscv64")]
  44. copy_cstr_to_array(b"riscv64", &mut uname.machine);
  45. copy_cstr_to_array(b"(none)", &mut uname.domainname);
  46. buffer.write(uname)
  47. }
  48. #[allow(dead_code)]
  49. #[derive(Default, Clone, Copy)]
  50. pub struct TimeVal {
  51. sec: u64,
  52. usec: u64,
  53. }
  54. #[allow(dead_code)]
  55. #[derive(Clone, Copy)]
  56. pub struct TimeSpec {
  57. sec: u64,
  58. nsec: u64,
  59. }
  60. #[eonix_macros::define_syscall(SYS_GETTIMEOFDAY)]
  61. fn gettimeofday(timeval: *mut TimeVal, timezone: *mut ()) -> KResult<()> {
  62. if !timezone.is_null() {
  63. return Err(EINVAL);
  64. }
  65. if !timeval.is_null() {
  66. let timeval = UserPointerMut::new(timeval)?;
  67. let ticks = ticks();
  68. timeval.write(TimeVal {
  69. sec: ticks.in_secs() as u64,
  70. usec: ticks.in_usecs() as u64 % 1_000_000,
  71. })?;
  72. }
  73. Ok(())
  74. }
  75. fn do_clock_gettime64(_thread: &Thread, clock_id: u32, timespec: *mut TimeSpec) -> KResult<()> {
  76. if clock_id != CLOCK_REALTIME && clock_id != CLOCK_MONOTONIC {
  77. unimplemented!("Unsupported clock_id: {}", clock_id);
  78. }
  79. let timespec = UserPointerMut::new(timespec)?;
  80. let ticks = ticks();
  81. timespec.write(TimeSpec {
  82. sec: ticks.in_secs() as u64,
  83. nsec: ticks.in_nsecs() as u64 % 1_000_000_000,
  84. })
  85. }
  86. #[cfg(not(target_arch = "x86_64"))]
  87. #[eonix_macros::define_syscall(SYS_CLOCK_GETTIME)]
  88. fn clock_gettime(clock_id: u32, timespec: *mut TimeSpec) -> KResult<()> {
  89. do_clock_gettime64(thread, clock_id, timespec)
  90. }
  91. #[cfg(target_arch = "x86_64")]
  92. #[eonix_macros::define_syscall(SYS_CLOCK_GETTIME64)]
  93. fn clock_gettime64(clock_id: u32, timespec: *mut TimeSpec) -> KResult<()> {
  94. do_clock_gettime64(thread, clock_id, timespec)
  95. }
  96. #[repr(C)]
  97. #[derive(Clone, Copy)]
  98. struct Sysinfo {
  99. uptime: u32,
  100. loads: [u32; 3],
  101. totalram: u32,
  102. freeram: u32,
  103. sharedram: u32,
  104. bufferram: u32,
  105. totalswap: u32,
  106. freeswap: u32,
  107. procs: u16,
  108. totalhigh: u32,
  109. freehigh: u32,
  110. mem_unit: u32,
  111. _padding: [u8; 8],
  112. }
  113. #[eonix_macros::define_syscall(SYS_SYSINFO)]
  114. fn sysinfo(info: *mut Sysinfo) -> KResult<()> {
  115. let info = UserPointerMut::new(info)?;
  116. info.write(Sysinfo {
  117. uptime: ticks().in_secs() as u32,
  118. loads: [0; 3],
  119. totalram: 100,
  120. freeram: 50,
  121. sharedram: 0,
  122. bufferram: 0,
  123. totalswap: 0,
  124. freeswap: 0,
  125. procs: 10,
  126. totalhigh: 0,
  127. freehigh: 0,
  128. mem_unit: 1024,
  129. _padding: [0; 8],
  130. })
  131. }
  132. #[repr(C)]
  133. #[derive(Clone, Copy)]
  134. struct TMS {
  135. tms_utime: u32,
  136. tms_stime: u32,
  137. tms_cutime: u32,
  138. tms_cstime: u32,
  139. }
  140. #[eonix_macros::define_syscall(SYS_TIMES)]
  141. fn times(tms: *mut TMS) -> KResult<()> {
  142. let tms = UserPointerMut::new(tms)?;
  143. tms.write(TMS {
  144. tms_utime: 0,
  145. tms_stime: 0,
  146. tms_cutime: 0,
  147. tms_cstime: 0,
  148. })
  149. }
  150. pub fn keep_alive() {}