asm_unix_386.s raw

   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  //go:build freebsd || netbsd
   6  
   7  #include "textflag.h"
   8  #include "funcdata.h"
   9  
  10  //
  11  // System call support for some 386 unixes
  12  //
  13  
  14  // func Syscall(trap int32, a1, a2, a3 int32) (r1, r2, err int32);
  15  // func Syscall6(trap int32, a1, a2, a3, a4, a5, a6 int32) (r1, r2, err int32);
  16  // Trap # in AX, args on stack above caller pc.
  17  
  18  TEXT	·Syscall(SB),NOSPLIT,$0-28
  19  	CALL	runtime·entersyscall(SB)
  20  	MOVL	trap+0(FP), AX	// syscall entry
  21  	// slide args down on top of system call number
  22  	LEAL		a1+4(FP), SI
  23  	LEAL		trap+0(FP), DI
  24  	CLD
  25  	MOVSL
  26  	MOVSL
  27  	MOVSL
  28  	INT	$0x80
  29  	JAE	ok
  30  	MOVL	$-1, r1+16(FP)	// r1
  31  	MOVL	$-1, r2+20(FP)	// r2
  32  	MOVL	AX, err+24(FP)	// errno
  33  	CALL	runtime·exitsyscall(SB)
  34  	RET
  35  ok:
  36  	MOVL	AX, r1+16(FP)	// r1
  37  	MOVL	DX, r2+20(FP)	// r2
  38  	MOVL	$0, err+24(FP)	// errno
  39  	CALL	runtime·exitsyscall(SB)
  40  	RET
  41  
  42  TEXT	·Syscall6(SB),NOSPLIT,$0-40
  43  	CALL	runtime·entersyscall(SB)
  44  	MOVL	trap+0(FP), AX	// syscall entry
  45  	// slide args down on top of system call number
  46  	LEAL		a1+4(FP), SI
  47  	LEAL		trap+0(FP), DI
  48  	CLD
  49  	MOVSL
  50  	MOVSL
  51  	MOVSL
  52  	MOVSL
  53  	MOVSL
  54  	MOVSL
  55  	INT	$0x80
  56  	JAE	ok6
  57  	MOVL	$-1, r1+28(FP)	// r1
  58  	MOVL	$-1, r2+32(FP)	// r2
  59  	MOVL	AX, err+36(FP)	// errno
  60  	CALL	runtime·exitsyscall(SB)
  61  	RET
  62  ok6:
  63  	MOVL	AX, r1+28(FP)	// r1
  64  	MOVL	DX, r2+32(FP)	// r2
  65  	MOVL	$0, err+36(FP)	// errno
  66  	CALL	runtime·exitsyscall(SB)
  67  	RET
  68  
  69  TEXT	·Syscall9(SB),NOSPLIT,$0-52
  70  	CALL	runtime·entersyscall(SB)
  71  	MOVL	num+0(FP), AX	// syscall entry
  72  	// slide args down on top of system call number
  73  	LEAL		a1+4(FP), SI
  74  	LEAL		num+0(FP), DI
  75  	CLD
  76  	MOVSL
  77  	MOVSL
  78  	MOVSL
  79  	MOVSL
  80  	MOVSL
  81  	MOVSL
  82  	MOVSL
  83  	MOVSL
  84  	MOVSL
  85  	INT	$0x80
  86  	JAE	ok9
  87  	MOVL	$-1, r1+40(FP)	// r1
  88  	MOVL	$-1, r2+44(FP)	// r2
  89  	MOVL	AX, err+48(FP)	// errno
  90  	CALL	runtime·exitsyscall(SB)
  91  	RET
  92  ok9:
  93  	MOVL	AX, r1+40(FP)	// r1
  94  	MOVL	DX, r2+44(FP)	// r2
  95  	MOVL	$0, err+48(FP)	// errno
  96  	CALL	runtime·exitsyscall(SB)
  97  	RET
  98  
  99  TEXT ·RawSyscall(SB),NOSPLIT,$0-28
 100  	MOVL	trap+0(FP), AX	// syscall entry
 101  	// slide args down on top of system call number
 102  	LEAL		a1+4(FP), SI
 103  	LEAL		trap+0(FP), DI
 104  	CLD
 105  	MOVSL
 106  	MOVSL
 107  	MOVSL
 108  	INT	$0x80
 109  	JAE	ok1
 110  	MOVL	$-1, r1+16(FP)	// r1
 111  	MOVL	$-1, r2+20(FP)	// r2
 112  	MOVL	AX, err+24(FP)	// errno
 113  	RET
 114  ok1:
 115  	MOVL	AX, r1+16(FP)	// r1
 116  	MOVL	DX, r2+20(FP)	// r2
 117  	MOVL	$0, err+24(FP)	// errno
 118  	RET
 119  
 120  TEXT	·RawSyscall6(SB),NOSPLIT,$0-40
 121  	MOVL	trap+0(FP), AX	// syscall entry
 122  	// slide args down on top of system call number
 123  	LEAL		a1+4(FP), SI
 124  	LEAL		trap+0(FP), DI
 125  	CLD
 126  	MOVSL
 127  	MOVSL
 128  	MOVSL
 129  	MOVSL
 130  	MOVSL
 131  	MOVSL
 132  	INT	$0x80
 133  	JAE	ok2
 134  	MOVL	$-1, r1+28(FP)	// r1
 135  	MOVL	$-1, r2+32(FP)	// r2
 136  	MOVL	AX, err+36(FP)	// errno
 137  	RET
 138  ok2:
 139  	MOVL	AX, r1+28(FP)	// r1
 140  	MOVL	DX, r2+32(FP)	// r2
 141  	MOVL	$0, err+36(FP)	// errno
 142  	RET
 143