Browse Source

feat: blank impl for getrusage and madvise

greatbridf 3 months ago
parent
commit
ac2cb64f02
4 changed files with 65 additions and 4 deletions
  1. 1 1
      Makefile.src
  2. 7 0
      src/kernel/syscall/mm.rs
  3. 54 0
      src/kernel/syscall/procops.rs
  4. 3 3
      src/kernel/syscall/sysinfo.rs

+ 1 - 1
Makefile.src

@@ -62,7 +62,7 @@ tmux-debug:
 	-tmux attach -t gbos-debug
 	tmux kill-session -t gbos-debug
 
-build/fs.img:
+build/fs.img: init_script.sh
 	sh script/build-img.sh
 
 build/boot.img: build/fs.img build/mbr_hole.bin

+ 7 - 0
src/kernel/syscall/mm.rs

@@ -108,8 +108,14 @@ impl MapArgument<'_, UserMmapFlags> for MapArgumentImpl {
     }
 }
 
+#[allow(unused_variables)]
+fn do_madvise(addr: usize, len: usize, advice: u32) -> KResult<()> {
+    Ok(())
+}
+
 define_syscall32!(sys_brk, do_brk, addr: usize);
 define_syscall32!(sys_munmap, do_munmap, addr: usize, len: usize);
+define_syscall32!(sys_madvise, do_madvise, addr: usize, len: usize, advice: u32);
 define_syscall32!(sys_mmap_pgoff, do_mmap_pgoff,
     addr: usize, len: usize,
     prot: UserMmapProtocol,
@@ -120,4 +126,5 @@ pub(super) fn register() {
     register_syscall!(0x2d, brk);
     register_syscall!(0x5b, munmap);
     register_syscall!(0xc0, mmap_pgoff);
+    register_syscall!(0xdb, madvise);
 }

+ 54 - 0
src/kernel/syscall/procops.rs

@@ -22,6 +22,7 @@ use crate::{kernel::user::dataflow::UserBuffer, prelude::*};
 
 use crate::kernel::vfs::{self, FsContext};
 
+use super::sysinfo::TimeVal;
 use super::{define_syscall32, register_syscall};
 
 fn do_umask(mask: u32) -> KResult<u32> {
@@ -484,6 +485,57 @@ fn do_getrlimit(resource: u32, rlimit: *mut RLimit) -> KResult<()> {
     do_prlimit64(0, resource, core::ptr::null(), rlimit)
 }
 
+#[repr(C)]
+#[derive(Clone, Copy)]
+struct RUsage {
+    ru_utime: TimeVal,
+    ru_stime: TimeVal,
+    ru_maxrss: u32,
+    ru_ixrss: u32,
+    ru_idrss: u32,
+    ru_isrss: u32,
+    ru_minflt: u32,
+    ru_majflt: u32,
+    ru_nswap: u32,
+    ru_inblock: u32,
+    ru_oublock: u32,
+    ru_msgsnd: u32,
+    ru_msgrcv: u32,
+    ru_nsignals: u32,
+    ru_nvcsw: u32,
+    ru_nivcsw: u32,
+}
+
+fn do_getrusage(who: u32, rusage: *mut RUsage) -> KResult<()> {
+    println_debug!("getrusage({}, {:?})", who, rusage);
+
+    if who != 0 {
+        return Err(ENOSYS);
+    }
+
+    let rusage = UserPointerMut::new(rusage)?;
+    rusage.write(RUsage {
+        ru_utime: TimeVal::default(),
+        ru_stime: TimeVal::default(),
+        ru_maxrss: 0,
+        ru_ixrss: 0,
+        ru_idrss: 0,
+        ru_isrss: 0,
+        ru_minflt: 0,
+        ru_majflt: 0,
+        ru_nswap: 0,
+        ru_inblock: 0,
+        ru_oublock: 0,
+        ru_msgsnd: 0,
+        ru_msgrcv: 0,
+        ru_nsignals: 0,
+        ru_nvcsw: 0,
+        ru_nivcsw: 0,
+    })?;
+
+    Ok(())
+}
+
 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);
@@ -515,6 +567,7 @@ define_syscall32!(sys_rt_sigaction, do_rt_sigaction,
 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);
+define_syscall32!(sys_getrusage, do_getrusage, who: u32, rlimit: *mut RUsage);
 
 fn sys_vfork(int_stack: &mut InterruptContext, ext: &mut ExtendedContext) -> usize {
     sys_fork(int_stack, ext)
@@ -557,6 +610,7 @@ pub(super) fn register() {
     register_syscall!(0x3c, umask);
     register_syscall!(0x40, getppid);
     register_syscall!(0x42, setsid);
+    register_syscall!(0x4d, getrusage);
     register_syscall!(0x72, wait4);
     register_syscall!(0x77, sigreturn);
     register_syscall!(0x84, getpgid);

+ 3 - 3
src/kernel/syscall/sysinfo.rs

@@ -50,15 +50,15 @@ fn do_newuname(buffer: *mut NewUTSName) -> KResult<()> {
 }
 
 #[allow(dead_code)]
-#[derive(Clone, Copy)]
-struct TimeVal {
+#[derive(Default, Clone, Copy)]
+pub struct TimeVal {
     sec: u64,
     usec: u64,
 }
 
 #[allow(dead_code)]
 #[derive(Clone, Copy)]
-struct TimeSpec {
+pub struct TimeSpec {
     sec: u64,
     nsec: u64,
 }