[Crash-utility] [PATCH v2] arm64: use the vmcore info to get module/vmalloc/vmemmap ranges
HAGIO KAZUHITO(萩尾 一仁)
k-hagio-ab at nec.com
Wed Mar 16 02:40:25 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>
> ---
> v1-->v2:
> 1.) Change return types to TRUE/FALSE
> for arm64_get_vmcoreinfo_ul().
>
> 2.) Change version limit from LINUX(99,0,0) to LINUX(999, 0, 0)
> I guess LINUX(99, 0, 0) can be used for 25 years,
> so I extended to LINUX(999,0,0).
(I think that 9.x is possible and 99.x is unlikely in 25 years.. but ok,
the current versioning scheme might change :)
Acked-by: Kazuhito Hagio <k-hagio-ab at nec.com>
Thank you for the kernel and crash patches to improve!
Kazu
>
> 3.) Tested this patch with the live system mode.
> (linux-next kernel + Crash)
>
> ---
> arm64.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 47 insertions(+), 2 deletions(-)
>
> diff --git a/arm64.c b/arm64.c
> index 2dcef46..e3fa316 100644
> --- a/arm64.c
> +++ b/arm64.c
> @@ -560,6 +560,48 @@ static int arm64_get_struct_page_max_shift(struct machine_specific *ms)
> return (int)ceil(log2(ms->struct_page_size));
> }
>
> +/* Return TRUE if we succeed, return FALSE on failure. */
> +static int arm64_get_vmcoreinfo_ul(unsigned long *vaddr, const char* label)
> +{
> + char *string = pc->read_vmcoreinfo(label);
> +
> + if (!string)
> + return FALSE;
> +
> + *vaddr = strtoul(string, NULL, 0);
> + free(string);
> + return TRUE;
> +}
> +
> +/*
> + * 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"
> @@ -765,8 +807,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(999,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