x86: Fix car_uninit weak symbol definition
authorBin Meng <bmeng.cn@gmail.com>
Thu, 25 Oct 2018 10:05:37 +0000 (03:05 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Sun, 28 Oct 2018 13:02:15 +0000 (21:02 +0800)
Since commit 80df194f0165 ("x86: detect unsupported relocation types"),
an error message is seen on QEMU x86 target during boot:

do_elf_reloc_fixups32: unsupported relocation type 0x1 at fff841f0, offset = 0xfff00087
do_elf_reloc_fixups32: unsupported relocation type 0x2 at fff841f8, offset = 0xfff00091

Check offset 0xfff00087 and 0xfff00091 in the u-boot ELF image,

fff00087  000df401 R_386_32          00000000   car_uninit
fff00091  000df402 R_386_PC32        00000000   car_uninit

we see R_386_32 and R_386_PC32 relocation type is generated for
symbol car_uninit, which is declared as a weak symbol in start.S.

However the actual weak symbol implementation ends up nowhere. As
we can see below, it's *UND*.

$ objdump -t u-boot | grep car_uninit
00000000  w      *UND*  00000000 car_uninit

With this fix, it is normal now.

$ objdump -t u-boot | grep car_uninit
fff00094  w    F .text.start    00000001 car_uninit

Reported-by: Hannes Schmelzer <hannes@schmelzer.or.at>
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Tested-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
Tested-by: Hannes Schmelzer <oe5hpm@oevsv.at>
arch/x86/cpu/start.S

index e1f634f..30fa7de 100644 (file)
@@ -16,6 +16,7 @@
 #include <asm/processor-flags.h>
 #include <generated/generic-asm-offsets.h>
 #include <generated/asm-offsets.h>
+#include <linux/linkage.h>
 
 .section .text.start
 .code32
@@ -184,13 +185,8 @@ board_init_f_r_trampoline:
        movl    %eax, %esp
 
        /* See if we need to disable CAR */
-.weak  car_uninit
-       movl    $car_uninit, %eax
-       cmpl    $0, %eax
-       jz      1f
-
        call    car_uninit
-1:
+
        /* Re-enter U-Boot by calling board_init_f_r() */
        call    board_init_f_r
 
@@ -199,6 +195,10 @@ die:
        jmp     die
        hlt
 
+WEAK(car_uninit)
+       ret
+ENDPROC(car_uninit)
+
 blank_idt_ptr:
        .word   0               /* limit */
        .long   0               /* base */