[PATCH v7 6/6] x86/vdso: Enable sframe generation in VDSO

Jens Remus posted 6 patches 4 days, 18 hours ago
There is a newer version of this series
[PATCH v7 6/6] x86/vdso: Enable sframe generation in VDSO
Posted by Jens Remus 4 days, 18 hours ago
From: Josh Poimboeuf <jpoimboe@kernel.org>

Enable sframe generation in the VDSO library so kernel and user space
can unwind through it.

[ Jens Remus: Add support for SFrame V3.  Prevent GNU_SFRAME program
table entry to empty .sframe section. ]

Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Jens Remus <jremus@linux.ibm.com>
---

Notes (jremus):
    Changes in v7:
    - Rebase on H. Peter Anvin's vDSO changes on tip:x86/entry.
    - Simplify adding assembler option -Wa,--gsframe-3.  Add for
      vdso64 only.
    - Align to .eh_frame and mark .sframe as KEEP in vDSO linker script.
      Note that GNU linker 2.46 will mark .sframe as KEEP in its default
      linker script as well.

 arch/Kconfig                                 |  7 +++++++
 arch/x86/entry/vdso/common/vdso-layout.lds.S | 11 +++++++++++
 arch/x86/entry/vdso/vdso64/Makefile          |  1 +
 arch/x86/include/asm/dwarf2.h                |  5 ++++-
 4 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/arch/Kconfig b/arch/Kconfig
index 31220f512b16..8170e492a44c 100644
--- a/arch/Kconfig
+++ b/arch/Kconfig
@@ -479,6 +479,13 @@ config HAVE_HARDLOCKUP_DETECTOR_ARCH
 	  It uses the same command line parameters, and sysctl interface,
 	  as the generic hardlockup detectors.
 
+config AS_SFRAME
+	bool
+
+config AS_SFRAME3
+	def_bool $(as-instr,.cfi_startproc\n.cfi_endproc,-Wa$(comma)--gsframe-3)
+	select AS_SFRAME
+
 config UNWIND_USER
 	bool
 
diff --git a/arch/x86/entry/vdso/common/vdso-layout.lds.S b/arch/x86/entry/vdso/common/vdso-layout.lds.S
index 856b8b9d278c..421eb4ca9131 100644
--- a/arch/x86/entry/vdso/common/vdso-layout.lds.S
+++ b/arch/x86/entry/vdso/common/vdso-layout.lds.S
@@ -60,6 +60,13 @@ SECTIONS
 		*(.eh_frame.*)
 	}					:text
 
+#ifdef CONFIG_AS_SFRAME
+	.sframe		: {
+		KEEP (*(.sframe))
+		*(.sframe.*)
+	}					:text	:sframe
+#endif
+
 	/*
 	 * Text is well-separated from actual data: there's plenty of
 	 * stuff that isn't used at runtime in between.
@@ -89,6 +96,7 @@ SECTIONS
 #define PT_GNU_EH_FRAME	0x6474e550
 #define PT_GNU_STACK	0x6474e551
 #define PT_GNU_PROPERTY	0x6474e553
+#define PT_GNU_SFRAME	0x6474e554
 
 /*
  * We must supply the ELF program headers explicitly to get just one
@@ -104,6 +112,9 @@ PHDRS
 	dynamic		PT_DYNAMIC	PF_R;
 	note		PT_NOTE		PF_R;
 	eh_frame_hdr	PT_GNU_EH_FRAME PF_R;
+#ifdef CONFIG_AS_SFRAME
+	sframe		PT_GNU_SFRAME	PF_R;
+#endif
 	gnu_stack	PT_GNU_STACK	PF_RW;
 	gnu_property	PT_GNU_PROPERTY	PF_R;
 }
diff --git a/arch/x86/entry/vdso/vdso64/Makefile b/arch/x86/entry/vdso/vdso64/Makefile
index bfffaf1aeecc..459f8026531e 100644
--- a/arch/x86/entry/vdso/vdso64/Makefile
+++ b/arch/x86/entry/vdso/vdso64/Makefile
@@ -14,6 +14,7 @@ vobjs-$(CONFIG_X86_SGX)		+= vsgx.o
 
 # Compilation flags
 flags-y				:= -DBUILD_VDSO64 -m64 -mcmodel=small
+flags-$(CONFIG_AS_SFRAME3)	+= -Wa,--gsframe-3
 
 # The location of this include matters!
 include $(src)/../common/Makefile.include
diff --git a/arch/x86/include/asm/dwarf2.h b/arch/x86/include/asm/dwarf2.h
index 7cc30500c095..90b42367815e 100644
--- a/arch/x86/include/asm/dwarf2.h
+++ b/arch/x86/include/asm/dwarf2.h
@@ -12,8 +12,11 @@
 	 * For the vDSO, emit both runtime unwind information and debug
 	 * symbols for the .dbg file.
 	 */
