]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/um/sys-x86_64/stub.S
Merge branch 'for-linus' of git://git.o-hand.com/linux-rpurdie-backlight
[linux-2.6-omap-h63xx.git] / arch / um / sys-x86_64 / stub.S
index 31c14925716bc1c2cf7db2be034e79738c4cb0fa..6d9edf9fabce15d4dac536ae8ce18e70b301822e 100644 (file)
@@ -1,4 +1,4 @@
-#include "uml-config.h"
+#include "as-layout.h"
 
        .globl syscall_stub
 .section .__syscall_stub, "x"
@@ -7,9 +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:
+       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