|
|
|
@ -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; |
|
|
|
|