-
+#if defined(__x86_64__) && defined(CONFIG_AS_SFRAME)
+	.cfi_sections .eh_frame, .debug_frame, .sframe
+#else
 	.cfi_sections .eh_frame, .debug_frame
+#endif
 
 #define CFI_STARTPROC		.cfi_startproc
 #define CFI_ENDPROC		.cfi_endproc
-- 
2.51.0
Re: [PATCH v7 6/6] x86/vdso: Enable sframe generation in VDSO
Posted by H. Peter Anvin 4 days, 10 hours ago
On 2026-02-03 09:19, Jens Remus wrote:
> -
> +#if defined(__x86_64__) && defined(CONFIG_AS_SFRAME)
> +	.cfi_sections .eh_frame, .debug_frame, .sframe
> +#else
>  	.cfi_sections .eh_frame, .debug_frame
> +#endif
>  

It would be better to:

#undef CONFIG_AS_SFRAME	/* i386 doesn't support .sframe */

in fake_32bit_build.h.

	-hpa
Re: [PATCH v7 6/6] x86/vdso: Enable sframe generation in VDSO
Posted by Jens Remus 1 day, 17 hours ago
On 2/4/2026 1:49 AM, H. Peter Anvin wrote:
> On 2026-02-03 09:19, Jens Remus wrote:
>> -
>> +#if defined(__x86_64__) && defined(CONFIG_AS_SFRAME)

My understanding is that you would like above changed to:

#ifdef CONFIG_AS_SFRAME

>> +	.cfi_sections .eh_frame, .debug_frame, .sframe
>> +#else
>>  	.cfi_sections .eh_frame, .debug_frame
>> +#endif
>>  
> 
> It would be better to:
> 
> #undef CONFIG_AS_SFRAME	/* i386 doesn't support .sframe */
> 
> in fake_32bit_build.h.
Due to (binutils 2.46 pre-release) GNU assembler supporting --gsframe-3,
but only for x86-64 not for x86-32 (nor x32) CONFIG_AS_SFRAME is enabled
even for my i386 cross build attempt.  This then wrongly causes the
.cfi_sections with .sframe to be selected (verified by adding an #error
for testing).

IIUC the .cfi_sections is there to have DWARF in both .eh_frame and
.debug_frame.  For .sframe it basically has the same effect as
specifying the common assembler option --gsframe.  Given the more
specific option --gsframe-3 is explicitly specified I think it would
be better to drop the changes to both dwarf2.h and fake_32bit_build.h
and solely rely on --gsframe-3.

Josh, Indu, do you agree?

Thanks and rRegards,
Jens
-- 
Jens Remus
Linux on Z Development (D3303)
jremus@de.ibm.com / jremus@linux.ibm.com

IBM Deutschland Research & Development GmbH; Vorsitzender des Aufsichtsrats: Wolfgang Wendt; Geschäftsführung: David Faller; Sitz der Gesellschaft: Ehningen; Registergericht: Amtsgericht Stuttgart, HRB 243294
IBM Data Privacy Statement: https://www.ibm.com/privacy/

