github.com/varialus/godfly@v0.0.0-20130904042352-1934f9f095ab/src/pkg/syscall/asm_linux_arm.s (about)

     1  // Copyright 2009 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  
     5  #include "../../cmd/ld/textflag.h"
     6  
     7  //
     8  // System calls for arm, Linux
     9  //
    10  
    11  // TODO(kaib): handle error returns
    12  
    13  // func Syscall(syscall uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
    14  
    15  TEXT	·Syscall(SB),NOSPLIT,$0-28
    16  	BL		runtime·entersyscall(SB)
    17  	MOVW	4(SP), R7
    18  	MOVW	8(SP), R0
    19  	MOVW	12(SP), R1
    20  	MOVW	16(SP), R2
    21  	SWI		$0
    22  	MOVW	$0xfffff001, R1
    23  	CMP		R1, R0
    24  	BLS		ok
    25  	MOVW	$-1, R1
    26  	MOVW	R1, 20(SP)	// r1
    27  	MOVW	$0, R2
    28  	MOVW	R2, 24(SP)	// r2
    29  	RSB		$0, R0, R0
    30  	MOVW	R0, 28(SP)	// errno
    31  	BL		runtime·exitsyscall(SB)
    32  	RET
    33  ok:
    34  	MOVW	R0, 20(SP) // r1
    35  	MOVW	$0, R0
    36  	MOVW	R0, 24(SP)	// r2
    37  	MOVW	R0, 28(SP)	// errno
    38  	BL		runtime·exitsyscall(SB)
    39  	RET
    40  
    41  // func Syscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
    42  // Actually Syscall5 but the rest of the code expects it to be named Syscall6.
    43  TEXT	·Syscall6(SB),NOSPLIT,$0-40
    44  	BL		runtime·entersyscall(SB)
    45  	MOVW	4(SP), R7	// syscall entry
    46  	MOVW	8(SP), R0
    47  	MOVW	12(SP), R1
    48  	MOVW	16(SP), R2
    49  	MOVW	20(SP), R3
    50  	MOVW	24(SP), R4
    51  	MOVW	28(SP), R5
    52  	SWI		$0
    53  	MOVW	$0xfffff001, R6
    54  	CMP		R6, R0
    55  	BLS		ok6
    56  	MOVW	$-1, R1
    57  	MOVW	R1, 32(SP)	// r1
    58  	MOVW	$0, R2
    59  	MOVW	R2, 36(SP)	// r2
    60  	RSB		$0, R0, R0
    61  	MOVW	R0, 40(SP)	// errno
    62  	BL		runtime·exitsyscall(SB)
    63  	RET
    64  ok6:
    65  	MOVW	R0, 32(SP) // r1
    66  	MOVW	R1, 36(SP)	// r2
    67  	MOVW	$0, R0
    68  	MOVW	R0, 40(SP)	// errno
    69  	BL		runtime·exitsyscall(SB)
    70  	RET
    71  
    72  // func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
    73  // Actually RawSyscall5 but the rest of the code expects it to be named RawSyscall6.
    74  TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
    75  	MOVW	4(SP), R7	// syscall entry
    76  	MOVW	8(SP), R0
    77  	MOVW	12(SP), R1
    78  	MOVW	16(SP), R2
    79  	MOVW	20(SP), R3
    80  	MOVW	24(SP), R4
    81  	MOVW	28(SP), R5
    82  	SWI		$0
    83  	MOVW	$0xfffff001, R6
    84  	CMP		R6, R0
    85  	BLS		ok2
    86  	MOVW	$-1, R1
    87  	MOVW	R1, 32(SP)	// r1
    88  	MOVW	$0, R2
    89  	MOVW	R2, 36(SP)	// r2
    90  	RSB		$0, R0, R0
    91  	MOVW	R0, 40(SP)	// errno
    92  	RET
    93  ok2:
    94  	MOVW	R0, 32(SP) // r1
    95  	MOVW	R1, 36(SP)	// r2
    96  	MOVW	$0, R0
    97  	MOVW	R0, 40(SP)	// errno
    98  	RET
    99  
   100  #define SYS__LLSEEK 140  /* from zsysnum_linux_arm.go */
   101  // func Seek(fd int, offset int64, whence int) (newoffset int64, errno int)
   102  // Implemented in assembly to avoid allocation when
   103  // taking the address of the return value newoffset.
   104  // Underlying system call is
   105  //	llseek(int fd, int offhi, int offlo, int64 *result, int whence)
   106  TEXT ·Seek(SB),NOSPLIT,$0-32
   107  	BL	runtime·entersyscall(SB)
   108  	MOVW	$SYS__LLSEEK, R7	// syscall entry
   109  	MOVW	4(SP), R0	// fd
   110  	MOVW	12(SP), R1	// offset-high
   111  	MOVW	8(SP), R2	// offset-low
   112  	MOVW	$20(SP), R3
   113  	MOVW	16(SP), R4	// whence
   114  	SWI	$0
   115  	MOVW	$0xfffff001, R6
   116  	CMP	R6, R0
   117  	BLS	okseek
   118  	MOVW	$0, R1
   119  	MOVW	R1, 20(SP)
   120  	MOVW	R1, 24(SP)
   121  	RSB	$0, R0, R0
   122  	MOVW	R0, 28(SP)	// errno
   123  	BL	runtime·exitsyscall(SB)
   124  	RET
   125  okseek:
   126  	// system call filled in newoffset already
   127  	MOVW	$0, R0
   128  	MOVW	R0, 28(SP)	// errno
   129  	BL	runtime·exitsyscall(SB)
   130  	RET	
   131  
   132  // func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
   133  TEXT ·RawSyscall(SB),NOSPLIT,$0-28
   134  	MOVW	4(SP), R7	// syscall entry
   135  	MOVW	8(SP), R0
   136  	MOVW	12(SP), R1
   137  	MOVW	16(SP), R2
   138  	SWI		$0
   139  	MOVW	$0xfffff001, R1
   140  	CMP		R1, R0
   141  	BLS		ok1
   142  	MOVW	$-1, R1
   143  	MOVW	R1, 20(SP)	// r1
   144  	MOVW	$0, R2
   145  	MOVW	R2, 24(SP)	// r2
   146  	RSB		$0, R0, R0
   147  	MOVW	R0, 28(SP)	// errno
   148  	RET
   149  ok1:
   150  	MOVW	R0, 20(SP) // r1
   151  	MOVW	$0, R0
   152  	MOVW	R0, 24(SP)	// r2
   153  	MOVW	R0, 28(SP)	// errno
   154  	RET
   155