u-boot/arch/x86/cpu/x86_64/cpu.c
Heinrich Schuchardt 2c78a79ec7 x86: put global data pointer into the .data section
On x86_64 the field global_data_ptr is assigned before relocation. As
sections for uninitialized global data (.bss) overlap with the relocation
sections (.rela) this destroys the relocation table and leads to spurious
errors.

Initialization forces the global_data_ptr into a section for initialized
global data (.data) which cannot overlap any .rela section.

Fixes: a160092a61 ("x86: Support global_data on x86_64")
Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Bin Meng <bmeng.cn@gmail.com>
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
2018-10-22 17:51:45 +08:00

81 lines
1.3 KiB
C

// SPDX-License-Identifier: GPL-2.0+
/*
* (C) Copyright 2016 Google, Inc
* Written by Simon Glass <sjg@chromium.org>
*/
#include <common.h>
#include <debug_uart.h>
/*
* Global declaration of gd.
*
* As we write to it before relocation we have to make sure it is not put into
* a .bss section which may overlap a .rela section. Initialization forces it
* into a .data section which cannot overlap any .rela section.
*/
struct global_data *global_data_ptr = (struct global_data *)~0;
void arch_setup_gd(gd_t *new_gd)
{
global_data_ptr = new_gd;
/*
* TODO(sjg@chromium.org): For some reason U-Boot does not boot
* without this line. It fails to start up U-Boot proper and instead
* restarts SPL. Need to figure out why:
*
* U-Boot SPL 2017.01
*
* U-Boot SPL 2017.01
* CPU: Intel(R) Core(TM) i5-3427U CPU @ 1.80GHz
* Trying to boot from SPIJumping to 64-bit U-Boot: Note many
* features are missing
*
* U-Boot SPL 2017.01
*/
#ifdef CONFIG_DEBUG_UART
printch(' ');
#endif
}
int cpu_has_64bit(void)
{
return true;
}
void enable_caches(void)
{
/* Not implemented */
}
void disable_caches(void)
{
/* Not implemented */
}
int dcache_status(void)
{
return true;
}
int x86_mp_init(void)
{
/* Not implemented */
return 0;
}
int misc_init_r(void)
{
return 0;
}
int checkcpu(void)
{
return 0;
}
int print_cpuinfo(void)
{
return 0;
}