• Nathan Chancellor's avatar
    s390/boot: add 'alloc' to info.bin .vmlinux.info section flags · 9ea30fd1
    Nathan Chancellor authored
    When attempting to boot a kernel compiled with OBJCOPY=llvm-objcopy,
    there is a crash right at boot:
    
      Out of memory allocating 6d7800 bytes 8 aligned in range 0:20000000
      Reserved memory ranges:
      0000000000000000 a394c3c30d90cdaf DECOMPRESSOR
      Usable online memory ranges (info source: sclp read info [3]):
      0000000000000000 0000000020000000
      Usable online memory total: 20000000 Reserved: a394c3c30d90cdaf Free: 0
      Call Trace:
      (sp:0000000000033e90 [<0000000000012fbc>] physmem_alloc_top_down+0x5c/0x104)
       sp:0000000000033f00 [<0000000000011d56>] startup_kernel+0x3a6/0x77c
       sp:0000000000033f60 [<00000000000100f4>] startup_normal+0xd4/0xd4
    
    GNU objcopy does not have any issues. Looking at differences between the
    object files in each build reveals info.bin does not get properly
    populated with llvm-objcopy, which results in an empty .vmlinux.info
    section.
    
      $ file {gnu,llvm}-objcopy/arch/s390/boot/info.bin
      gnu-objcopy/arch/s390/boot/info.bin:  data
      llvm-objcopy/arch/s390/boot/info.bin: empty
    
      $ llvm-readelf --section-headers {gnu,llvm}-objcopy/arch/s390/boot/vmlinux | rg 'File:|\.vmlinux\.info|\.decompressor\.syms'
      File: gnu-objcopy/arch/s390/boot/vmlinux
        [12] .vmlinux.info     PROGBITS        0000000000034000 035000 000078 00  WA  0   0  1
        [13] .decompressor.syms PROGBITS       0000000000034078 035078 000b00 00  WA  0   0  1
      File: llvm-objcopy/arch/s390/boot/vmlinux
        [12] .vmlinux.info     PROGBITS        0000000000034000 035000 000000 00  WA  0   0  1
        [13] .decompressor.syms PROGBITS       0000000000034000 035000 000b00 00  WA  0   0  1
    
    Ulrich points out that llvm-objcopy only copies sections marked as alloc
    with a binary output target, whereas the .vmlinux.info section is only
    marked as load. Add 'alloc' in addition to 'load', so that both objcopy
    implementations work properly:
    
      $ file {gnu,llvm}-objcopy/arch/s390/boot/info.bin
      gnu-objcopy/arch/s390/boot/info.bin:  data
      llvm-objcopy/arch/s390/boot/info.bin: data
    
      $ llvm-readelf --section-headers {gnu,llvm}-objcopy/arch/s390/boot/vmlinux | rg 'File:|\.vmlinux\.info|\.decompressor\.syms'
      File: gnu-objcopy/arch/s390/boot/vmlinux
        [12] .vmlinux.info     PROGBITS        0000000000034000 035000 000078 00  WA  0   0  1
        [13] .decompressor.syms PROGBITS       0000000000034078 035078 000b00 00  WA  0   0  1
      File: llvm-objcopy/arch/s390/boot/vmlinux
        [12] .vmlinux.info     PROGBITS        0000000000034000 035000 000078 00  WA  0   0  1
        [13] .decompressor.syms PROGBITS       0000000000034078 035078 000b00 00  WA  0   0  1
    
    Closes: https://github.com/ClangBuiltLinux/linux/issues/1996
    Link: https://github.com/llvm/llvm-project/commit/3c02cb7492fc78fb678264cebf57ff88e478e14fSuggested-by: default avatarUlrich Weigand <ulrich.weigand@de.ibm.com>
    Signed-off-by: default avatarNathan Chancellor <nathan@kernel.org>
    Link: https://lore.kernel.org/r/20240216-s390-fix-boot-with-llvm-objcopy-v1-1-0ac623daf42b@kernel.orgSigned-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
    9ea30fd1
Makefile 4.91 KB