• Liao Chang's avatar
    kexec_file: Fix kexec_file.c build error for riscv platform · 4853f68d
    Liao Chang authored
    When CONFIG_KEXEC_FILE is set for riscv platform, the compilation of
    kernel/kexec_file.c generate build error:
    
    kernel/kexec_file.c: In function 'crash_prepare_elf64_headers':
    ./arch/riscv/include/asm/page.h:110:71: error: request for member 'virt_addr' in something not a structure or union
      110 |  ((x) >= PAGE_OFFSET && (!IS_ENABLED(CONFIG_64BIT) || (x) < kernel_map.virt_addr))
          |                                                                       ^
    ./arch/riscv/include/asm/page.h:131:2: note: in expansion of macro 'is_linear_mapping'
      131 |  is_linear_mapping(_x) ?       \
          |  ^~~~~~~~~~~~~~~~~
    ./arch/riscv/include/asm/page.h:140:31: note: in expansion of macro '__va_to_pa_nodebug'
      140 | #define __phys_addr_symbol(x) __va_to_pa_nodebug(x)
          |                               ^~~~~~~~~~~~~~~~~~
    ./arch/riscv/include/asm/page.h:143:24: note: in expansion of macro '__phys_addr_symbol'
      143 | #define __pa_symbol(x) __phys_addr_symbol(RELOC_HIDE((unsigned long)(x), 0))
          |                        ^~~~~~~~~~~~~~~~~~
    kernel/kexec_file.c:1327:36: note: in expansion of macro '__pa_symbol'
     1327 |   phdr->p_offset = phdr->p_paddr = __pa_symbol(_text);
    
    This occurs is because the "kernel_map" referenced in macro
    is_linear_mapping()  is suppose to be the one of struct kernel_mapping
    defined in arch/riscv/mm/init.c, but the 2nd argument of
    crash_prepare_elf64_header() has same symbol name, in expansion of macro
    is_linear_mapping in function crash_prepare_elf64_header(), "kernel_map"
    actually is the local variable.
    Signed-off-by: default avatarLiao Chang <liaochang1@huawei.com>
    Link: https://lore.kernel.org/r/20220408100914.150110-2-lizhengyu3@huawei.comSigned-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
    4853f68d
kexec_file.c 33.6 KB