qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PULL 1/2] linux-user: Fix i386 safe-syscall.S


From: Richard Henderson
Subject: [Qemu-devel] [PULL 1/2] linux-user: Fix i386 safe-syscall.S
Date: Sun, 10 Jul 2016 10:10:04 -0700

Clang insists that "cmp" is ambiguous with a memory destination,
requiring an explicit size suffix.

There was a true error in the use of .cfi_def_cfa_offset in the
epilogue, but changing to use the proper .cfi_adjust_cfa_offset
runs afoul of a clang bug wrt .cfi_restore_state.  Better to
fold the two epilogues so that we don't trigger the bug.

Signed-off-by: Richard Henderson <address@hidden>
---
 linux-user/host/i386/safe-syscall.inc.S | 24 ++++++------------------
 1 file changed, 6 insertions(+), 18 deletions(-)

diff --git a/linux-user/host/i386/safe-syscall.inc.S 
b/linux-user/host/i386/safe-syscall.inc.S
index 766d0de..9e58fc6 100644
--- a/linux-user/host/i386/safe-syscall.inc.S
+++ b/linux-user/host/i386/safe-syscall.inc.S
@@ -69,7 +69,7 @@ safe_syscall_base:
 safe_syscall_start:
        /* if signal_pending is non-zero, don't do the call */
        mov     4+16(%esp), %eax        /* signal_pending */
-       cmp     $0, (%eax)
+       cmpl    $0, (%eax)
        jnz     1f
        mov     8+16(%esp), %eax        /* syscall number */
        int     $0x80
@@ -77,16 +77,16 @@ safe_syscall_end:
        /* code path for having successfully executed the syscall */
        pop     %ebx
        .cfi_remember_state
-       .cfi_def_cfa_offset -4
+       .cfi_adjust_cfa_offset -4
        .cfi_restore ebx
        pop     %edi
-       .cfi_def_cfa_offset -4
+       .cfi_adjust_cfa_offset -4
        .cfi_restore edi
        pop     %esi
-       .cfi_def_cfa_offset -4
+       .cfi_adjust_cfa_offset -4
        .cfi_restore esi
        pop     %ebp
-       .cfi_def_cfa_offset -4
+       .cfi_adjust_cfa_offset -4
        .cfi_restore ebp
        ret
 
@@ -94,19 +94,7 @@ safe_syscall_end:
        /* code path when we didn't execute the syscall */
        .cfi_restore_state
        mov     $-TARGET_ERESTARTSYS, %eax
-       pop     %ebx
-       .cfi_def_cfa_offset -4
-       .cfi_restore ebx
-       pop     %edi
-       .cfi_def_cfa_offset -4
-       .cfi_restore edi
-       pop     %esi
-       .cfi_def_cfa_offset -4
-       .cfi_restore esi
-       pop     %ebp
-       .cfi_def_cfa_offset -4
-       .cfi_restore ebp
-       ret
+       jmp     safe_syscall_end
        .cfi_endproc
 
        .size   safe_syscall_base, .-safe_syscall_base
-- 
2.7.4




reply via email to

[Prev in Thread] Current Thread [Next in Thread]