All of lore.kernel.org
 help / color / mirror / Atom feed
From: Graeme Russ <graeme.russ@gmail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading
Date: Mon,  2 Jan 2012 15:09:21 +1100	[thread overview]
Message-ID: <1325477374-6417-5-git-send-email-graeme.russ@gmail.com> (raw)
In-Reply-To: <1325477374-6417-1-git-send-email-graeme.russ@gmail.com>


Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
 arch/x86/cpu/cpu.c |   82 +++++++++++++++++++++++++++++++++------------------
 1 files changed, 53 insertions(+), 29 deletions(-)

diff --git a/arch/x86/cpu/cpu.c b/arch/x86/cpu/cpu.c
index 61d0b69..bf55c26 100644
--- a/arch/x86/cpu/cpu.c
+++ b/arch/x86/cpu/cpu.c
@@ -55,35 +55,39 @@ struct gdt_ptr {
 	u32 ptr;
 } __packed;
 
-static void reload_gdt(void)
+static void load_ds(u32 segment)
 {
-	/*
-	 * There are machines which are known to not boot with the GDT
-	 * being 8-byte unaligned.  Intel recommends 16 byte alignment
-	 */
-	static const u64 boot_gdt[] __attribute__((aligned(16))) = {
-		/* CS: code, read/execute, 4 GB, base 0 */
-		[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
-		/* DS: data, read/write, 4 GB, base 0 */
-		[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
-		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
-		[GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
-		/* 16-bit DS: data, read/write, 64 kB, base 0 */
-		[GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
-	};
-	static struct gdt_ptr gdt;
-
-	gdt.len = sizeof(boot_gdt)-1;
-	gdt.ptr = (u32)&boot_gdt;
-
-	asm volatile("lgdtl %0\n" \
-		     "movl $((2+1)*8), %%ecx\n" \
-		     "movl %%ecx, %%ds\n" \
-		     "movl %%ecx, %%es\n" \
-		     "movl %%ecx, %%fs\n" \
-		     "movl %%ecx, %%gs\n" \
-		     "movl %%ecx, %%ss" \
-		     : : "m" (gdt) : "ecx");
+	asm volatile("movl %0, %%ds" : : "r" (segment * 8));
+}
+
+static void load_es(u32 segment)
+{
+	asm volatile("movl %0, %%es" : : "r" (segment * 8));
+}
+
+static void load_fs(u32 segment)
+{
+	asm volatile("movl %0, %%fs" : : "r" (segment * 8));
+}
+
+static void load_gs(u32 segment)
+{
+	asm volatile("movl %0, %%gs" : : "r" (segment * 8));
+}
+
+static void load_ss(u32 segment)
+{
+	asm volatile("movl %0, %%ss" : : "r" (segment * 8));
+}
+
+static void load_gdt(const u64 *boot_gdt, u16 num_entries)
+{
+	struct gdt_ptr gdt;
+
+	gdt.len = (num_entries * 8) - 1;
+	gdt.ptr = (u32)boot_gdt;
+
+	asm volatile("lgdtl %0\n" : : "m" (gdt));
 }
 
 int x86_cpu_init_f(void)
@@ -113,7 +117,27 @@ int x86_cpu_init_r(void)
 	    "movl	%%eax, %%cr0\n"
 	    "wbinvd\n" : : "i" (nw_cd_rst) : "eax");
 
-	reload_gdt();
+	/*
+	 * There are machines which are known to not boot with the GDT
+	 * being 8-byte unaligned. Intel recommends 16 byte alignment
+	 */
+	static const u64 boot_gdt[] __aligned(16) = {
+		/* CS: code, read/execute, 4 GB, base 0 */
+		[GDT_ENTRY_32BIT_CS] = GDT_ENTRY(0xc09b, 0, 0xfffff),
+		/* DS: data, read/write, 4 GB, base 0 */
+		[GDT_ENTRY_32BIT_DS] = GDT_ENTRY(0xc093, 0, 0xfffff),
+		/* 16-bit CS: code, read/execute, 64 kB, base 0 */
+		[GDT_ENTRY_16BIT_CS] = GDT_ENTRY(0x109b, 0, 0x0ffff),
+		/* 16-bit DS: data, read/write, 64 kB, base 0 */
+		[GDT_ENTRY_16BIT_DS] = GDT_ENTRY(0x1093, 0, 0x0ffff),
+	};
+
+	load_gdt(boot_gdt, GDT_NUM_ENTRIES);
+	load_ds(GDT_ENTRY_32BIT_DS);
+	load_es(GDT_ENTRY_32BIT_DS);
+	load_fs(GDT_ENTRY_32BIT_DS);
+	load_gs(GDT_ENTRY_32BIT_DS);
+	load_ss(GDT_ENTRY_32BIT_DS);
 
 	/* Initialize core interrupt and exception functionality of CPU */
 	cpu_init_interrupts();
-- 
1.7.5.2.317.g391b14

  parent reply	other threads:[~2012-01-02  4:09 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-02  4:09 [U-Boot] [PATCH 00/17] x86: Rework of board init code (plus support patches) Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 01/17] x86: Import glibc memcpy implementation Graeme Russ
2012-01-04  5:18   ` Simon Glass
2012-01-04 19:59   ` [U-Boot] [PATCH v2 " Graeme Russ
2012-01-04 19:59     ` [U-Boot] [PATCH v2 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
2012-01-04 20:04       ` Graeme Russ
2012-01-12  4:45       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 03/17] x86: Remove GDR related magic numbers Graeme Russ
2012-01-07 22:05       ` Simon Glass
2012-01-12  4:46       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 04/17] x86: Rework Global Descriptor Table loading Graeme Russ
2012-01-12  4:47       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
2012-01-12  4:48       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 06/17] x86: Rework relocation calculations Graeme Russ
2012-01-12  4:49       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 07/17] x86: Use fs for global data Graeme Russ
2012-01-12  4:51       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
2012-01-12  4:51       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 09/17] x86: Create weak init_cache() and default enable_caches() functions Graeme Russ
2012-01-12  4:55       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 10/17] x86: Allow cache before copy to RAM Graeme Russ
2012-01-12  4:56       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 11/17] x86: Tweak IDT and GDT for alignment and readability Graeme Russ
2012-01-12  5:00       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
2012-01-12  5:01       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
2012-01-12  5:01       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
2012-01-12  5:02       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 15/17] x86: Move relocation code " Graeme Russ
2012-01-07 22:15       ` Simon Glass
2012-01-08  9:04         ` Graeme Russ
2012-01-08 17:59           ` Simon Glass
2012-01-12  5:03       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 16/17] x86: Split init functions " Graeme Russ
2012-01-12  5:03       ` Simon Glass
2012-01-04 19:59     ` [U-Boot] [PATCH v2 17/17] x86: Convert board_init_f_r to a processing loop Graeme Russ
2012-01-07 22:21       ` Simon Glass
2012-01-08  9:10         ` Graeme Russ
2012-01-08 18:01           ` Simon Glass
2012-01-12  5:04       ` Simon Glass
2012-01-12  4:44     ` [U-Boot] [PATCH v2 01/17] x86: Import glibc memcpy implementation Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 02/17] x86: Speed up copy-to-RAM and clear BSS operations Graeme Russ
2012-01-04  5:21   ` Simon Glass
2012-01-04 10:04     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 03/17] x86: Remove GDR related magic numbers Graeme Russ
2012-01-04  5:23   ` Simon Glass
2012-01-04 10:20     ` Graeme Russ
2012-01-02  4:09 ` Graeme Russ [this message]
2012-01-04  5:24   ` [U-Boot] [PATCH 04/17] x86: Rework Global Descriptor Table loading Simon Glass
2012-01-04 10:30     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 05/17] x86: Simplify Flash-to-RAM code execution transition Graeme Russ
2012-01-04  5:28   ` Simon Glass
2012-01-04 10:59     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 06/17] x86: Rework relocation calcuations Graeme Russ
2012-01-04  5:30   ` Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 07/17] x86: Use fs for global data Graeme Russ
2012-01-04  5:36   ` Simon Glass
2012-01-04 11:14     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 08/17] x86: Set GD_FLG_RELOC after entering in-RAM copy of U-Boot Graeme Russ
2012-01-04  5:37   ` Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 09/17] x86: Create weak init_cache() function Graeme Russ
2012-01-04  5:38   ` Simon Glass
2012-01-04 11:25     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 10/17] x86: Allow cache before copy to RAM Graeme Russ
2012-01-04  5:40   ` Simon Glass
2012-01-04 11:29     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 11/17] CHECKPATCH: arch/x86/cpu/* Graeme Russ
2012-01-04  5:42   ` Simon Glass
2012-01-04 11:35     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 12/17] CHECKPATCH: arch/x86/lib/* Graeme Russ
2012-01-04  5:47   ` Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 13/17] x86: Move do_go_exec() out of board.c Graeme Russ
2012-01-04  5:48   ` Simon Glass
2012-01-02  4:09 ` [U-Boot] [PATCH 14/17] x86: Move setup_pcat_compatibility() " Graeme Russ
2012-01-04  5:48   ` Simon Glass
2012-01-04 11:38     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 15/17] x86: Move relocation code " Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 16/17] x86: Simplify board.c Graeme Russ
2012-01-04  5:51   ` Simon Glass
2012-01-04 11:50     ` Graeme Russ
2012-01-02  4:09 ` [U-Boot] [PATCH 17/17] x86: Tweak initialisation procedure Graeme Russ
2012-01-04  5:52   ` Simon Glass
2012-01-04 12:02     ` Graeme Russ

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1325477374-6417-5-git-send-email-graeme.russ@gmail.com \
    --to=graeme.russ@gmail.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.