diff mbox

[U-Boot,v2,10/12] x86: Ensure IDT and GDT remain 16-byte aligned post relocation

Message ID 1320755603-8695-11-git-send-email-graeme.russ@gmail.com
State Accepted
Delegated to: Graeme Russ
Headers show

Commit Message

Graeme Russ Nov. 8, 2011, 12:33 p.m. UTC
Some CPUs have strict alignment requirements for these tables

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
---
Changes for v1:
 - None (skipped to set single version for consolidated series)
Changes for v2:
 - Consolidated patch series

 arch/x86/cpu/interrupts.c |    2 +-
 arch/x86/lib/board.c      |   17 ++++++++++++-----
 2 files changed, 13 insertions(+), 6 deletions(-)

--
1.7.5.2.317.g391b14

Comments

Graeme Russ Nov. 12, 2011, 10:12 a.m. UTC | #1
On 08/11/11 23:33, Graeme Russ wrote:
> Some CPUs have strict alignment requirements for these tables
> 
> Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
> ---
> Changes for v1:
>  - None (skipped to set single version for consolidated series)
> Changes for v2:
>  - Consolidated patch series
> 
>  arch/x86/cpu/interrupts.c |    2 +-
>  arch/x86/lib/board.c      |   17 ++++++++++++-----
>  2 files changed, 13 insertions(+), 6 deletions(-)

Applied to u-boot-x86

Thanks,

Graeme
diff mbox

Patch

diff --git a/arch/x86/cpu/interrupts.c b/arch/x86/cpu/interrupts.c
index e007511..e0958eb 100644
--- a/arch/x86/cpu/interrupts.c
+++ b/arch/x86/cpu/interrupts.c
@@ -174,7 +174,7 @@  struct desc_ptr {
 	unsigned short segment;
 } __packed;

-struct idt_entry idt[256];
+struct idt_entry idt[256] __attribute__((aligned(16)));

 struct desc_ptr idt_ptr;

diff --git a/arch/x86/lib/board.c b/arch/x86/lib/board.c
index b445179..244a021 100644
--- a/arch/x86/lib/board.c
+++ b/arch/x86/lib/board.c
@@ -161,19 +161,26 @@  gd_t *gd;

 static int calculate_relocation_address(void)
 {
-	void *text_start = &__text_start;
-	void *bss_end = &__bss_end;
-	void *dest_addr;
+	ulong text_start = (ulong)&__text_start;
+	ulong bss_end = (ulong)&__bss_end;
+	ulong dest_addr;
 	ulong rel_offset;

 	/* Calculate destination RAM Address and relocation offset */
-	dest_addr = (void *)gd->ram_size;
+	dest_addr = gd->ram_size;
 	dest_addr -= CONFIG_SYS_STACK_SIZE;
 	dest_addr -= (bss_end - text_start);
+
+	/*
+	 * Round destination address down to 16-byte boundary to keep
+	 * IDT and GDT 16-byte aligned
+	 */
+	dest_addr &= ~15;
+
 	rel_offset = dest_addr - text_start;

 	gd->start_addr_sp = gd->ram_size;
-	gd->relocaddr = (ulong)dest_addr;
+	gd->relocaddr = dest_addr;
 	gd->reloc_off = rel_offset;

 	return 0;