unbroke sparc front-end server protocol
authorAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Fri, 7 Aug 2009 19:57:20 +0000 (12:57 -0700)
committerAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Fri, 7 Aug 2009 19:57:20 +0000 (12:57 -0700)
kern/arch/sparc/frontend.c

index f0fe759..eb9267a 100644 (file)
@@ -4,7 +4,7 @@
 #pragma nodeputy
 #endif
 
-volatile int magic_mem[16];
+volatile int magic_mem[8] __attribute__((align(32)));
 
 int32_t frontend_syscall(int32_t syscall_num, uint32_t arg0, uint32_t arg1, uint32_t arg2)
 {
@@ -17,25 +17,24 @@ int32_t frontend_syscall(int32_t syscall_num, uint32_t arg0, uint32_t arg1, uint
        spin_lock_irqsave(&lock);
 
        // write syscall into magic memory
-       magic_mem[1] = 0;
-       magic_mem[2] = (uintptr_t)magic_mem;
-       magic_mem[3] = syscall_num;
-       magic_mem[4] = arg0;
-       magic_mem[5] = arg1;
-       magic_mem[6] = arg2;
+       magic_mem[7] = 0;
+       magic_mem[1] = syscall_num;
+       magic_mem[2] = arg0;
+       magic_mem[3] = arg1;
+       magic_mem[4] = arg2;
        magic_mem[0] = 0x80;
 
        // wait for front-end response
-       while(magic_mem[1] == 0)
+       while(magic_mem[7] == 0)
                ;
 
        magic_mem[0] = 0;
 
        // wait for front-end ack
-       while(magic_mem[1] == 1)
+       while(magic_mem[7] == 1)
                ;
 
-       ret = magic_mem[7];
+       ret = magic_mem[1];
 
        spin_unlock_irqsave(&lock);