Home | History | Annotate | Download | only in 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 call support for Plan 9
     10 //
     11 
     12 //func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err string)
     13 //func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err string)
     14 //func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
     15 //func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
     16 
     17 TEXT	Syscall(SB),NOSPLIT,$0-64
     18 	CALL	runtimeentersyscall(SB)
     19 	MOVQ	trap+0(FP), BP	// syscall entry
     20 	// slide args down on top of system call number
     21 	LEAQ	a1+8(FP), SI
     22 	LEAQ	trap+0(FP), DI
     23 	CLD
     24 	MOVSQ
     25 	MOVSQ
     26 	MOVSQ
     27 	SYSCALL
     28 	MOVQ	AX, r1+32(FP)
     29 	MOVQ	$0, r2+40(FP)
     30 	CMPL	AX, $-1
     31 	JNE	ok3
     32 
     33 	SUBQ	$16, SP
     34 	CALL	runtimeerrstr(SB)
     35 	MOVQ	SP, SI
     36 	ADDQ	$16, SP
     37 	JMP	copyresult3
     38 
     39 ok3:
     40 	LEAQ	emptystring(SB), SI
     41 
     42 copyresult3:
     43 	LEAQ	err+48(FP), DI
     44 
     45 	CLD
     46 	MOVSQ
     47 	MOVSQ
     48 
     49 	CALL	runtimeexitsyscall(SB)
     50 	RET
     51 
     52 TEXT	Syscall6(SB),NOSPLIT,$0-88
     53 	CALL	runtimeentersyscall(SB)
     54 	MOVQ	trap+0(FP), BP	// syscall entry
     55 	// slide args down on top of system call number
     56 	LEAQ	a1+8(FP), SI
     57 	LEAQ	trap+0(FP), DI
     58 	CLD
     59 	MOVSQ
     60 	MOVSQ
     61 	MOVSQ
     62 	MOVSQ
     63 	MOVSQ
     64 	MOVSQ
     65 	SYSCALL
     66 	MOVQ	AX, r1+56(FP)
     67 	MOVQ	$0, r2+64(FP)
     68 	CMPL	AX, $-1
     69 	JNE	ok4
     70 
     71 	SUBQ	$16, SP
     72 	CALL	runtimeerrstr(SB)
     73 	MOVQ	SP, SI
     74 	ADDQ	$16, SP
     75 	JMP	copyresult4
     76 
     77 ok4:
     78 	LEAQ	emptystring(SB), SI
     79 
     80 copyresult4:
     81 	LEAQ	err+72(FP), DI
     82 
     83 	CLD
     84 	MOVSQ
     85 	MOVSQ
     86 
     87 	CALL	runtimeexitsyscall(SB)
     88 	RET
     89 
     90 TEXT RawSyscall(SB),NOSPLIT,$0-56
     91 	MOVQ	trap+0(FP), BP	// syscall entry
     92 	// slide args down on top of system call number
     93 	LEAQ	a1+8(FP), SI
     94 	LEAQ	trap+0(FP), DI
     95 	CLD
     96 	MOVSQ
     97 	MOVSQ
     98 	MOVSQ
     99 	SYSCALL
    100 	MOVQ	AX, r1+32(FP)
    101 	MOVQ	AX, r2+40(FP)
    102 	MOVQ	AX, err+48(FP)
    103 	RET
    104 
    105 TEXT	RawSyscall6(SB),NOSPLIT,$0-80
    106 	MOVQ	trap+0(FP), BP	// syscall entry
    107 	// slide args down on top of system call number
    108 	LEAQ	a1+8(FP), SI
    109 	LEAQ	trap+0(FP), DI
    110 	CLD
    111 	MOVSQ
    112 	MOVSQ
    113 	MOVSQ
    114 	MOVSQ
    115 	MOVSQ
    116 	MOVSQ
    117 	SYSCALL
    118 	MOVQ	AX, r1+56(FP)
    119 	MOVQ	AX, r2+64(FP)
    120 	MOVQ	AX, err+72(FP)
    121 	RET
    122 
    123 #define SYS_SEEK 39	/* from zsysnum_plan9_amd64.go */
    124 
    125 //func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string)
    126 TEXT seek(SB),NOSPLIT,$0-56
    127 	LEAQ	newoffset+32(FP), AX
    128 	MOVQ	AX, placeholder+0(FP)
    129 
    130 	MOVQ	$SYS_SEEK, BP	// syscall entry
    131 	SYSCALL
    132 
    133 	CMPL	AX, $-1
    134 	JNE	ok6
    135 	MOVQ	$-1, newoffset+32(FP)
    136 
    137 	SUBQ	$16, SP
    138 	CALL	syscallerrstr(SB)
    139 	MOVQ	SP, SI
    140 	ADDQ	$16, SP
    141 	JMP	copyresult6
    142 
    143 ok6:
    144 	LEAQ	emptystring(SB), SI
    145 
    146 copyresult6:
    147 	LEAQ	err+40(FP), DI
    148 
    149 	CLD
    150 	MOVSQ
    151 	MOVSQ
    152 	RET
    153