Use MIPS N32 abi for syscall handling

Signed-off-by: Harry Chen <i@harrychen.xyz>
toolchain_update
Harry Chen 6 years ago
parent 9d576b4827
commit a0f298f6dd

@ -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) {

@ -1 +1 @@
Subproject commit a460c5b32744292ed50922a159fa22c830aa61b9
Subproject commit 23cfbb6565377ee88ad0cec3c1fcd3a090ee88c6
Loading…
Cancel
Save