Sfoglia il codice sorgente

feat(syscall): temporary impl of getrlimit, vfork and sysinfo

greatbridf 3 mesi fa
parent
commit
ee488bcb18
2 ha cambiato i file con 53 aggiunte e 3 eliminazioni
  1. 14 3
      src/kernel/syscall/procops.rs
  2. 39 0
      src/kernel/syscall/sysinfo.rs

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

@@ -175,9 +175,9 @@ bitflags! {
 }
 
 fn do_waitpid(waitpid: u32, arg1: *mut u32, options: u32) -> KResult<u32> {
-    if waitpid != u32::MAX {
-        unimplemented!("waitpid with pid {waitpid}")
-    }
+    // if waitpid != u32::MAX {
+    //     unimplemented!("waitpid with pid {waitpid}")
+    // }
     let options = match UserWaitOptions::from_bits(options) {
         None => unimplemented!("waitpid with options {options}"),
         Some(options) => options,
@@ -480,6 +480,10 @@ fn do_prlimit64(
     }
 }
 
+fn do_getrlimit(resource: u32, rlimit: *mut RLimit) -> KResult<()> {
+    do_prlimit64(0, resource, core::ptr::null(), rlimit)
+}
+
 define_syscall32!(sys_chdir, do_chdir, path: *const u8);
 define_syscall32!(sys_umask, do_umask, mask: u32);
 define_syscall32!(sys_getcwd, do_getcwd, buffer: *mut u8, bufsize: usize);
@@ -510,6 +514,11 @@ define_syscall32!(sys_rt_sigaction, do_rt_sigaction,
     signum: u32, act: *const UserSignalAction, oldact: *mut UserSignalAction, sigsetsize: usize);
 define_syscall32!(sys_prlimit64, do_prlimit64,
     pid: u32, resource: u32, new_limit: *const RLimit, old_limit: *mut RLimit);
+define_syscall32!(sys_getrlimit, do_getrlimit, resource: u32, rlimit: *mut RLimit);
+
+fn sys_vfork(int_stack: &mut InterruptContext, ext: &mut ExtendedContext) -> usize {
+    sys_fork(int_stack, ext)
+}
 
 fn sys_fork(int_stack: &mut InterruptContext, _: &mut ExtendedContext) -> usize {
     let mut procs = ProcessList::get().lock();
@@ -556,6 +565,8 @@ pub(super) fn register() {
     register_syscall!(0xae, rt_sigaction);
     register_syscall!(0xaf, rt_sigprocmask);
     register_syscall!(0xb7, getcwd);
+    register_syscall!(0xbe, vfork);
+    register_syscall!(0xbf, getrlimit);
     register_syscall!(0xc7, getuid);
     register_syscall!(0xc8, getgid);
     register_syscall!(0xc9, geteuid);

+ 39 - 0
src/kernel/syscall/sysinfo.rs

@@ -93,12 +93,51 @@ fn do_clock_gettime64(clock_id: u32, timespec: *mut TimeSpec) -> KResult<()> {
     })
 }
 
+#[repr(C)]
+#[derive(Clone, Copy)]
+struct Sysinfo {
+    uptime: u32,
+    loads: [u32; 3],
+    totalram: u32,
+    freeram: u32,
+    sharedram: u32,
+    bufferram: u32,
+    totalswap: u32,
+    freeswap: u32,
+    procs: u16,
+    totalhigh: u32,
+    freehigh: u32,
+    mem_unit: u32,
+    _padding: [u8; 8],
+}
+
+fn do_sysinfo(info: *mut Sysinfo) -> KResult<()> {
+    let info = UserPointerMut::new(info)?;
+    info.write(Sysinfo {
+        uptime: ticks().in_secs() as u32,
+        loads: [0; 3],
+        totalram: 100,
+        freeram: 50,
+        sharedram: 0,
+        bufferram: 0,
+        totalswap: 0,
+        freeswap: 0,
+        procs: 10,
+        totalhigh: 0,
+        freehigh: 0,
+        mem_unit: 1024,
+        _padding: [0; 8],
+    })
+}
+
 define_syscall32!(sys_newuname, do_newuname, buffer: *mut NewUTSName);
 define_syscall32!(sys_gettimeofday, do_gettimeofday, timeval: *mut TimeVal, timezone: *mut ());
 define_syscall32!(sys_clock_gettime64, do_clock_gettime64, clock_id: u32, timespec: *mut TimeSpec);
+define_syscall32!(sys_sysinfo, do_sysinfo, info: *mut Sysinfo);
 
 pub(super) fn register() {
     register_syscall!(0x4e, gettimeofday);
+    register_syscall!(0x74, sysinfo);
     register_syscall!(0x7a, newuname);
     register_syscall!(0x193, clock_gettime64);
 }