Text file src/syscall/asm_plan9_amd64.s

     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  #define SYS_ERRSTR 41	/* from zsysnum_plan9.go */
    18  
    19  TEXT	·Syscall(SB),NOSPLIT,$168-64
    20  	NO_LOCAL_POINTERS
    21  	CALL	runtime·entersyscall<ABIInternal>(SB)
    22  	MOVQ	trap+0(FP), BP	// syscall entry
    23  	// copy args down
    24  	LEAQ	a1+8(FP), SI
    25  	LEAQ	sysargs-160(SP), DI
    26  	CLD
    27  	MOVSQ
    28  	MOVSQ
    29  	MOVSQ
    30  	SYSCALL
    31  	MOVQ	AX, r1+32(FP)
    32  	MOVQ	$0, r2+40(FP)
    33  	CMPL	AX, $-1
    34  	JNE	ok3
    35  
    36  	LEAQ	errbuf-128(SP), AX
    37  	MOVQ	AX, sysargs-160(SP)
    38  	MOVQ	$128, sysargs1-152(SP)
    39  	MOVQ	$SYS_ERRSTR, BP
    40  	SYSCALL
    41  	CALL	runtime·exitsyscall(SB) // call via ABI wrapper, ensuring ABIInternal fixed registers are set
    42  	MOVQ	sysargs-160(SP), AX
    43  	MOVQ	AX, errbuf-168(SP)
    44  	CALL	runtime·gostring(SB)
    45  	LEAQ	str-160(SP), SI
    46  	JMP	copyresult3
    47  
    48  ok3:
    49  	CALL	runtime·exitsyscall(SB) // call via ABI wrapper, ensuring ABIInternal fixed registers are set
    50  	LEAQ	·emptystring(SB), SI
    51  
    52  copyresult3:
    53  	LEAQ	err+48(FP), DI
    54  
    55  	CLD
    56  	MOVSQ
    57  	MOVSQ
    58  
    59  	RET
    60  
    61  TEXT	·Syscall6(SB),NOSPLIT,$168-88
    62  	NO_LOCAL_POINTERS
    63  	CALL	runtime·entersyscall<ABIInternal>(SB)
    64  	MOVQ	trap+0(FP), BP	// syscall entry
    65  	// copy args down
    66  	LEAQ	a1+8(FP), SI
    67  	LEAQ	sysargs-160(SP), DI
    68  	CLD
    69  	MOVSQ
    70  	MOVSQ
    71  	MOVSQ
    72  	MOVSQ
    73  	MOVSQ
    74  	MOVSQ
    75  	SYSCALL
    76  	MOVQ	AX, r1+56(FP)
    77  	MOVQ	$0, r2+64(FP)
    78  	CMPL	AX, $-1
    79  	JNE	ok4
    80  
    81  	LEAQ	errbuf-128(SP), AX
    82  	MOVQ	AX, sysargs-160(SP)
    83  	MOVQ	$128, sysargs1-152(SP)
    84  	MOVQ	$SYS_ERRSTR, BP
    85  	SYSCALL
    86  	CALL	runtime·exitsyscall(SB) // call via ABI wrapper, ensuring ABIInternal fixed registers are set
    87  	MOVQ	sysargs-160(SP), AX
    88  	MOVQ	AX, errbuf-168(SP)
    89  	CALL	runtime·gostring(SB)
    90  	LEAQ	str-160(SP), SI
    91  	JMP	copyresult4
    92  
    93  ok4:
    94  	CALL	runtime·exitsyscall(SB) // call via ABI wrapper, ensuring ABIInternal fixed registers are set
    95  	LEAQ	·emptystring(SB), SI
    96  
    97  copyresult4:
    98  	LEAQ	err+72(FP), DI
    99  
   100  	CLD
   101  	MOVSQ
   102  	MOVSQ
   103  
   104  	RET
   105  
   106  TEXT ·RawSyscall(SB),NOSPLIT,$0-56
   107  	MOVQ	trap+0(FP), BP	// syscall entry
   108  	// slide args down on top of system call number
   109  	LEAQ	a1+8(FP), SI
   110  	LEAQ	trap+0(FP), DI
   111  	CLD
   112  	MOVSQ
   113  	MOVSQ
   114  	MOVSQ
   115  	SYSCALL
   116  	MOVQ	AX, r1+32(FP)
   117  	MOVQ	AX, r2+40(FP)
   118  	MOVQ	AX, err+48(FP)
   119  	RET
   120  
   121  TEXT	·RawSyscall6(SB),NOSPLIT,$0-80
   122  	MOVQ	trap+0(FP), BP	// syscall entry
   123  	// slide args down on top of system call number
   124  	LEAQ	a1+8(FP), SI
   125  	LEAQ	trap+0(FP), DI
   126  	CLD
   127  	MOVSQ
   128  	MOVSQ
   129  	MOVSQ
   130  	MOVSQ
   131  	MOVSQ
   132  	MOVSQ
   133  	SYSCALL
   134  	MOVQ	AX, r1+56(FP)
   135  	MOVQ	AX, r2+64(FP)
   136  	MOVQ	AX, err+72(FP)
   137  	RET
   138  
   139  #define SYS_SEEK 39	/* from zsysnum_plan9.go */
   140  
   141  //func seek(placeholder uintptr, fd int, offset int64, whence int) (newoffset int64, err string)
   142  TEXT ·seek(SB),NOSPLIT,$48-56
   143  	NO_LOCAL_POINTERS
   144  	LEAQ	newoffset+32(FP), AX
   145  	MOVQ	AX, placeholder+0(FP)
   146  
   147  	// copy args down
   148  	LEAQ	placeholder+0(FP), SI
   149  	LEAQ	sysargs-40(SP), DI
   150  	CLD
   151  	MOVSQ
   152  	MOVSQ
   153  	MOVSQ
   154  	MOVSQ
   155  	MOVSQ
   156  	MOVQ	$SYS_SEEK, BP	// syscall entry
   157  	SYSCALL
   158  
   159  	CMPL	AX, $-1
   160  	JNE	ok6
   161  	MOVQ	AX, newoffset+32(FP)
   162  
   163  	CALL	syscall·errstr(SB)
   164  	MOVQ	SP, SI
   165  	JMP	copyresult6
   166  
   167  ok6:
   168  	LEAQ	·emptystring(SB), SI
   169  
   170  copyresult6:
   171  	LEAQ	err+40(FP), DI
   172  
   173  	CLD
   174  	MOVSQ
   175  	MOVSQ
   176  	RET
   177  

View as plain text