acrn-hypervisor/hypervisor/bsp/ld/link_ram.ld.in
Zide Chen 49ffe168af hv: fixup relocation delta for symbols belong to entry section
This is to enable relocation for code32.

- RIP relative addressing is available in x86-64 only so we manually add
  relocation delta to the target symbols to fixup code32.

- both code32 and code64 need to load GDT hence both need to fixup GDT
  pointer. This patch declares separate GDT pointer cpu_primary64_gdt_ptr
  for code64 to avoid double fixup.

- manually fixup cpu_primary64_gdt_ptr in code64, but not rely on relocate()
  to do that. Otherwise it's very confusing that symbols from same file could
  be fixed up externally by relocate() or self-relocated.

- to make it clear, define a new symbol ld_entry_end representing the end of
  the boot code that needs manually fixup, and use this symbol in relocate()
  to filter out all symbols belong to the entry sections.

Tracked-On: #4441
Reviewed-by: Fengwei Yin <fengwei.yin@intel.com>
Signed-off-by: Zide Chen <zide.chen@intel.com>
2020-03-06 08:27:46 +08:00

96 lines
1.6 KiB
Plaintext

ENTRY(cpu_primary_start_32)
MEMORY
{
/* Low 1MB of memory for secondary processor start-up */
lowram : ORIGIN = 0, LENGTH = CONFIG_LOW_RAM_SIZE
/* 32 MBytes of RAM for HV */
ram : ORIGIN = CONFIG_HV_RAM_START, LENGTH = CONFIG_HV_RAM_SIZE
}
SECTIONS
{
.boot :
{
_ld_ram_start = . ;
KEEP(*(multiboot_header)) ;
} > ram
.entry :
{
KEEP(*(entry)) ;
ld_entry_end = . ;
} > ram
.text :
{
*(.text .text*) ;
*(.gnu.linkonce.t*)
*(.note.gnu.build-id)
*(.retpoline_thunk)
} > ram
/*Align text top boundary to 2MBytes.*/
. = ALIGN(0x200000);
ld_text_end = . ;
.rodata :
{
*(.rodata*) ;
} > ram
.rela :
{
*(.rela*)
*(.dyn*)
} > ram
. = ALIGN(4) ;
ld_trampoline_load = .;
.trampoline : AT (ld_trampoline_load)
{
ld_trampoline_start = .;
*(.trampoline_reset);
. = ALIGN(4);
ld_trampoline_end = .;
} > lowram
ld_trampoline_size = ld_trampoline_end - ld_trampoline_start;
.data (ld_trampoline_load + ld_trampoline_size):
{
*(.data) ;
*(.data*) ;
*(.sdata)
*(.gnu.linkonce.d*)
} > ram
.bss_noinit (NOLOAD):
{
. = ALIGN(4) ;
*(.bss_noinit) ;
*(.bss_noinit*) ;
. = ALIGN(4) ;
} > ram
.bss (NOLOAD):
{
. = ALIGN(4) ;
ld_bss_start = . ;
*(.bss) ;
*(.bss*) ;
*(COMMON) ;
. = ALIGN(4) ;
ld_bss_end = . ;
} > ram
_ld_ram_size = LENGTH(ram) ;
_ld_ram_end = _ld_ram_size + _ld_ram_start ;
}