]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/um/sys-i386/stub.S
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
[linux-2.6-omap-h63xx.git] / arch / um / sys-i386 / stub.S
index a0f9506312d11aa0c7479c1299bac0e5a4a30eb8..c41b04bf5fa005399183176935a683dbfe92d3ce 100644 (file)
@@ -1,25 +1,51 @@
-#include "uml-config.h"
+#include "as-layout.h"
 
        .globl syscall_stub
 .section .__syscall_stub, "x"
-syscall_stub:
-       int     $0x80
-       mov     %eax, UML_CONFIG_STUB_DATA
-       int3
 
        .globl batch_syscall_stub
 batch_syscall_stub:
-       mov     $UML_CONFIG_STUB_DATA, %esp
-again: pop     %eax
+       /* load pointer to first operation */
+       mov     $(STUB_DATA+8), %esp
+
+again:
+       /* load length of additional data */
+       mov     0x0(%esp), %eax
+
+       /* if(length == 0) : end of list */
+       /* write possible 0 to header */
+       mov     %eax, STUB_DATA+4
        cmpl    $0, %eax
        jz      done
+
+       /* save current pointer */
+       mov     %esp, STUB_DATA+4
+
+       /* skip additional data */
+       add     %eax, %esp
+
+       /* load syscall-# */
+       pop     %eax
+
+       /* load syscall params */
        pop     %ebx
        pop     %ecx
        pop     %edx
        pop     %esi
        pop     %edi
        pop     %ebp
+
+       /* execute syscall */
        int     $0x80
-       mov     %eax, UML_CONFIG_STUB_DATA
-       jmp     again
-done:  int3
+
+       /* check return value */
+       pop     %ebx
+       cmp     %ebx, %eax
+       je      again
+
+done:
+       /* save return value */
+       mov     %eax, STUB_DATA
+
+       /* stop */
+       int3