mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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>
		
			
				
	
	
		
			51 lines
		
	
	
	
		
			808 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
	
		
			808 B
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
#include "uml-config.h"
 | 
						|
 | 
						|
	.globl syscall_stub
 | 
						|
.section .__syscall_stub, "x"
 | 
						|
 | 
						|
	.globl batch_syscall_stub
 | 
						|
batch_syscall_stub:
 | 
						|
	/* load pointer to first operation */
 | 
						|
	mov	$(UML_CONFIG_STUB_DATA+8), %esp
 | 
						|
 | 
						|
again:
 | 
						|
	/* load length of additional data */
 | 
						|
	mov	0x0(%esp), %eax
 | 
						|
 | 
						|
	/* if(length == 0) : end of list */
 | 
						|
	/* write possible 0 to header */
 | 
						|
	mov	%eax, UML_CONFIG_STUB_DATA+4
 | 
						|
	cmpl	$0, %eax
 | 
						|
	jz	done
 | 
						|
 | 
						|
	/* save current pointer */
 | 
						|
	mov	%esp, UML_CONFIG_STUB_DATA+4
 | 
						|
 | 
						|
	/* skip additional data */
 | 
						|
	add	%eax, %esp
 | 
						|
 | 
						|
	/* load syscall-# */
 | 
						|
	pop	%eax
 | 
						|
 | 
						|
	/* load syscall params */
 | 
						|
	pop	%ebx
 | 
						|
	pop	%ecx
 | 
						|
	pop	%edx
 | 
						|
	pop	%esi
 | 
						|
 	pop	%edi
 | 
						|
	pop	%ebp
 | 
						|
 | 
						|
	/* execute syscall */
 | 
						|
	int	$0x80
 | 
						|
 | 
						|
	/* check return value */
 | 
						|
	pop	%ebx
 | 
						|
	cmp	%ebx, %eax
 | 
						|
	je	again
 | 
						|
 | 
						|
done:
 | 
						|
	/* save return value */
 | 
						|
	mov	%eax, UML_CONFIG_STUB_DATA
 | 
						|
 | 
						|
	/* stop */
 | 
						|
	int3
 |