diff options
author | Graeme Russ <graeme.russ@gmail.com> | 2010-04-24 00:05:43 +1000 |
---|---|---|
committer | Wolfgang Denk <wd@denx.de> | 2010-05-06 00:15:43 +0200 |
commit | c14a3669b22d3e430b416cdee92b751f13697a1f (patch) | |
tree | e3f4618a7f39951848f123dd717533d77ae5eec6 /arch/i386/cpu/start16.S | |
parent | 077e1958ca4afe12d88043b123ded058c51b89f7 (diff) | |
download | u-boot-imx-c14a3669b22d3e430b416cdee92b751f13697a1f.zip u-boot-imx-c14a3669b22d3e430b416cdee92b751f13697a1f.tar.gz u-boot-imx-c14a3669b22d3e430b416cdee92b751f13697a1f.tar.bz2 |
x86: Move GDT to a safe location in RAM
Currently, the GDT is either located in FLASH or in the non-relocated
U-Boot image in RAM. Both of these locations are unsafe as those
locations can be erased during a U-Boot update. Move the GDT into the
highest available memory location and relocate U-Boot to just below it
Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
Diffstat (limited to 'arch/i386/cpu/start16.S')
-rw-r--r-- | arch/i386/cpu/start16.S | 21 |
1 files changed, 7 insertions, 14 deletions
diff --git a/arch/i386/cpu/start16.S b/arch/i386/cpu/start16.S index 5e33aa1..3e8b2cc 100644 --- a/arch/i386/cpu/start16.S +++ b/arch/i386/cpu/start16.S @@ -44,7 +44,7 @@ board_init16_ret: movl %eax, %cr0 wbinvd - /* load the descriptor tables */ + /* load the temporary Global Descriptor Table */ o32 cs lgdt gdt_ptr /* Now, we enter protected mode */ @@ -68,8 +68,13 @@ code32start: .long _start /* offset */ .word 0x10 /* segment */ +/* + * The following Global Descriptor Table is just enough to get us into + * 'Flat Protected Mode' - It will be discarded as soon as the final + * GDT is setup in a safe location in RAM + */ gdt_ptr: - .word 0x30 /* limit (48 bytes = 6 GDT entries) */ + .word 0x20 /* limit (32 bytes = 4 GDT entries) */ .long BOOT_SEG + gdt /* base */ /* The GDT table ... @@ -79,8 +84,6 @@ gdt_ptr: * 0x08 Unused * 0x10 32bit code * 0x18 32bit data/stack - * 0x20 16bit code - * 0x28 16bit data/stack */ gdt: @@ -96,13 +99,3 @@ gdt: .word 0x0 /* base address = 0 */ .word 0x9300 /* data read/write */ .word 0x00CF /* granularity = 4096, 386 (+5th nibble of limit) */ - - .word 0xFFFF /* 64kb */ - .word 0 /* base address = 0 */ - .word 0x9b00 /* data read/write */ - .word 0x0010 /* granularity = 1 (+5th nibble of limit) */ - - .word 0xFFFF /* 64kb */ - .word 0 /* base address = 0 */ - .word 0x9300 /* data read/write */ - .word 0x0010 /* granularity = 1 (+5th nibble of limit) */ |