Fixes sparc syscall interface (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 14 Apr 2011 22:28:45 +0000 (15:28 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:36:01 +0000 (17:36 -0700)
Sparc wasn't passing the actual syscall*.  This also fixes up the ghetto
numbering (a0 in userspace being a1 in the kernel), as well as trimming
ros_arch_syscall down to the two needed parameters.

You ought to rebuild your sparc cross compiler.

kern/arch/sparc/ros/syscall.h
kern/arch/sparc/trap.c

index 5ceb86d..9644df9 100644 (file)
@@ -6,17 +6,12 @@
 #include <errno.h>
 
 static inline long __attribute__((always_inline))
-__ros_arch_syscall(long _num, long _a0)
+__ros_arch_syscall(long _a0, long _a1)
 {
-       /* The args are slightly ghetto, but I don't want to fuck with sparc too
-        * much. */
-       register long num asm("g1") = _num;
-       register long a0 asm("o0") = _a0, a1 asm("o1") = 0;
-       register long a2 asm("o2") = 0,   a3 asm("o3") = 0;
-       register long a4 asm("o4") = 0;
+       register long a0 asm("g1") = _a0;
+       register long a1 asm("o0") = _a1;
 
-       asm volatile("ta 8" : "=r"(a0),"=r"(a1)
-                    : "r"(num),"0"(a0),"1"(a1),"r"(a2),"r"(a3),"r"(a4));
+       asm volatile("ta 8" : "=r"(a0) : "0"(a0),"r"(a1) : "memory");
 
        return a0;
 }
index 3b48bdd..1c4519d 100644 (file)
@@ -467,12 +467,8 @@ void
 handle_syscall(trapframe_t* state)
 {
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
-       uint32_t num = state->gpr[1];
+       uint32_t a0 = state->gpr[1];
        uint32_t a1 = state->gpr[8];
-       uint32_t a2 = state->gpr[9];
-       uint32_t a3 = state->gpr[10];
-       uint32_t a4 = state->gpr[11];
-       uint32_t a5 = state->gpr[12];
 
        advance_pc(state);
        enable_irq();
@@ -480,7 +476,7 @@ handle_syscall(trapframe_t* state)
 
        set_current_tf(pcpui, &state);
 
-       prep_syscalls(current, (struct syscall*)a1, a2);
+       prep_syscalls(current, (struct syscall*)a0, a1);
 
        proc_restartcore();
 }