forked from Minki/linux
07bf731e4b
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
|