Rearranged arch-specific directory hierarchy
[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[16];
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[1] = 0;
21         magic_mem[2] = (uintptr_t)magic_mem;
22         magic_mem[3] = syscall_num;
23         magic_mem[4] = arg0;
24         magic_mem[5] = arg1;
25         magic_mem[6] = arg2;
26         magic_mem[0] = 0x80;
27
28         // wait for front-end response
29         while(magic_mem[1] == 0)
30                 ;
31
32         magic_mem[0] = 0;
33
34         // wait for front-end ack
35         while(magic_mem[1] == 1)
36                 ;
37
38         ret = magic_mem[7];
39
40         spin_unlock_irqsave(&lock);
41
42         return ret;
43 }