Bladeren bron

x86: Set up the global data pointer in C instead of asm

We currently assume that the global data pointer is at the start of
struct global_data. We want to remove this restriction, and it is
easiest to do this in C.

Remove the asm code and add equivalent code in C.

This idea was proposed by Graeme Russ here:
   http://patchwork.ozlabs.org/patch/199741/

Signed-off-by: Simon Glass <sjg@chromium.org>
[trini: Apply Graeme Russ' comments
http://patchwork.ozlabs.org/patch/206305/ here, re-order]
Signed-off-by: Tom Rini <trini@ti.com>
Simon Glass 12 jaren geleden
bovenliggende
commit
0cecc3b679
2 gewijzigde bestanden met toevoegingen van 3 en 7 verwijderingen
  1. 3 1
      arch/x86/cpu/cpu.c
  2. 0 6
      arch/x86/cpu/start.S

+ 3 - 1
arch/x86/cpu/cpu.c

@@ -100,7 +100,9 @@ void setup_gdt(gd_t *id, u64 *gdt_addr)
 	gdt_addr[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
 	gdt_addr[X86_GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff);
 
 
 	/* FS: data, read/write, 4 GB, base (Global Data Pointer) */
 	/* FS: data, read/write, 4 GB, base (Global Data Pointer) */
-	gdt_addr[X86_GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093, (ulong)id, 0xfffff);
+	id->gd_addr = id;
+	gdt_addr[X86_GDT_ENTRY_32BIT_FS] = GDT_ENTRY(0xc093,
+		     (ulong)&id->gd_addr, 0xfffff);
 
 
 	/* 16-bit CS: code, read/execute, 64 kB, base 0 */
 	/* 16-bit CS: code, read/execute, 64 kB, base 0 */
 	gdt_addr[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff);
 	gdt_addr[X86_GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff);

+ 0 - 6
arch/x86/cpu/start.S

@@ -113,9 +113,6 @@ car_init_ret:
 	/* Set second parameter to setup_gdt */
 	/* Set second parameter to setup_gdt */
 	movl	%esp, %edx
 	movl	%esp, %edx
 
 
-	/* gd->gd_addr = gd (Required to allow gd->xyz to work) */
-	movl	%eax, (%eax)
-
 	/* Setup global descriptor table so gd->xyz works */
 	/* Setup global descriptor table so gd->xyz works */
 	call	setup_gdt
 	call	setup_gdt
 
 
@@ -171,9 +168,6 @@ board_init_f_r_trampoline:
 	/* Set second parameter to setup_gdt */
 	/* Set second parameter to setup_gdt */
 	movl	%esp, %edx
 	movl	%esp, %edx
 
 
-	/* gd->gd_addr = gd (Required to allow gd->xyz to work) */
-	movl	%eax, (%eax)
-
 	/* Setup global descriptor table so gd->xyz works */
 	/* Setup global descriptor table so gd->xyz works */
 	call	setup_gdt
 	call	setup_gdt