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>
This commit is contained in:
parent
a76fc70ee1
commit
303418cc97
|
@ -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…
Reference in New Issue