[U-Boot] [PATCH] x86: Force 32-bit jumps in interrupt handlers
Bin Meng
bmeng.cn at gmail.com
Tue Feb 21 06:54:51 UTC 2017
On Fri, Feb 10, 2017 at 11:46 AM, Bin Meng <bmeng.cn at gmail.com> wrote:
> 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>
applied to u-boot-x86, thanks!
More information about the U-Boot
mailing list