[Crash-utility] [PATCH] arm64: use the vmcore info to get module/vmalloc/vmemmap ranges

HAGIO KAZUHITO(萩尾 一仁) k-hagio-ab at nec.com
Mon Mar 14 05:22:37 UTC 2022


-----Original Message-----
> The kernel patch has been merged:
>      "arm64: crash_core: Export MODULES, VMALLOC, and VMEMMAP ranges"
>      https://git.kernel.org/arm64/c/2369f171d5c5
> 
> and it will be available in v5.18-rc1.
> 
> So we can get module/vmalloc/vmemmap ranges from the vmcore info
> since the v5.18, and we have no need to calculate them by hand
> any more.
> 
> This patch adds a new hook arm64_get_range_v5_18 which could parse
> out all the module/vmalloc/vmemmap ranges from the vmcore info.
> 
> Signed-off-by: Huang Shijie <shijie at os.amperecomputing.com>
> ---
>  arm64.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 47 insertions(+), 2 deletions(-)
> 
> diff --git a/arm64.c b/arm64.c
> index 841016c..b91938e 100644
> --- a/arm64.c
> +++ b/arm64.c
> @@ -569,6 +569,48 @@ static int arm64_get_struct_page_max_shift(struct machine_specific *ms)
>  	return 0;
>  }
> 
> +/* Return 0 if we succeed, return 1 on failure. */
> +static int arm64_get_vmcoreinfo_ul(unsigned long *vaddr, const char* label)
> +{
> +	char *string = pc->read_vmcoreinfo(label);
> +
> +	if (!string)
> +		return 1;
> +
> +	*vaddr  = strtoul(string, NULL, 0);
> +	free(string);
> +	return 0;

The return value is irregular in crash.
Would you use TRUE on success and FALSE on failure?

Thanks,
Kazu



> +}
> +
> +/*
> + *  The change is caused by the kernel patch since v5.18-rc1:
> + *    "arm64: crash_core: Export MODULES, VMALLOC, and VMEMMAP ranges"
> + */
> +static struct kernel_range *arm64_get_range_v5_18(struct machine_specific *ms)
> +{
> +	struct kernel_range *r = &tmp_range;
> +
> +	/* Get the MODULES_VADDR ~ MODULES_END */
> +	if (arm64_get_vmcoreinfo_ul(&r->modules_vaddr, "NUMBER(MODULES_VADDR)"))
> +		return NULL;
> +	if (arm64_get_vmcoreinfo_ul(&r->modules_end, "NUMBER(MODULES_END)"))
> +		return NULL;
> +
> +	/* Get the VMEMMAP_START ~ VMEMMAP_END */
> +	if (arm64_get_vmcoreinfo_ul(&r->vmemmap_vaddr, "NUMBER(VMEMMAP_START)"))
> +		return NULL;
> +	if (arm64_get_vmcoreinfo_ul(&r->vmemmap_end, "NUMBER(VMEMMAP_END)"))
> +		return NULL;
> +
> +	/* Get the VMALLOC_START ~ VMALLOC_END */
> +	if (arm64_get_vmcoreinfo_ul(&r->vmalloc_start_addr, "NUMBER(VMALLOC_START)"))
> +		return NULL;
> +	if (arm64_get_vmcoreinfo_ul(&r->vmalloc_end, "NUMBER(VMALLOC_END)"))
> +		return NULL;
> +
> +	return r;
> +}
> +
>  /*
>   *  The change is caused by the kernel patch since v5.17-rc1:
>   *    "b89ddf4cca43 arm64/bpf: Remove 128MB limit for BPF JIT programs"
> @@ -774,8 +816,11 @@ static struct kernel_range *arm64_get_range_v5_0(struct machine_specific *ms)
> 
>  static struct kernel_va_range_handler kernel_va_range_handlers[] = {
>  	{
> -		LINUX(5,17,0),
> -		LINUX(99,0,0), /* Just a boundary, Change it later */
> +		LINUX(5,18,0),
> +		LINUX(99,0,0), /* Just a boundary */
> +		get_range: arm64_get_range_v5_18,
> +	}, {
> +		LINUX(5,17,0), LINUX(5,18,0),
>  		get_range: arm64_get_range_v5_17,
>  	}, {
>  		LINUX(5,11,0), LINUX(5,17,0),
> --
> 2.30.2



More information about the Crash-utility mailing list