[PATCH] arm64: fix an issue with kaslr-enabled vmlinux

Goel, Sameer sgoel at codeaurora.org
Fri Feb 2 10:34:37 PST 2018


I tested this fix and it works well. I am wondering which kexec tool release will pick this fix?

On 8/24/2017 1:32 AM, AKASHI Takahiro wrote:
> Normally vmlinux for arm64 is of ET_EXEC type, while if built with
> CONFIG_RANDAMIZE_BASE (that is KASLR), it will be of ET_DYN type.
> Meanwhile, physical address field of segments in vmlinux has actually
> the same value as virtual address field.
> 
> Accordingly, in this case, it totally makes no sense to check for
> validity of segments against physical memory ranges and, if necessary,
> relocate them in elf_exec_load() on arm64.
> 
> This patch allows to unconditionally skip the check on arm64.
> 
> Signed-off-by: AKASHI Takahiro <takahiro.akashi at linaro.org>
> ---
>  include/elf.h          | 3 ++-
>  kexec/kexec-elf-exec.c | 6 +++++-
>  2 files changed, 7 insertions(+), 2 deletions(-)
> 
> diff --git a/include/elf.h b/include/elf.h
> index 5db637b..b7677a2 100644
> --- a/include/elf.h
> +++ b/include/elf.h
> @@ -258,7 +258,8 @@ typedef struct
>  #define EM_OPENRISC	92		/* OpenRISC 32-bit embedded processor */
>  #define EM_ARC_A5	93		/* ARC Cores Tangent-A5 */
>  #define EM_XTENSA	94		/* Tensilica Xtensa Architecture */
> -#define EM_NUM		95
> +#define EM_AARCH64	183		/* ARM AARCH64 */
> +#define EM_NUM		184
>  
>  /* If it is necessary to assign new unofficial EM_* values, please
>     pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
> diff --git a/kexec/kexec-elf-exec.c b/kexec/kexec-elf-exec.c
> index cb62d04..a9329ac 100644
> --- a/kexec/kexec-elf-exec.c
> +++ b/kexec/kexec-elf-exec.c
> @@ -63,9 +63,13 @@ int elf_exec_load(struct mem_ehdr *ehdr, struct kexec_info *info)
>  
>  	/* If I have a dynamic executable find it's size
>  	 * and then find a location for it in memory.
> +	 * Note on arm64:
> +	 * arm64's vmlinux has virtual address in physical address
> +	 * field of PT_LOAD segments. So the following validity check
> +	 * and relocation makes no sense on arm64.
>  	 */
>  	base = 0;
> -	if (ehdr->e_type == ET_DYN) {
> +	if ((ehdr->e_machine != EM_AARCH64) && (ehdr->e_type == ET_DYN)) {
>  		unsigned long first, last, align;
>  		first = ULONG_MAX;
>  		last  = 0;
> 

-- 
 Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.



More information about the kexec mailing list