aboutsummaryrefslogtreecommitdiffstats
path: root/arch/um/sys-x86_64/stub.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/um/sys-x86_64/stub.S')
-rw-r--r--arch/um/sys-x86_64/stub.S50
1 files changed, 40 insertions, 10 deletions
diff --git a/arch/um/sys-x86_64/stub.S b/arch/um/sys-x86_64/stub.S
index 957f2eff32ca..03c279735784 100644
--- a/arch/um/sys-x86_64/stub.S
+++ b/arch/um/sys-x86_64/stub.S
@@ -16,21 +16,51 @@ syscall_stub:
16 16
17 .globl batch_syscall_stub 17 .globl batch_syscall_stub
18batch_syscall_stub: 18batch_syscall_stub:
19 movq $(UML_CONFIG_STUB_DATA >> 32), %rbx 19 mov $(UML_CONFIG_STUB_DATA >> 32), %rbx
20 salq $32, %rbx 20 sal $32, %rbx
21 movq $(UML_CONFIG_STUB_DATA & 0xffffffff), %rcx 21 mov $(UML_CONFIG_STUB_DATA & 0xffffffff), %rax
22 or %rcx, %rbx 22 or %rax, %rbx
23 movq %rbx, %rsp 23 /* load pointer to first operation */
24again: pop %rax 24 mov %rbx, %rsp
25 cmpq $0, %rax 25 add $0x10, %rsp
26jz done 26again:
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 */
27 pop %rdi 46 pop %rdi
28 pop %rsi 47 pop %rsi
29 pop %rdx 48 pop %rdx
30 pop %r10 49 pop %r10
31 pop %r8 50 pop %r8
32 pop %r9 51 pop %r9
52
53 /* execute syscall */
33 syscall 54 syscall
55
56 /* check return value */
57 pop %rcx
58 cmp %rcx, %rax
59 je again
60
61done:
62 /* save return value */
34 mov %rax, (%rbx) 63 mov %rax, (%rbx)
35 jmp again 64
36done: int3 65 /* stop */
66 int3