Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 1 | // Copyright 2013 The Go Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Rob Pike | 8bca148 | 2014-08-12 17:04:45 -0700 | [diff] [blame] | 5 | #include "textflag.h" |
Russ Cox | 860a645 | 2014-09-12 00:55:24 -0400 | [diff] [blame] | 6 | #include "funcdata.h" |
Keith Randall | db324cc | 2013-08-12 10:24:30 -0700 | [diff] [blame] | 7 | |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 8 | // |
| 9 | // System call support for ARM, NetBSD |
| 10 | // |
| 11 | |
| 12 | // func Syscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32); |
| 13 | // func Syscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32); |
| 14 | // func Syscall9(trap int32, a1, a2, a3, a4, a5, a6, a7, a8, a9 int64) (r1, r2, err int32) |
| 15 | |
Keith Randall | db324cc | 2013-08-12 10:24:30 -0700 | [diff] [blame] | 16 | TEXT ·Syscall(SB),NOSPLIT,$0-28 |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 17 | BL runtime·entersyscall(SB) |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 18 | MOVW trap+0(FP), R0 // sigcall num |
| 19 | MOVW a1+4(FP), R1 // a1 |
| 20 | MOVW a2+8(FP), R2 // a2 |
| 21 | MOVW a3+12(FP), R3 // a3 |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 22 | SWI $0 // syscall |
| 23 | MOVW $0, R2 |
| 24 | BCS error |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 25 | MOVW R0, r1+16(FP) // r1 |
| 26 | MOVW R1, r2+20(FP) // r2 |
| 27 | MOVW R2, err+24(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 28 | BL runtime·exitsyscall(SB) |
| 29 | RET |
| 30 | error: |
| 31 | MOVW $-1, R3 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 32 | MOVW R3, r1+16(FP) // r1 |
| 33 | MOVW R2, r2+20(FP) // r2 |
| 34 | MOVW R0, err+24(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 35 | BL runtime·exitsyscall(SB) |
| 36 | RET |
| 37 | |
Keith Randall | db324cc | 2013-08-12 10:24:30 -0700 | [diff] [blame] | 38 | TEXT ·Syscall6(SB),NOSPLIT,$0-40 |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 39 | BL runtime·entersyscall(SB) |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 40 | MOVW trap+0(FP), R0 // sigcall num |
| 41 | MOVW a1+4(FP), R1 // a1 |
| 42 | MOVW a2+8(FP), R2 // a2 |
| 43 | MOVW a3+12(FP), R3 // a3 |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 44 | MOVW R13, R4 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 45 | MOVW $a4+16(FP), R13 // a4 to a6 are passed on stack |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 46 | SWI $0 // syscall |
| 47 | MOVW R4, R13 |
| 48 | MOVW $0, R2 |
| 49 | BCS error6 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 50 | MOVW R0, r1+28(FP) // r1 |
| 51 | MOVW R1, r2+32(FP) // r2 |
| 52 | MOVW R2, err+36(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 53 | BL runtime·exitsyscall(SB) |
| 54 | RET |
| 55 | error6: |
| 56 | MOVW $-1, R3 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 57 | MOVW R3, r1+28(FP) // r1 |
| 58 | MOVW R2, r2+32(FP) // r2 |
| 59 | MOVW R0, err+36(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 60 | BL runtime·exitsyscall(SB) |
| 61 | RET |
| 62 | |
Keith Randall | db324cc | 2013-08-12 10:24:30 -0700 | [diff] [blame] | 63 | TEXT ·Syscall9(SB),NOSPLIT,$0-52 |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 64 | BL runtime·entersyscall(SB) |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 65 | MOVW trap+0(FP), R0 // sigcall num |
| 66 | MOVW a1+4(FP), R1 // a1 |
| 67 | MOVW a2+8(FP), R2 // a2 |
| 68 | MOVW a3+12(FP), R3 // a3 |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 69 | MOVW R13, R4 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 70 | MOVW $a4+16(FP), R13 // a4 to a9 are passed on stack |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 71 | SWI $0 // syscall |
| 72 | MOVW R4, R13 |
| 73 | MOVW $0, R2 |
| 74 | BCS error9 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 75 | MOVW R0, r1+40(FP) // r1 |
| 76 | MOVW R1, r2+44(FP) // r2 |
| 77 | MOVW R2, err+48(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 78 | BL runtime·exitsyscall(SB) |
| 79 | RET |
| 80 | error9: |
| 81 | MOVW $-1, R3 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 82 | MOVW R3, r1+40(FP) // r1 |
| 83 | MOVW R2, r2+44(FP) // r2 |
| 84 | MOVW R0, err+48(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 85 | BL runtime·exitsyscall(SB) |
| 86 | RET |
| 87 | |
Keith Randall | db324cc | 2013-08-12 10:24:30 -0700 | [diff] [blame] | 88 | TEXT ·RawSyscall(SB),NOSPLIT,$0-28 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 89 | MOVW trap+0(FP), R0 // sigcall num |
| 90 | MOVW a1+4(FP), R1 // a1 |
| 91 | MOVW a2+8(FP), R2 // a2 |
| 92 | MOVW a3+12(FP), R3 // a3 |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 93 | SWI $0 // syscall |
| 94 | MOVW $0, R2 |
| 95 | BCS errorr |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 96 | MOVW R0, r1+16(FP) // r1 |
| 97 | MOVW R1, r2+20(FP) // r2 |
| 98 | MOVW R2, err+24(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 99 | RET |
| 100 | errorr: |
| 101 | MOVW $-1, R3 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 102 | MOVW R3, r1+16(FP) // r1 |
| 103 | MOVW R2, r2+20(FP) // r2 |
| 104 | MOVW R0, err+24(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 105 | RET |
| 106 | |
Keith Randall | db324cc | 2013-08-12 10:24:30 -0700 | [diff] [blame] | 107 | TEXT ·RawSyscall6(SB),NOSPLIT,$0-40 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 108 | MOVW trap+0(FP), R0 // sigcall num |
| 109 | MOVW a1+4(FP), R1 // a1 |
| 110 | MOVW a2+8(FP), R2 // a2 |
| 111 | MOVW a3+12(FP), R3 // a3 |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 112 | MOVW R13, R4 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 113 | MOVW $a4+16(FP), R13 // a4 to a9 are passed on stack |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 114 | SWI $0 // syscall |
| 115 | MOVW R4, R13 |
| 116 | MOVW $0, R2 |
| 117 | BCS errorr6 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 118 | MOVW R0, r1+28(FP) // r1 |
| 119 | MOVW R1, r2+32(FP) // r2 |
| 120 | MOVW R2, err+36(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 121 | RET |
| 122 | errorr6: |
| 123 | MOVW $-1, R3 |
Russ Cox | c72a211 | 2015-02-23 10:56:10 -0500 | [diff] [blame] | 124 | MOVW R3, r1+28(FP) // r1 |
| 125 | MOVW R2, r2+32(FP) // r2 |
| 126 | MOVW R0, err+36(FP) // err |
Shenghou Ma | 8311697 | 2013-02-13 01:03:25 +0800 | [diff] [blame] | 127 | RET |