x86: 0.957 i386: 0.949 architecture: 0.834 permissions: 0.763 device: 0.723 performance: 0.709 kernel: 0.692 assembly: 0.603 ppc: 0.599 socket: 0.563 peripherals: 0.560 vnc: 0.505 PID: 0.500 network: 0.482 user-level: 0.481 register: 0.470 graphic: 0.460 files: 0.442 boot: 0.428 hypervisor: 0.410 semantic: 0.379 arm: 0.356 VMM: 0.355 KVM: 0.352 risc-v: 0.333 TCG: 0.328 debug: 0.301 virtual: 0.217 mistranslation: 0.206 -------------------- debug: 0.948 user-level: 0.938 architecture: 0.193 x86: 0.169 register: 0.064 kernel: 0.040 TCG: 0.033 files: 0.031 PID: 0.020 assembly: 0.019 performance: 0.017 semantic: 0.010 hypervisor: 0.007 device: 0.004 virtual: 0.003 peripherals: 0.002 boot: 0.002 network: 0.002 KVM: 0.002 socket: 0.001 VMM: 0.001 permissions: 0.001 graphic: 0.001 vnc: 0.001 i386: 0.001 mistranslation: 0.001 risc-v: 0.000 ppc: 0.000 arm: 0.000 linux-user: incorrect alignment of sigframe::pretcode & rt_sigframe::pretcode cause crash Description of problem: Corrent Print Result: sp: cdd3b4e8 SUCCEEDED! qemu-x86_64 Print Result: sp: 2804170 qemu: uncaught target signal 11 (Segmentation fault) - core dumped Segmentation fault Reason of Bug: sigframe::pretcode & rt_sigframe::pretcode must align of 16n-sizeof(void*) instead of 16n, Because rsp align of 16n before instruction "call" in caller, After "call", push address of "call" in caller. sp of begin in callee is 16n-sizeof(void*) For example on x86_64: reference to "qemu/linux-user/i386/signal.c" ``` # define TARGET_FPSTATE_FXSAVE_OFFSET 0 struct rt_sigframe { abi_ulong pretcode; struct target_ucontext uc; struct target_siginfo info; struct target_fpstate fpstate QEMU_ALIGNED(16); }; #define TARGET_RT_SIGFRAME_FXSAVE_OFFSET ( \ offsetof(struct rt_sigframe, fpstate) + TARGET_FPSTATE_FXSAVE_OFFSET) ``` offsetof(struct rt_sigframe, fpstate) align of 16 TARGET_FPSTATE_FXSAVE_OFFSET is 0 TARGET_RT_SIGFRAME_FXSAVE_OFFSET is 16n, also alignment of fxsave is 64 so address of rt_sigframe::pretcode is 16n instead of 16n - sizeof(void*), It is incorect! Fix the bug: ``` struct rt_sigframe { abi_ulong pretcode; struct target_ucontext uc; struct target_siginfo info; abi_ulong unused QEMU_ALIGNED(16); struct target_fpstate fpstate; }; ``` offsetof(struct rt_sigframe, fpstate) is 16n+8, so address of rt_sigframe::pretcode is 16n-8 on x86_64.