Re: [PATCH v7 6/6] x86/vdso: Enable sframe generation in VDSO
Posted by H. Peter Anvin 1 day, 11 hours ago
On February 6, 2026 9:48:24 AM PST, Jens Remus <jremus@linux.ibm.com> wrote:
>On 2/4/2026 1:49 AM, H. Peter Anvin wrote:
>> On 2026-02-03 09:19, Jens Remus wrote:
>>> -
>>> +#if defined(__x86_64__) && defined(CONFIG_AS_SFRAME)
>
>My understanding is that you would like above changed to:
>
>#ifdef CONFIG_AS_SFRAME
>
>>> +	.cfi_sections .eh_frame, .debug_frame, .sframe
>>> +#else
>>>  	.cfi_sections .eh_frame, .debug_frame
>>> +#endif
>>>  
>> 
>> It would be better to:
>> 
>> #undef CONFIG_AS_SFRAME	/* i386 doesn't support .sframe */
>> 
>> in fake_32bit_build.h.
>Due to (binutils 2.46 pre-release) GNU assembler supporting --gsframe-3,
>but only for x86-64 not for x86-32 (nor x32) CONFIG_AS_SFRAME is enabled
>even for my i386 cross build attempt.  This then wrongly causes the
>.cfi_sections with .sframe to be selected (verified by adding an #error
>for testing).
>
>IIUC the .cfi_sections is there to have DWARF in both .eh_frame and
>.debug_frame.  For .sframe it basically has the same effect as
>specifying the common assembler option --gsframe.  Given the more
>specific option --gsframe-3 is explicitly specified I think it would
>be better to drop the changes to both dwarf2.h and fake_32bit_build.h
>and solely rely on --gsframe-3.
>
>Josh, Indu, do you agree?
>
>Thanks and rRegards,
>Jens

Seems a lot cleaner to me, too, assuming it actually works.
Re: [PATCH v7 6/6] x86/vdso: Enable sframe generation in VDSO
Posted by Josh Poimboeuf 1 day, 10 hours ago
On Fri, Feb 06, 2026 at 03:56:59PM -0800, H. Peter Anvin wrote:
> On February 6, 2026 9:48:24 AM PST, Jens Remus <jremus@linux.ibm.com> wrote:
> >On 2/4/2026 1:49 AM, H. Peter Anvin wrote:
> >> On 2026-02-03 09:19, Jens Remus wrote:
> >>> -
> >>> +#if defined(__x86_64__) && defined(CONFIG_AS_SFRAME)
> >
> >My understanding is that you would like above changed to:
> >
> >#ifdef CONFIG_AS_SFRAME
> >
> >>> +	.cfi_sections .eh_frame, .debug_frame, .sframe
> >>> +#else
> >>>  	.cfi_sections .eh_frame, .debug_frame
> >>> +#endif
> >>>  
> >> 
> >> It would be better to:
> >> 
> >> #undef CONFIG_AS_SFRAME	/* i386 doesn't support .sframe */
> >> 
> >> in fake_32bit_build.h.
> >Due to (binutils 2.46 pre-release) GNU assembler supporting --gsframe-3,
> >but only for x86-64 not for x86-32 (nor x32) CONFIG_AS_SFRAME is enabled
> >even for my i386 cross build attempt.  This then wrongly causes the
> >.cfi_sections with .sframe to be selected (verified by adding an #error
> >for testing).
> >
> >IIUC the .cfi_sections is there to have DWARF in both .eh_frame and
> >.debug_frame.  For .sframe it basically has the same effect as
> >specifying the common assembler option --gsframe.  Given the more
> >specific option --gsframe-3 is explicitly specified I think it would
> >be better to drop the changes to both dwarf2.h and fake_32bit_build.h
> >and solely rely on --gsframe-3.
> >
> >Josh, Indu, do you agree?
> >
> >Thanks and rRegards,
> >Jens
> 
> Seems a lot cleaner to me, too, assuming it actually works.

+1

-- 
Josh