diff --git a/kernel/src/arch/mipsel/interrupt.rs b/kernel/src/arch/mipsel/interrupt.rs index f0b3128..d85539e 100644 --- a/kernel/src/arch/mipsel/interrupt.rs +++ b/kernel/src/arch/mipsel/interrupt.rs @@ -129,8 +129,17 @@ fn timer() { fn syscall(tf: &mut TrapFrame) { tf.epc += 4; // Must before syscall, because of fork. - let ret = crate::syscall::syscall(tf.t0, [tf.a0, tf.a1, tf.a2, tf.a3, tf.s0, tf.s1], tf); - tf.v0 = ret as usize; + let arguments = [tf.a0, tf.a1, tf.a2, tf.a3, tf.t0, tf.t1]; + trace!("MIPS syscall {} invoked with {:?}", tf.v0, arguments); + + let ret = crate::syscall::syscall(tf.v0, arguments, tf); + let ret = tf.v0 as isize; + // comply with mips n32 abi, always return a positive value + // https://git.musl-libc.org/cgit/musl/tree/arch/mipsn32/syscall_arch.h + if (ret < 0) { + tf.v0 = (-ret) as usize; + tf.a3 = 1; + } } fn page_fault(tf: &mut TrapFrame) { diff --git a/user b/user index a460c5b..23cfbb6 160000 --- a/user +++ b/user @@ -1 +1 @@ -Subproject commit a460c5b32744292ed50922a159fa22c830aa61b9 +Subproject commit 23cfbb6565377ee88ad0cec3c1fcd3a090ee88c6