| Jeff Dike | 54ae36f | 2007-10-16 01:27:33 -0700 | [diff] [blame] | 1 | #include "as-layout.h" | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 2 |  | 
|  | 3 | .globl syscall_stub | 
| Amerigo Wang | 276c974 | 2009-06-16 15:33:30 -0700 | [diff] [blame] | 4 | .section .__syscall_stub, "ax" | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 5 | syscall_stub: | 
|  | 6 | syscall | 
|  | 7 | /* We don't have 64-bit constants, so this constructs the address | 
|  | 8 | * we need. | 
|  | 9 | */ | 
| Jeff Dike | 4bdf8bc | 2008-02-04 22:30:44 -0800 | [diff] [blame] | 10 | movq	$(STUB_DATA >> 32), %rbx | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 11 | salq	$32, %rbx | 
| Jeff Dike | 4bdf8bc | 2008-02-04 22:30:44 -0800 | [diff] [blame] | 12 | movq	$(STUB_DATA & 0xffffffff), %rcx | 
| Jeff Dike | d67b569 | 2005-07-07 17:56:49 -0700 | [diff] [blame] | 13 | or	%rcx, %rbx | 
|  | 14 | movq	%rax, (%rbx) | 
|  | 15 | int3 | 
| Jeff Dike | c560049 | 2005-09-03 15:57:36 -0700 | [diff] [blame] | 16 |  | 
|  | 17 | .globl batch_syscall_stub | 
|  | 18 | batch_syscall_stub: | 
| Jeff Dike | 4bdf8bc | 2008-02-04 22:30:44 -0800 | [diff] [blame] | 19 | mov	$(STUB_DATA >> 32), %rbx | 
| Bodo Stroesser | 07bf731 | 2005-09-03 15:57:50 -0700 | [diff] [blame] | 20 | sal	$32, %rbx | 
| Jeff Dike | 4bdf8bc | 2008-02-04 22:30:44 -0800 | [diff] [blame] | 21 | mov	$(STUB_DATA & 0xffffffff), %rax | 
| Bodo Stroesser | 07bf731 | 2005-09-03 15:57:50 -0700 | [diff] [blame] | 22 | or	%rax, %rbx | 
|  | 23 | /* load pointer to first operation */ | 
|  | 24 | mov	%rbx, %rsp | 
|  | 25 | add	$0x10, %rsp | 
|  | 26 | again: | 
|  | 27 | /* load length of additional data */ | 
|  | 28 | mov	0x0(%rsp), %rax | 
|  | 29 |  | 
|  | 30 | /* if(length == 0) : end of list */ | 
|  | 31 | /* write possible 0 to header */ | 
|  | 32 | mov	%rax, 8(%rbx) | 
|  | 33 | cmp	$0, %rax | 
|  | 34 | jz	done | 
|  | 35 |  | 
|  | 36 | /* save current pointer */ | 
|  | 37 | mov	%rsp, 8(%rbx) | 
|  | 38 |  | 
|  | 39 | /* skip additional data */ | 
|  | 40 | add	%rax, %rsp | 
|  | 41 |  | 
|  | 42 | /* load syscall-# */ | 
|  | 43 | pop	%rax | 
|  | 44 |  | 
|  | 45 | /* load syscall params */ | 
| Jeff Dike | c560049 | 2005-09-03 15:57:36 -0700 | [diff] [blame] | 46 | pop	%rdi | 
|  | 47 | pop	%rsi | 
|  | 48 | pop	%rdx | 
|  | 49 | pop	%r10 | 
|  | 50 | pop	%r8 | 
|  | 51 | pop	%r9 | 
| Bodo Stroesser | 07bf731 | 2005-09-03 15:57:50 -0700 | [diff] [blame] | 52 |  | 
|  | 53 | /* execute syscall */ | 
| Jeff Dike | c560049 | 2005-09-03 15:57:36 -0700 | [diff] [blame] | 54 | syscall | 
| Bodo Stroesser | 07bf731 | 2005-09-03 15:57:50 -0700 | [diff] [blame] | 55 |  | 
|  | 56 | /* check return value */ | 
|  | 57 | pop	%rcx | 
|  | 58 | cmp	%rcx, %rax | 
|  | 59 | je	again | 
|  | 60 |  | 
|  | 61 | done: | 
|  | 62 | /* save return value */ | 
| Jeff Dike | c560049 | 2005-09-03 15:57:36 -0700 | [diff] [blame] | 63 | mov	%rax, (%rbx) | 
| Bodo Stroesser | 07bf731 | 2005-09-03 15:57:50 -0700 | [diff] [blame] | 64 |  | 
|  | 65 | /* stop */ | 
|  | 66 | int3 |