The branch stable/13 has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=9cbd1c32b1f99542e30dcf4de3f1e70b20a130e4

commit 9cbd1c32b1f99542e30dcf4de3f1e70b20a130e4
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2021-11-15 18:30:48 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2022-01-02 16:43:01 +0000

    amd64 ia32 vdso:  add unwind annotations to the signal trampoline
    
    (cherry picked from commit 8a4bd7f818a0e361876ab05d49fd04e28ce05357)
---
 sys/amd64/ia32/ia32_sigtramp.S  | 35 +++++++++++++++++++++++++++++++++++
 sys/compat/ia32/ia32_genassym.c | 20 +++++++++++++++++---
 2 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/sys/amd64/ia32/ia32_sigtramp.S b/sys/amd64/ia32/ia32_sigtramp.S
index 4488e568c43e..f7f3fd129cc7 100644
--- a/sys/amd64/ia32/ia32_sigtramp.S
+++ b/sys/amd64/ia32/ia32_sigtramp.S
@@ -2,6 +2,11 @@
  * Copyright (c) 2003 Peter Wemm
  * All rights reserved.
  *
+ * Copyright (c) 2021 The FreeBSD Foundation
+ *
+ * Portions of this software were developed by Konstantin Belousov
+ * under sponsorship from the FreeBSD Foundation.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -39,15 +44,45 @@
        ALIGN_TEXT
        .globl  __vdso_ia32_sigcode
 __vdso_ia32_sigcode:
+       .cfi_startproc
+       .cfi_signal_frame
+       .cfi_def_cfa    %esp, 0
+#if 0
+       .cfi_offset     %gs,  IA32_SIGF_UC + IA32_UC_GS
+       .cfi_offset     %fs,  IA32_SIGF_UC + IA32_UC_FS
+       .cfi_offset     %es,  IA32_SIGF_UC + IA32_UC_ES
+       .cfi_offset     %ds,  IA32_SIGF_UC + IA32_UC_DS
+#endif
+       .cfi_offset     %edi, IA32_SIGF_UC + IA32_UC_EDI
+       .cfi_offset     %esi, IA32_SIGF_UC + IA32_UC_ESI
+       .cfi_offset     %ebp, IA32_SIGF_UC + IA32_UC_EBP
+       .cfi_offset     %ebx, IA32_SIGF_UC + IA32_UC_EBX
+       .cfi_offset     %edx, IA32_SIGF_UC + IA32_UC_EDX
+       .cfi_offset     %ecx, IA32_SIGF_UC + IA32_UC_ECX
+       .cfi_offset     %eax, IA32_SIGF_UC + IA32_UC_EAX
+       .cfi_offset     %eip, IA32_SIGF_UC + IA32_UC_EIP
+#if 0
+       .cfi_offset     %cs,  IA32_SIGF_UC + IA32_UC_CS
+       .cfi_offset     %flags, IA32_SIGF_UC + IA32_UC_EFLAGS
+#endif
+       .cfi_offset     %esp, IA32_SIGF_UC + IA32_UC_ESP
+#if 0
+       .cfi_offset     %ss,  IA32_SIGF_UC + IA32_UC_SS
+       .cfi_offset     93 /* %fs.base */, IA32_SIGF_UC + IA32_UC_FSBASE
+       .cfi_offset     94 /* %gs.base */, IA32_SIGF_UC + IA32_UC_GSBASE
+#endif
        calll   *IA32_SIGF_HANDLER(%esp)
        leal    IA32_SIGF_UC(%esp),%eax /* get ucontext */
        pushl   %eax
+       .cfi_def_cfa    %esp, 4
        movl    $SYS_sigreturn,%eax
        pushl   %eax                    /* junk to fake return addr. */
+       .cfi_def_cfa    %esp, 8
        int     $0x80                   /* enter kernel with args */
                                        /* on stack */
 1:
        jmp     1b
+       .cfi_endproc
 
 #ifdef COMPAT_FREEBSD4
        ALIGN_TEXT
diff --git a/sys/compat/ia32/ia32_genassym.c b/sys/compat/ia32/ia32_genassym.c
index 5a1faae892db..cb15529aacf6 100644
--- a/sys/compat/ia32/ia32_genassym.c
+++ b/sys/compat/ia32/ia32_genassym.c
@@ -11,13 +11,27 @@ __FBSDID("$FreeBSD$");
 
 ASSYM(IA32_SIGF_HANDLER, offsetof(struct ia32_sigframe, sf_ah));
 ASSYM(IA32_SIGF_UC, offsetof(struct ia32_sigframe, sf_uc));
-#ifdef COMPAT_43
-ASSYM(IA32_SIGF_SC, offsetof(struct ia32_sigframe3, sf_siginfo.si_sc));
-#endif
 ASSYM(IA32_UC_GS, offsetof(struct ia32_ucontext, uc_mcontext.mc_gs));
 ASSYM(IA32_UC_FS, offsetof(struct ia32_ucontext, uc_mcontext.mc_fs));
 ASSYM(IA32_UC_ES, offsetof(struct ia32_ucontext, uc_mcontext.mc_es));
 ASSYM(IA32_UC_DS, offsetof(struct ia32_ucontext, uc_mcontext.mc_ds));
+ASSYM(IA32_UC_EDI, offsetof(struct ia32_ucontext, uc_mcontext.mc_edi));
+ASSYM(IA32_UC_ESI, offsetof(struct ia32_ucontext, uc_mcontext.mc_esi));
+ASSYM(IA32_UC_EBP, offsetof(struct ia32_ucontext, uc_mcontext.mc_ebp));
+ASSYM(IA32_UC_EBX, offsetof(struct ia32_ucontext, uc_mcontext.mc_ebx));
+ASSYM(IA32_UC_EDX, offsetof(struct ia32_ucontext, uc_mcontext.mc_edx));
+ASSYM(IA32_UC_ECX, offsetof(struct ia32_ucontext, uc_mcontext.mc_ecx));
+ASSYM(IA32_UC_EAX, offsetof(struct ia32_ucontext, uc_mcontext.mc_eax));
+ASSYM(IA32_UC_EIP, offsetof(struct ia32_ucontext, uc_mcontext.mc_eip));
+ASSYM(IA32_UC_CS, offsetof(struct ia32_ucontext, uc_mcontext.mc_cs));
+ASSYM(IA32_UC_EFLAGS, offsetof(struct ia32_ucontext, uc_mcontext.mc_eflags));
+ASSYM(IA32_UC_ESP, offsetof(struct ia32_ucontext, uc_mcontext.mc_esp));
+ASSYM(IA32_UC_SS, offsetof(struct ia32_ucontext, uc_mcontext.mc_ss));
+ASSYM(IA32_UC_FSBASE, offsetof(struct ia32_ucontext, uc_mcontext.mc_fsbase));
+ASSYM(IA32_UC_GSBASE, offsetof(struct ia32_ucontext, uc_mcontext.mc_gsbase));
+#ifdef COMPAT_43
+ASSYM(IA32_SIGF_SC, offsetof(struct ia32_sigframe3, sf_siginfo.si_sc));
+#endif
 #ifdef COMPAT_FREEBSD4
 ASSYM(IA32_SIGF_UC4, offsetof(struct ia32_sigframe4, sf_uc));
 ASSYM(IA32_UC4_GS, offsetof(struct ia32_ucontext4, uc_mcontext.mc_gs));

Reply via email to