Macroize stub system call execution loop
    
Extract the system call execution loop in the stubs into a macro
A later patch will need this loop, so this makes it available.

diff --git a/arch/um/sys-i386/stub.S b/arch/um/sys-i386/stub.S
index 7699e89..a63397f 100644
--- a/arch/um/sys-i386/stub.S
+++ b/arch/um/sys-i386/stub.S
@@ -1,52 +1,45 @@
 #include "uml-config.h"
 #include "as-layout.h"
 
+#define PROCESS_LIST \
+       /* load pointer to first operation */ \
+       mov     $(STUB_DATA + 8), %esp; \
+1: \
+       /* 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      2f; \
+       /* 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; \
+       /* check return value */ \
+       pop     %ebx; \
+       cmp     %ebx, %eax; \
+       je      1b; \
+2: \
+       /* save return value */ \
+       mov     %eax, STUB_DATA;
+
        .globl syscall_stub
 .section .__syscall_stub, "x"
 
        .globl batch_syscall_stub
 batch_syscall_stub:
-       /* 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
-
-       /* check return value */
-       pop     %ebx
-       cmp     %ebx, %eax
-       je      again
-
-done:
-       /* save return value */
-       mov     %eax, STUB_DATA
-
+       PROCESS_LIST
        /* stop */
        int3
diff --git a/arch/um/sys-x86_64/stub.S b/arch/um/sys-x86_64/stub.S
index 5687687..69460e6 100644
--- a/arch/um/sys-x86_64/stub.S
+++ b/arch/um/sys-x86_64/stub.S
@@ -1,67 +1,48 @@
 #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
+#define PROCESS_LIST \
+       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; \
+1: \
+       /* 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      2f; \
+       /* 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      1b; \
+2: \
+       /* save return value */ \
+       mov     %rax, (%rbx); \
 
+.section .__syscall_stub, "x"
        .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)
-
+       PROCESS_LIST
        /* stop */
        int3

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft 
Defy all challenges. Microsoft(R) Visual Studio 2008. 
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
User-mode-linux-user mailing list
User-mode-linux-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-user

Reply via email to