Skip to content
Snippets Groups Projects
Forked from Reform / reform-boundary-uboot
Source project has a limited visibility.
  • J. Tang's avatar
    3c03f492
    x86: Force 32-bit jumps in interrupt handlers · 3c03f492
    J. Tang authored
    
    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: default avatarJason Tang <tang@jtang.org>
    Reviewed-by: default avatarBin Meng <bmeng.cn@gmail.com>
    3c03f492
    History
    x86: Force 32-bit jumps in interrupt handlers
    J. Tang authored
    
    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: default avatarJason Tang <tang@jtang.org>
    Reviewed-by: default avatarBin Meng <bmeng.cn@gmail.com>