Skip to content
Snippets Groups Projects
Commit 3c03f492 authored by J. Tang's avatar J. Tang Committed by Bin Meng
Browse files

x86: Force 32-bit jumps in interrupt handlers


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>
parent 66c246cc
No related branches found
No related tags found
No related merge requests found
...@@ -28,7 +28,7 @@ DECLARE_GLOBAL_DATA_PTR; ...@@ -28,7 +28,7 @@ DECLARE_GLOBAL_DATA_PTR;
".type irq_"#x", @function\n" \ ".type irq_"#x", @function\n" \
"irq_"#x":\n" \ "irq_"#x":\n" \
"pushl $"#x"\n" \ "pushl $"#x"\n" \
"jmp irq_common_entry\n" "jmp.d32 irq_common_entry\n"
static char *exceptions[] = { static char *exceptions[] = {
"Divide Error", "Divide Error",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment