From 61b29a9b7227fedea5e53cd0456849d5f20be79b Mon Sep 17 00:00:00 2001 From: Eric Biederman Date: Wed, 16 Jul 2003 01:58:18 +0000 Subject: [PATCH] - Commit a binutils safe version of reset16.inc git-svn-id: svn://svn.coreboot.org/coreboot/trunk@964 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- src/cpu/i386/reset16.inc | 24 +++++++++--------------- 1 file 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