On Tue, May 5, 2020 at 10:23 PM Thomas Gleixner <t...@linutronix.de> wrote:
> +/* > + * ASM code to emit the common vector entry stubs where each stub is > + * packed into 8 bytes. > + * > + * Note, that the 'pushq imm8' is emitted via '.byte 0x6a, vector' because > + * GCC treats the local vector variable as unsigned int and would expand > + * all vectors above 0x7F to a 5 byte push. The original code did an > + * adjustment of the vector number to be in the signed byte range to avoid > + * this. While clever it's mindboggling counterintuitive and requires the > + * odd conversion back to a real vector number in the C entry points. Using > + * .byte achieves the same thing and the only fixup needed in the C entry > + * point is to mask off the bits above bit 7 because the push is sign > + * extending. > + */ > + .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) Hello, tglx Using ".byte 0x6a, vector" is somewhat ugly. I hope it should be " pushq $(s8_to_s64(vector))", which can also help to reduce bunches of comments about ".byte 0x6a, vector". However, I don't know how to implement s8_to_s64() here. But at least the following code works (generates the same two-byte machine code as ".byte 0x6a, vector" does): .if vector < 128 pushq $(vector) .else pushq $(0xffffffffffffff00+vector) .endif Thanks, Lai