When testing gcc testsuite against QEMU v8.2 we found some additional failures vs. v8.1.2.
| FAIL: gcc.dg/cleanup-10.c execution test | FAIL: gcc.dg/cleanup-11.c execution test | FAIL: gcc.dg/cleanup-8.c execution test | FAIL: gcc.dg/cleanup-9.c execution test All of these tests involve unwinding off signal stack and v8.2 did introduce a vdso with sigreturn trampoline and associated unwinding info. It seems that info is not correct and making it similar to to one in the linux kernel fixes the above failures. Fixes: 468c1bb5cac9 ("linux-user/riscv: Add vdso") Reported-by: Edwin Lu <e...@rivosinc.com> Signed-off-by: Vineet Gupta <vine...@rivosinc.com> --- linux-user/riscv/vdso.S | 87 ++--------------------------------------- 1 file changed, 4 insertions(+), 83 deletions(-) diff --git a/linux-user/riscv/vdso.S b/linux-user/riscv/vdso.S index a86d8fc488e0..20119010c11b 100644 --- a/linux-user/riscv/vdso.S +++ b/linux-user/riscv/vdso.S @@ -97,91 +97,12 @@ endf __vdso_flush_icache * trampoline, because the unwinder will assume we are returning * after a call site. */ - - .cfi_startproc simple - .cfi_signal_frame - -#define sizeof_reg (__riscv_xlen / 4) -#define sizeof_freg 8 -#define B_GR (offsetof_uc_mcontext - sizeof_rt_sigframe) -#define B_FR (offsetof_uc_mcontext - sizeof_rt_sigframe + offsetof_freg0) - - .cfi_def_cfa 2, sizeof_rt_sigframe - - /* Return address */ - .cfi_return_column 64 - .cfi_offset 64, B_GR + 0 /* pc */ - - /* Integer registers */ - .cfi_offset 1, B_GR + 1 * sizeof_reg /* r1 (ra) */ - .cfi_offset 2, B_GR + 2 * sizeof_reg /* r2 (sp) */ - .cfi_offset 3, B_GR + 3 * sizeof_reg - .cfi_offset 4, B_GR + 4 * sizeof_reg - .cfi_offset 5, B_GR + 5 * sizeof_reg - .cfi_offset 6, B_GR + 6 * sizeof_reg - .cfi_offset 7, B_GR + 7 * sizeof_reg - .cfi_offset 8, B_GR + 8 * sizeof_reg - .cfi_offset 9, B_GR + 9 * sizeof_reg - .cfi_offset 10, B_GR + 10 * sizeof_reg - .cfi_offset 11, B_GR + 11 * sizeof_reg - .cfi_offset 12, B_GR + 12 * sizeof_reg - .cfi_offset 13, B_GR + 13 * sizeof_reg - .cfi_offset 14, B_GR + 14 * sizeof_reg - .cfi_offset 15, B_GR + 15 * sizeof_reg - .cfi_offset 16, B_GR + 16 * sizeof_reg - .cfi_offset 17, B_GR + 17 * sizeof_reg - .cfi_offset 18, B_GR + 18 * sizeof_reg - .cfi_offset 19, B_GR + 19 * sizeof_reg - .cfi_offset 20, B_GR + 20 * sizeof_reg - .cfi_offset 21, B_GR + 21 * sizeof_reg - .cfi_offset 22, B_GR + 22 * sizeof_reg - .cfi_offset 23, B_GR + 23 * sizeof_reg - .cfi_offset 24, B_GR + 24 * sizeof_reg - .cfi_offset 25, B_GR + 25 * sizeof_reg - .cfi_offset 26, B_GR + 26 * sizeof_reg - .cfi_offset 27, B_GR + 27 * sizeof_reg - .cfi_offset 28, B_GR + 28 * sizeof_reg - .cfi_offset 29, B_GR + 29 * sizeof_reg - .cfi_offset 30, B_GR + 30 * sizeof_reg - .cfi_offset 31, B_GR + 31 * sizeof_reg /* r31 */ - - .cfi_offset 32, B_FR + 0 /* f0 */ - .cfi_offset 33, B_FR + 1 * sizeof_freg /* f1 */ - .cfi_offset 34, B_FR + 2 * sizeof_freg - .cfi_offset 35, B_FR + 3 * sizeof_freg - .cfi_offset 36, B_FR + 4 * sizeof_freg - .cfi_offset 37, B_FR + 5 * sizeof_freg - .cfi_offset 38, B_FR + 6 * sizeof_freg - .cfi_offset 39, B_FR + 7 * sizeof_freg - .cfi_offset 40, B_FR + 8 * sizeof_freg - .cfi_offset 41, B_FR + 9 * sizeof_freg - .cfi_offset 42, B_FR + 10 * sizeof_freg - .cfi_offset 43, B_FR + 11 * sizeof_freg - .cfi_offset 44, B_FR + 12 * sizeof_freg - .cfi_offset 45, B_FR + 13 * sizeof_freg - .cfi_offset 46, B_FR + 14 * sizeof_freg - .cfi_offset 47, B_FR + 15 * sizeof_freg - .cfi_offset 48, B_FR + 16 * sizeof_freg - .cfi_offset 49, B_FR + 17 * sizeof_freg - .cfi_offset 50, B_FR + 18 * sizeof_freg - .cfi_offset 51, B_FR + 19 * sizeof_freg - .cfi_offset 52, B_FR + 20 * sizeof_freg - .cfi_offset 53, B_FR + 21 * sizeof_freg - .cfi_offset 54, B_FR + 22 * sizeof_freg - .cfi_offset 55, B_FR + 23 * sizeof_freg - .cfi_offset 56, B_FR + 24 * sizeof_freg - .cfi_offset 57, B_FR + 25 * sizeof_freg - .cfi_offset 58, B_FR + 26 * sizeof_freg - .cfi_offset 59, B_FR + 27 * sizeof_freg - .cfi_offset 60, B_FR + 28 * sizeof_freg - .cfi_offset 61, B_FR + 29 * sizeof_freg - .cfi_offset 62, B_FR + 30 * sizeof_freg - .cfi_offset 63, B_FR + 31 * sizeof_freg /* f31 */ - nop __vdso_rt_sigreturn: - raw_syscall __NR_rt_sigreturn + .cfi_startproc + .cfi_signal_frame + raw_syscall __NR_rt_sigreturn + .cfi_endproc endf __vdso_rt_sigreturn - .cfi_endproc -- 2.34.1