Change syscall-stub's data to include a "expected retval". Stub now checks syscalls retval and aborts execution of syscall list, if retval != expected retval. run_syscall_stub prints the data of the failed syscall, using the data pointer and retval written by the stub to the beginning of the stack. one_syscall_stub is removed, to simplify code, because only some instructions are saved by one_syscall_stub, no host-syscall. Using the stub with additional data (modify_ldt via stub) is prepared also. Signed-off-by: Bodo Stroesser <bstroesser@fujitsu-siemens.com> Signed-off-by: Jeff Dike <jdike@addtoit.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| #include "uml-config.h"
 | |
| 
 | |
| 	.globl syscall_stub
 | |
| .section .__syscall_stub, "x"
 | |
| syscall_stub:
 | |
| 	syscall
 | |
| 	/* We don't have 64-bit constants, so this constructs the address
 | |
| 	 * we need.
 | |
| 	 */
 | |
| 	movq	$(UML_CONFIG_STUB_DATA >> 32), %rbx
 | |
| 	salq	$32, %rbx
 | |
| 	movq	$(UML_CONFIG_STUB_DATA & 0xffffffff), %rcx
 | |
| 	or	%rcx, %rbx
 | |
| 	movq	%rax, (%rbx)
 | |
| 	int3
 | |
| 
 | |
| 	.globl batch_syscall_stub
 | |
| batch_syscall_stub:
 | |
| 	mov	$(UML_CONFIG_STUB_DATA >> 32), %rbx
 | |
| 	sal	$32, %rbx
 | |
| 	mov	$(UML_CONFIG_STUB_DATA & 0xffffffff), %rax
 | |
| 	or	%rax, %rbx
 | |
| 	/* load pointer to first operation */
 | |
| 	mov	%rbx, %rsp
 | |
| 	add	$0x10, %rsp
 | |
| again:
 | |
| 	/* load length of additional data */
 | |
| 	mov	0x0(%rsp), %rax
 | |
| 
 | |
| 	/* if(length == 0) : end of list */
 | |
| 	/* write possible 0 to header */
 | |
| 	mov	%rax, 8(%rbx)
 | |
| 	cmp	$0, %rax
 | |
| 	jz	done
 | |
| 
 | |
| 	/* save current pointer */
 | |
| 	mov	%rsp, 8(%rbx)
 | |
| 
 | |
| 	/* skip additional data */
 | |
| 	add	%rax, %rsp
 | |
| 
 | |
| 	/* load syscall-# */
 | |
| 	pop	%rax
 | |
| 
 | |
| 	/* load syscall params */
 | |
| 	pop	%rdi
 | |
| 	pop	%rsi
 | |
| 	pop	%rdx
 | |
| 	pop	%r10
 | |
|  	pop	%r8
 | |
| 	pop	%r9
 | |
| 
 | |
| 	/* execute syscall */
 | |
| 	syscall
 | |
| 
 | |
| 	/* check return value */
 | |
| 	pop	%rcx
 | |
| 	cmp	%rcx, %rax
 | |
| 	je	again
 | |
| 
 | |
| done:
 | |
| 	/* save return value */
 | |
| 	mov	%rax, (%rbx)
 | |
| 
 | |
| 	/* stop */
 | |
| 	int3
 |