...
Run Format

Text file src/syscall/asm_linux_arm.s

Documentation: syscall

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

View as plain text