On 12.12.2025 02:34, Jason Andryuk wrote:
> The alternative is section groups? I'm trying that, and it kinda works
> sometimes, but .attach_to_group fails when .init.text is involved.
>
> Here's an example that I think would work, I could make it to
> --gc-sectrions:
> group section [ 3] `.group' [.text.vpmu_do_msr] contains 5 sections:
> [Index] Name
> [ 43] .text.vpmu_do_msr
> [ 44] .rela.text.vpmu_do_msr
> [ 45] .altinstructions..text.vpmu_do_msr
> [ 46] .rela.altinstructions..text.vpmu_do_msr
> [ 47] .altinstr_replacement..text.vpmu_do_msr
>
> But I don't make it that far. Other files blow up with tons of:
> {standard input}:9098: Warning: dwarf line number information for
> .init.text ignored
> and
> {standard input}:50083: Error: leb128 operand is an undefined symbol:
> .LVU4040
>
> Line 9098 of apic.s is .loc below:
> """
> .section .init.text
> .globl setup_boot_APIC_clock
> .hidden setup_boot_APIC_clock
> .type setup_boot_APIC_clock, @function
> setup_boot_APIC_clock:
> .LFB827:
> .loc 1 1150 1 is_stmt 1 view -0
> .cfi_startproc
> pushq %rbp
> """
>
> diff below. Any ideas?
I haven't looked into this in detail yet, but ...
> --- a/xen/arch/x86/include/asm/alternative.h
> +++ b/xen/arch/x86/include/asm/alternative.h
> @@ -90,25 +90,31 @@ extern void alternative_instructions(void);
> /* alternative assembly primitive: */
> #define ALTERNATIVE(oldinstr, newinstr, feature) \
> OLDINSTR_1(oldinstr, 1) \
> - ".pushsection .altinstructions, \"a\", @progbits\n" \
> + ".attach_to_group %%S\n" \
> + ".pushsection .altinstructions.%%S, \"a?\", @progbits\n" \
... wouldn't you need another .attach_to_group here and ...
> ALTINSTR_ENTRY(feature, 1) \
> - ".section .discard, \"a\", @progbits\n" \
> + ".popsection\n" \
> + ".pushsection .discard, \"a\", @progbits\n" \
> ".byte " alt_total_len "\n" /* total_len <= 255 */ \
> DISCARD_ENTRY(1) \
> - ".section .altinstr_replacement, \"ax\", @progbits\n" \
> + ".popsection\n" \
> + ".pushsection .altinstr_replacement.%%S, \"ax?\", @progbits\n"\
... here? Or alternatively use the 'G' section flag to the specify the group
name?
As to debug info, I wonder whether playing with groups behind the back of the
compiler is going to work well. Iirc it groups sections itself, too. Did you
look at the generated assembly with this in mind?
Jan