aboutsummaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/i386/reset16.inc24
1 files changed, 9 insertions, 15 deletions
diff --git a/src/cpu/i386/reset16.inc b/src/cpu/i386/reset16.inc
index 7ea92774b6..d36c94085e 100644
--- a/src/cpu/i386/reset16.inc
+++ b/src/cpu/i386/reset16.inc
@@ -3,25 +3,19 @@
.globl reset_vector
reset_vector:
#if _ROMBASE >= 0xffff0000
- /* Hmm.
- * _start_offset is the low 16 bits of _start.
- * Theoretically we should have problems but it compiles
- * and links properly with binutils 2.9.5 & 2.10.90
- * This is probably a case that needs fixing in binutils.
- * And then we can just use _start.
- * We also need something like the assume directive in
- * other assemblers to tell it where the segment registers
- * are pointing in memory right now.
+ /* jmp _start */
+ .byte 0xe9
+ .int _start - ( . + 2 )
+ /* Note: The above jump is hand coded to work around bugs in binutils.
+ * 5 byte are used for a 3 byte instruction. This works because x86
+ * is little endian and allows us to use supported 32bit relocations
+ * instead of the weird 16 bit relocations that binutils does not
+ * handle consistenly between versions because they are used so rarely.
*/
- jmp _start
-#elif (_ROMBASE < 0x100000)
- ljmp $((_ROMBASE & 0xf0000)>>4),$_start_offse);
#else
-#error _ROMBASE is an unsupported value
+# error _ROMBASE is an unsupported value
#endif
-
. = 0x8;
.code32
jmp protected_start
-
.previous