Преглед на файлове

feat(syscall): impl get_random and getegid

greatbridf преди 7 месеца
родител
ревизия
34bb98b1f1
променени са 2 файла, в които са добавени 29 реда и са изтрити 5 реда
  1. 8 3
      src/kernel/syscall/procops.rs
  2. 21 2
      src/kernel/syscall/sysinfo.rs

+ 8 - 3
src/kernel/syscall/procops.rs

@@ -403,16 +403,21 @@ fn geteuid() -> KResult<u32> {
     do_geteuid(thread)
 }
 
-#[eonix_macros::define_syscall(SYS_GETGID)]
-fn getgid() -> KResult<u32> {
+#[eonix_macros::define_syscall(SYS_GETEGID)]
+fn getegid() -> KResult<u32> {
     // All users are root for now.
     Ok(0)
 }
 
+#[eonix_macros::define_syscall(SYS_GETGID)]
+fn getgid() -> KResult<u32> {
+    sys_getegid(thread)
+}
+
 #[cfg(target_arch = "x86_64")]
 #[eonix_macros::define_syscall(SYS_GETGID32)]
 fn getgid32() -> KResult<u32> {
-    sys_getgid(thread)
+    sys_getegid(thread)
 }
 
 #[eonix_macros::define_syscall(SYS_GETTID)]

+ 21 - 2
src/kernel/syscall/sysinfo.rs

@@ -1,9 +1,10 @@
 use crate::{
+    io::Buffer as _,
     kernel::{
-        constants::{CLOCK_MONOTONIC, CLOCK_REALTIME, EINVAL},
+        constants::{CLOCK_MONOTONIC, CLOCK_REALTIME, EINTR, EINVAL},
         task::Thread,
         timer::{Instant, Ticks},
-        user::UserPointerMut,
+        user::{UserBuffer, UserPointerMut},
     },
     prelude::*,
 };
@@ -162,4 +163,22 @@ fn times(tms: *mut TMS) -> KResult<()> {
     })
 }
 
+#[eonix_macros::define_syscall(SYS_GETRANDOM)]
+fn get_random(buf: *mut u8, len: usize, flags: u32) -> KResult<usize> {
+    if flags != 0 {
+        return Err(EINVAL);
+    }
+
+    let mut buffer = UserBuffer::new(buf, len)?;
+    for i in (0u8..=255).cycle().step_by(53) {
+        let _ = buffer.fill(&[i])?;
+
+        if Thread::current().signal_list.has_pending_signal() {
+            return Err(EINTR);
+        }
+    }
+
+    Ok(len)
+}
+
 pub fn keep_alive() {}