[U-Boot] [PATCH] x86: Force 32-bit jumps in interrupt handlers
Bin Meng
bmeng.cn at gmail.com
Fri Feb 10 03:46:02 UTC 2017
On Fri, Feb 10, 2017 at 10:54 AM, J. Tang <tang at jtang.org> wrote:
> Depending upon the compiler used, IRQ entries could vary in sizes. With
> GCC 5.x, the code generator will use short jumps for some IRQ entries
> but near jumps for others. For example, GCC 5.4.0 generates the
> following:
>
> $ objdump -d interrupt.o
> <snip>
> 00000207 <irq_18>:
> 207: 6a 12 push $0x12
> 209: eb 85 jmp 190 <irq_common_entry>
>
> 0000020b <irq_19>:
> 20b: 6a 13 push $0x13
> 20d: eb 81 jmp 190 <irq_common_entry>
>
> 0000020f <irq_20>:
> 20f: 6a 14 push $0x14
> 211: e9 7a ff ff ff jmp 190 <irq_common_entry>
>
> 00000216 <irq_21>:
> 216: 6a 15 push $0x15
> 218: e9 73 ff ff ff jmp 190 <irq_common_entry>
>
> This causes a problem in cpu_init_interrupts(), because the IDT setup
> assumed same sizes for all IRQ entries. GCC 4.x always generated 32-bit
> jumps, so this previously was not a problem.
>
> The fix is to force 32-bit near jumps for all entries within the
> inline assembly. This works for GCC 5.x, and 4.x was already using
> that form of jumping.
>
> Signed-off-by: Jason Tang <tang at jtang.org>
> ---
> arch/x86/cpu/i386/interrupt.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
Reviewed-by: Bin Meng <bmeng.cn at gmail.com>
More information about the U-Boot
mailing list