Re: [patch V6 19/37] x86/irq: Convey vector as argument and not in ptregs

From: Thomas Gleixner
Date: Thu May 21 2020 - 09:24:03 EST


Andy Lutomirski <luto@xxxxxxxxxx> writes:
> On Fri, May 15, 2020 at 5:10 PM Thomas Gleixner <tglx@xxxxxxxxxxxxx> wrote:
>
> + .align 8
>> +SYM_CODE_START(irq_entries_start)
>> + vector=FIRST_EXTERNAL_VECTOR
>> + .rept (FIRST_SYSTEM_VECTOR - FIRST_EXTERNAL_VECTOR)
>> + UNWIND_HINT_IRET_REGS
>> + .byte 0x6a, vector
>> + jmp common_interrupt
>> + .align 8
>> + vector=vector+1
>> + .endr
>> +SYM_CODE_END(irq_entries_start)
>
> Having battled code like this in the past (for early exceptions), I
> prefer the variant like:
>
> pos = .;
> .rept blah blah blah
> .byte whatever
> jmp whatever
> . = pos + 8;
> vector = vector + 1
> .endr
>
> or maybe:
>
> .rept blah blah blah
> .byte whatever
> jmp whatever;
> . = irq_entries_start + 8 * vector;
> vector = vector + 1
> .endr
>
> The reason is that these variants will fail to assemble if something
> goes wrong and the code expands to more than 8 bytes, whereas using
> .align will cause gas to happily emit 16 bytes and result in
> hard-to-debug mayhem.

Yes. They just make objtool very unhappy:

arch/x86/entry/entry_64.o: warning: objtool: .entry.text+0xfd0: special:
can't find orig instruction

Peter suggested to use:

.pos = .
.byte..
jmp
.nops (pos + 8) - .

That works ...