unbroke sparc front-end server protocol
[akaros.git] / kern / arch / sparc / frontend.c
1 #include <atomic.h>
2
3 #ifdef __DEPUTY__
4 #pragma nodeputy
5 #endif
6
7 volatile int magic_mem[8] __attribute__((align(32)));
8
9 int32_t frontend_syscall(int32_t syscall_num, uint32_t arg0, uint32_t arg1, uint32_t arg2)
10 {
11         static spinlock_t lock = 0;
12         int32_t ret;
13
14         // only one frontend request at a time.
15         // interrupts could try to do frontend requests,
16         // which would deadlock, so disable them
17         spin_lock_irqsave(&lock);
18
19         // write syscall into magic memory
20         magic_mem[7] = 0;
21         magic_mem[1] = syscall_num;
22         magic_mem[2] = arg0;
23         magic_mem[3] = arg1;
24         magic_mem[4] = arg2;
25         magic_mem[0] = 0x80;
26
27         // wait for front-end response
28         while(magic_mem[7] == 0)
29                 ;
30
31         magic_mem[0] = 0;
32
33         // wait for front-end ack
34         while(magic_mem[7] == 1)
35                 ;
36
37         ret = magic_mem[1];
38
39         spin_unlock_irqsave(&lock);
40
41         return ret;
42 }