git: 8a4bd7f818a0 - main - amd64 ia32 vdso: add unwind annotations to the signal trampoline

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Mon, 06 Dec 2021 18:48:27 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=8a4bd7f818a0e361876ab05d49fd04e28ce05357

commit 8a4bd7f818a0e361876ab05d49fd04e28ce05357
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-11-15 18:30:48 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2021-12-06 18:47:24 +0000

    amd64 ia32 vdso:  add unwind annotations to the signal trampoline
    
    Reviewed by:    emaste
    Discussed with: jhb, jrtc27
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 month
    Differential revision:  https://reviews.freebsd.org/D32960
---
 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));