aboutsummaryrefslogtreecommitdiff
path: root/arch
diff options
context:
space:
mode:
authorTom Rini <trini@konsulko.com>2018-10-22 13:56:10 -0400
committerTom Rini <trini@konsulko.com>2018-10-22 13:56:10 -0400
commitc95c666d0128e5ec0c161b531c568233a8d3979d (patch)
tree77b5e5f3575b67216190d9f14411f8c692f808f1 /arch
parent88d60db01168c743b4ae4152150a43a3df43c1c0 (diff)
parent3fdfca7a782e7d84bc14cd5d316b4894ec20dcec (diff)
downloadu-boot-c95c666d0128e5ec0c161b531c568233a8d3979d.zip
u-boot-c95c666d0128e5ec0c161b531c568233a8d3979d.tar.gz
u-boot-c95c666d0128e5ec0c161b531c568233a8d3979d.tar.bz2
Merge git://git.denx.de/u-boot-x86
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/config.mk3
-rw-r--r--arch/x86/cpu/quark/Kconfig4
-rw-r--r--arch/x86/cpu/start64.S1
-rw-r--r--arch/x86/cpu/x86_64/cpu.c28
-rw-r--r--arch/x86/lib/bootm.c4
-rw-r--r--arch/x86/lib/relocate.c18
6 files changed, 37 insertions, 21 deletions
diff --git a/arch/x86/config.mk b/arch/x86/config.mk
index cc94071..8151e47 100644
--- a/arch/x86/config.mk
+++ b/arch/x86/config.mk
@@ -23,7 +23,8 @@ endif
ifeq ($(IS_32BIT),y)
PLATFORM_CPPFLAGS += -march=i386 -m32
else
-PLATFORM_CPPFLAGS += $(if $(CONFIG_SPL_BUILD),,-fpic) -fno-common -m64
+PLATFORM_CPPFLAGS += $(if $(CONFIG_SPL_BUILD),,-fpic) -fno-common -march=core2 -m64
+PLATFORM_CPPFLAGS += -mno-mmx -mno-sse
endif
PLATFORM_RELFLAGS += -fdata-sections -ffunction-sections -fvisibility=hidden
diff --git a/arch/x86/cpu/quark/Kconfig b/arch/x86/cpu/quark/Kconfig
index 76f1592..3a18cb0 100644
--- a/arch/x86/cpu/quark/Kconfig
+++ b/arch/x86/cpu/quark/Kconfig
@@ -130,4 +130,8 @@ config SYS_CAR_SIZE
Space in bytes in eSRAM used as Cache-As-ARM (CAR).
Note this size must not exceed eSRAM's total size.
+config X86_TSC_TIMER_EARLY_FREQ
+ int
+ default 400
+
endif
diff --git a/arch/x86/cpu/start64.S b/arch/x86/cpu/start64.S
index a473fd1..a78a331 100644
--- a/arch/x86/cpu/start64.S
+++ b/arch/x86/cpu/start64.S
@@ -20,6 +20,7 @@ _start:
call board_init_f_init_reserve
+ xor %rdi, %rdi
call board_init_f
call board_init_f_r
diff --git a/arch/x86/cpu/x86_64/cpu.c b/arch/x86/cpu/x86_64/cpu.c
index 18b3e94..6c063e8 100644
--- a/arch/x86/cpu/x86_64/cpu.c
+++ b/arch/x86/cpu/x86_64/cpu.c
@@ -7,30 +7,18 @@
#include <common.h>
#include <debug_uart.h>
-/* Global declaration of gd */
-struct global_data *global_data_ptr;
+/*
+ * 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)
diff --git a/arch/x86/lib/bootm.c b/arch/x86/lib/bootm.c
index 54c22fe..832b1f9 100644
--- a/arch/x86/lib/bootm.c
+++ b/arch/x86/lib/bootm.c
@@ -116,6 +116,10 @@ static int boot_prep_linux(bootm_headers_t *images)
char *base_ptr;
base_ptr = (char *)load_zimage(data, len, &load_address);
+ if (!base_ptr) {
+ puts("## Kernel loading failed ...\n");
+ goto error;
+ }
images->os.load = load_address;
cmd_line_dest = base_ptr + COMMAND_LINE_OFFSET;
images->ep = (ulong)base_ptr;
diff --git a/arch/x86/lib/relocate.c b/arch/x86/lib/relocate.c
index ed10755..4d09e4d 100644
--- a/arch/x86/lib/relocate.c
+++ b/arch/x86/lib/relocate.c
@@ -53,6 +53,15 @@ static void do_elf_reloc_fixups64(unsigned int text_base, uintptr_t size,
Elf64_Addr *offset_ptr_ram;
do {
+ unsigned long long type = ELF64_R_TYPE(re_src->r_info);
+
+ if (type != R_X86_64_RELATIVE) {
+ printf("%s: unsupported relocation type 0x%llx "
+ "at %p, ", __func__, type, re_src);
+ printf("offset = 0x%llx\n", re_src->r_offset);
+ continue;
+ }
+
/* Get the location from the relocation entry */
offset_ptr_rom = (Elf64_Addr *)(uintptr_t)re_src->r_offset;
@@ -91,6 +100,15 @@ static void do_elf_reloc_fixups32(unsigned int text_base, uintptr_t size,
Elf32_Addr *offset_ptr_ram;
do {
+ unsigned int type = ELF32_R_TYPE(re_src->r_info);
+
+ if (type != R_386_RELATIVE) {
+ printf("%s: unsupported relocation type 0x%x "
+ "at %p, ", __func__, type, re_src);
+ printf("offset = 0x%x\n", re_src->r_offset);
+ continue;
+ }
+
/* Get the location from the relocation entry */
offset_ptr_rom = (Elf32_Addr *)(uintptr_t)re_src->r_offset;