summaryrefslogtreecommitdiff
path: root/src/internal/ppc/syscall.S
blob: e56abc6f821e0a5facb40686f8d6295fa27127a7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/asm.h>
        .global __syscall
        .type   __syscall,@function
__syscall:
        mflr    r0
        stw     r0, -4(r1)              // Save the return address.
        mr      r0, r3                  // Save the system call number
        mr      r3, r4                  // Shift the arguments: arg1
        mr      r4, r5                  // arg2
        mr      r5, r6                  // arg3
        mr      r6, r7                  // arg4
        mr      r7, r8                  // arg5
        mr      r8, r9                  // arg6
        sc
        mfcr    r0                      // Check for an error
        rlwinm  r4, r0, r0, 3, 3        // by checking for bit 28.
        cmplwi  r0, r4, 0               // It is an error if non-zero.
        beq     r0, 1f                  // Jump if not an error.
        neg     r3, r3                  // Negate the error number.
1:      lwz     r0, -4(r1)              // Restore the return address.
        mtlr    r0
	blr
        .end    __syscall
        .size   __syscall, .-__syscall