git: 9cbd1c32b1f9 - stable/13 - amd64 ia32 vdso: add unwind annotations to the signal trampoline
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Sun, 02 Jan 2022 19:08:18 UTC
The branch stable/13 has been updated by kib:
URL: https://cgit.FreeBSD.org/src/commit/?id=9cbd1c32b1f99542e30dcf4de3f1e70b20a130e4
commit 9cbd1c32b1f99542e30dcf4de3f1e70b20a130e4
Author: Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2021-11-15 18:30:48 +0000
Commit: Konstantin Belousov <kib@FreeBSD.org>
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));