|
|
@ -129,8 +129,17 @@ fn timer() {
|
|
|
|
|
|
|
|
|
|
|
|
fn syscall(tf: &mut TrapFrame) {
|
|
|
|
fn syscall(tf: &mut TrapFrame) {
|
|
|
|
tf.epc += 4; // Must before syscall, because of fork.
|
|
|
|
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);
|
|
|
|
let arguments = [tf.a0, tf.a1, tf.a2, tf.a3, tf.t0, tf.t1];
|
|
|
|
tf.v0 = ret as usize;
|
|
|
|
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) {
|
|
|
|
fn page_fault(tf: &mut TrapFrame) {
|
|
|
|