summaryrefslogtreecommitdiff
path: root/arch/i386/cpu/start16.S
diff options
context:
space:
mode:
authorGraeme Russ <graeme.russ@gmail.com>2010-04-24 00:05:43 +1000
committerWolfgang Denk <wd@denx.de>2010-05-06 00:15:43 +0200
commitc14a3669b22d3e430b416cdee92b751f13697a1f (patch)
treee3f4618a7f39951848f123dd717533d77ae5eec6 /arch/i386/cpu/start16.S
parent077e1958ca4afe12d88043b123ded058c51b89f7 (diff)
downloadu-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.S21
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) */