]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/um/sys-x86_64/stub.S
Merge branch 'v28-range-hrtimers-for-linus-v2' of git://git.kernel.org/pub/scm/linux...
[linux-2.6-omap-h63xx.git] / arch / um / sys-x86_64 / stub.S
index 957f2eff32cabde7cf1cc7e4e8dcdb06137664e2..6d9edf9fabce15d4dac536ae8ce18e70b301822e 100644 (file)
@@ -1,4 +1,4 @@
-#include "uml-config.h"
+#include "as-layout.h"
 
        .globl syscall_stub
 .section .__syscall_stub, "x"
@@ -7,30 +7,60 @@ syscall_stub:
        /* We don't have 64-bit constants, so this constructs the address
         * we need.
         */
-       movq    $(UML_CONFIG_STUB_DATA >> 32), %rbx
+       movq    $(STUB_DATA >> 32), %rbx
        salq    $32, %rbx
-       movq    $(UML_CONFIG_STUB_DATA & 0xffffffff), %rcx
+       movq    $(STUB_DATA & 0xffffffff), %rcx
        or      %rcx, %rbx
        movq    %rax, (%rbx)
        int3
 
        .globl batch_syscall_stub
 batch_syscall_stub:
-       movq    $(UML_CONFIG_STUB_DATA >> 32), %rbx
-       salq    $32, %rbx
-       movq    $(UML_CONFIG_STUB_DATA & 0xffffffff), %rcx
-       or      %rcx, %rbx
-       movq    %rbx, %rsp
-again: pop     %rax
-       cmpq    $0, %rax
-jz     done
+       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)
-       jmp     again
-done:  int3
+
+       /* stop */
+       int3