x86: Ensure IDT and GDT remain 16-byte aligned post relocation

Some CPUs have strict alignment requirements for these tables

Signed-off-by: Graeme Russ <graeme.russ@gmail.com>
master
Graeme Russ 13 years ago
parent a76fc70ee1
commit 303418cc97
  1. 2
      arch/x86/cpu/interrupts.c
  2. 17
      arch/x86/lib/board.c

@ -174,7 +174,7 @@ struct desc_ptr {
unsigned short segment; unsigned short segment;
} __packed; } __packed;
struct idt_entry idt[256]; struct idt_entry idt[256] __attribute__((aligned(16)));
struct desc_ptr idt_ptr; struct desc_ptr idt_ptr;

@ -161,19 +161,26 @@ gd_t *gd;
static int calculate_relocation_address(void) static int calculate_relocation_address(void)
{ {
void *text_start = &__text_start; ulong text_start = (ulong)&__text_start;
void *bss_end = &__bss_end; ulong bss_end = (ulong)&__bss_end;
void *dest_addr; ulong dest_addr;
ulong rel_offset; ulong rel_offset;
/* Calculate destination RAM Address and relocation 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 -= CONFIG_SYS_STACK_SIZE;
dest_addr -= (bss_end - text_start); 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; rel_offset = dest_addr - text_start;
gd->start_addr_sp = gd->ram_size; gd->start_addr_sp = gd->ram_size;
gd->relocaddr = (ulong)dest_addr; gd->relocaddr = dest_addr;
gd->reloc_off = rel_offset; gd->reloc_off = rel_offset;
return 0; return 0;

Loading…
Cancel
Save