1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
/*
* system call will look like:
* ld r10, r31, 32; r10,r11,r12 might be garbage.
* ld r11, r31, 36
* ld r12, r31, 40
* or r13, r0, <code>
* tb0 0, r0, <128> <- xip
* br err <- nip
* jmp r1 <- fip
* err: or.u r3, r0, hi16(errno)
* st r2, r3, lo16(errno)
* subu r2, r0, 1
* jmp r1
*
* So, when we take syscall trap, sxip/snip/sfip will be as
* shown above.
* Given this,
* 1. If the system call returned 0, need to skip nip.
* nip = fip, fip += 4
* (doesn't matter what fip + 4 will be but we will never
* execute this since jmp r1 at nip will change the execution flow.)
* 2. If the system call returned an errno > 0, plug the value
* in r2, and leave nip and fip unchanged. This will have us
* executing "br err" on return to user space.
* 3. If the system call code returned ERESTART or EJUSTRETURN,
* we need to rexecute the trap instruction. Back up the pipe
* line.
* fip = nip, nip = xip
*/
|