lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:   Fri, 20 May 2022 08:45:19 -0700 (PDT)
From:   Palmer Dabbelt <palmer@...belt.com>
To:     lizhengyu3@...wei.com
CC:     liaochang1@...wei.com, alex@...ti.fr, aou@...s.berkeley.edu,
        Bjorn Topel <bjorn.topel@...il.com>, ebiederm@...ssion.com,
        guoren@...ux.alibaba.com, jszhang@...nel.org,
        kexec@...ts.infradead.org, linux-kernel@...r.kernel.org,
        linux-riscv@...ts.infradead.org, mick@....forth.gr,
        Paul Walmsley <paul.walmsley@...ive.com>, penberg@...nel.org,
        sunnanyong@...wei.com, wangkefeng.wang@...wei.com
Subject:     Re: [PATCH v3 -next 1/6] kexec_file: Fix kexec_file.c build error for riscv platform

On Fri, 08 Apr 2022 03:09:09 PDT (-0700), lizhengyu3@...wei.com wrote:
> From: Liao Chang <liaochang1@...wei.com>
>
> 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: Liao Chang <liaochang1@...wei.com>
> ---
>  include/linux/kexec.h | 2 +-
>  kernel/kexec_file.c   | 4 ++--
>  2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/include/linux/kexec.h b/include/linux/kexec.h
> index 58d1b58a971e..ebb1bffbf068 100644
> --- a/include/linux/kexec.h
> +++ b/include/linux/kexec.h
> @@ -227,7 +227,7 @@ struct crash_mem {
>  extern int crash_exclude_mem_range(struct crash_mem *mem,
>  				   unsigned long long mstart,
>  				   unsigned long long mend);
> -extern int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
> +extern int crash_prepare_elf64_headers(struct crash_mem *mem, int need_kernel_map,
>  				       void **addr, unsigned long *sz);
>  #endif /* CONFIG_KEXEC_FILE */
>
> diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c
> index 8347fc158d2b..331a4f0f10f5 100644
> --- a/kernel/kexec_file.c
> +++ b/kernel/kexec_file.c
> @@ -1260,7 +1260,7 @@ int crash_exclude_mem_range(struct crash_mem *mem,
>  	return 0;
>  }
>
> -int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
> +int crash_prepare_elf64_headers(struct crash_mem *mem, int need_kernel_map,
>  			  void **addr, unsigned long *sz)
>  {
>  	Elf64_Ehdr *ehdr;
> @@ -1324,7 +1324,7 @@ int crash_prepare_elf64_headers(struct crash_mem *mem, int kernel_map,
>  	phdr++;
>
>  	/* Prepare PT_LOAD type program header for kernel text region */
> -	if (kernel_map) {
> +	if (need_kernel_map) {
>  		phdr->p_type = PT_LOAD;
>  		phdr->p_flags = PF_R|PF_W|PF_X;
>  		phdr->p_vaddr = (unsigned long) _text;

IMO this is fine: we could rename all the kernel_map stuff in 
arch/riscv, but this is much more self-contained.  It's not been ack'd 
by anyone else, but get_maintainers just suggests the kexec@ list so I'm 
going to take it via the RISC-V tree along with the rest of these.

Thanks!

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