forked from Minki/linux
4bdf8bc4a1
Suggested by Geert Uytterhoeven - use const.h to get constants that are usable in both C and assembly. I can't include it directly since this code can't include kernel headers. const.h is also for numeric constants that can be typed by tacking a "UL" or similar on the end. The constants here have to be typed by casting them. So, the relevant parts of const.h are copied here and modified in order to allow the constants to be uncasted in assembly and casted in C. Signed-off-by: Jeff Dike <jdike@linux.intel.com> Cc: Geert Uytterhoeven <geert@linux-m68k.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
68 lines
1.1 KiB
ArmAsm
68 lines
1.1 KiB
ArmAsm
#include "uml-config.h"
|
|
#include "as-layout.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 $(STUB_DATA >> 32), %rbx
|
|
salq $32, %rbx
|
|
movq $(STUB_DATA & 0xffffffff), %rcx
|
|
or %rcx, %rbx
|
|
movq %rax, (%rbx)
|
|
int3
|
|
|
|
.globl batch_syscall_stub
|
|
batch_syscall_stub:
|
|
mov $(STUB_DATA >> 32), %rbx
|
|
sal $32, %rbx
|
|
mov $(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
|