Re: [RFC PATCH v1 21/25] unwind_user/eh_frame/x86: Handle PLT expressions

Jens Remus <[email protected]>
Newsgroups dev.linux.lists.sashiko-reviews,org.kernel.vger.linux-s390,org.kernel.vger.linux-trace-kernel
Organization IBM Deutschland Research & Development GmbH
Message-ID <[email protected]>
On 8/18/2026 5:10 PM, [email protected] wrote:

> This commit adds x86-specific support for unwinding through GNU linker
> generated PLT entries by handling the CFA expression found in .eh_frame.
> It explicitly aims to enable this for both i386 and x86-64 binaries.
> 
>> diff --git a/arch/x86/include/asm/unwind_user_eh_frame.h b/arch/x86/include/asm/unwind_user_eh_frame.h
>> index fdccbda2fe4b1..8268eb1a0ff5a 100644
>> --- a/arch/x86/include/asm/unwind_user_eh_frame.h
>> +++ b/arch/x86/include/asm/unwind_user_eh_frame.h
> [ ... ]
>> +static inline int eh_frame_do_def_cfa_expression(const char *expr,
>> +						 int size,
>> +						 unsigned long ip,
>> +						 struct eh_frame_reg_state *reg_state)
>> +{
> [ ... ]
>> +		sp_reg = DW_OP_breg_register(sp_op);
>> +		ip_reg = DW_OP_breg_register(ip_op);
>> +		if (sp_reg != EH_FRAME_REG_SP || ip_reg != EH_FRAME_REG_RA)
>> +			return -EOPNOTSUPP;
> 
> [Severity: Medium]
> Does this unconditionally reject 32-bit i386 PLT expressions?
> 
> The commit message mentions enabling unwinding for both i386 and x86-64,
> and the comment above notes the 32-bit DWARF registers 4 (ESP) and 8 (EIP).
> However, this check requires the parsed DWARF register values to match
> EH_FRAME_REG_SP (7) and EH_FRAME_REG_RA (16), which are exclusively the
> x86-64 register mappings. 
> 
> Will this cause valid i386 expressions to fail and return -EOPNOTSUPP?
> 
> While 32-bit eh_frame unwinding is currently disabled at a higher level
> for x86-64 tasks, this logic appears to contradict the intended architectural
> support.

When enabling i386 support, one would define EH_FRAME_REG_SP and
EH_FRAME_REG_RA to the respective i386 constants.  The PLT expressions
used by the GNU linker are otherwise the same.

For 32-bit compat (and x32?) this is different.  This may require
the definitions to be changed to functions that dynamically return the
respective register constant values.

> 
>> +
>> +		/* CFA = (SP + SP_offset) + (((IP & 0xf) >= N) << shift) */
>> +		reg_state->cfa_rule = CFA_REG_OFFSET;
>> +		reg_state->cfa_regnum = EH_FRAME_REG_SP;
> 

Regards,
Jens
-- 
Jens Remus
Linux on Z Development (D3303)
[email protected] / [email protected]

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/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.