>
> ----- Original Message -----
> > Hi Dave,
> >
> > In my develop enviroment, kaslr offset will be stored in SoC on-chip memory
> > for debuging, but crash utility is not work if i only set kaslr offset by
> > command '--kaslr XXX', it also need correct kimage_voffset.
> >
> > error message without the patch:
> >
> > VA_BITS: 39
> > using 40000000 as phys_offset
> > kimage_voffset: 0
> > phys_offset: 40000000
> > .....cut....
> > <readmem: ffffff9381e074a0, KVADDR, "cpu_possible_mask", 8, (FOE),
> > 7fffce0dfa48>
> > <read_ramdump: addr: ffffff9381e074a0 paddr: 13b9e074a0 cnt: 8>
> > read_ramdump: READ_ERROR: offset not found for paddr: 13b9e074a0
> > crash: read error: kernel virtual address: ffffff9381e074a0 type:
> > "cpu_possible_mask"
> >
> > This patch add a function to auto calculate kimage_voffset by kaslr offset.
> > Please review it.
> >
> > Thanks,
> > Yueyi Li
> > Hello Yueyi,
> >
> > I have a few questions about this patch.
> >
> > First, can you clarify the kernel version and the dumpfile type that
> > you are trying to address?
> >
> > I understand the confusion, given that arm64 kdump/KASLR support is still
> > being
> > debated upstream. Eventually, arm64 kdump-generated dumpfiles will have
> > "NUMBER(kimage_voffset)" and "NUMBER(PHYS_OFFSET)" VMCOREINFO entries, which
> > will simplify things significantly (and you can see that the crash utility
> > already has support for them in advance).
> Actually, i use crash utility to analysis Android device crash, Linux kernel
> version is 4.4. The ramdump file is not generated by kdump, it is whole DDR
> SDRAM snapshot collected by another RTOS, so i don`t have vmcoreinfo to get
> kimage_voffset & phys_offset. I my opinion, only set kaslr offset should work
> well even if without vmcore file and kimage_voffse, it looks more reasonable.
> > It seems that this patch would only be applicable when looking at an ELF
> > dumpfile, given that your arch_calc_kimage_voffset() function calls
> > arm_kdump_phys_base() -- which only applies if you are looking at an
> > ELF dumpfile:
> >
> > +static void
> > +arm64_calc_kimage_voffset(void)
> > +{
> > + struct machine_specific *ms = machdep->machspec;
> > + ulong kimage_offset;
> > + ulong phys_offset;
> > + struct syment *sp;
> > +
> > + if (machdep->flags & KIMG_VOFFSET) /* --machdep override */
> > + return;
> > +
> > + if ((kt->flags2 & KASLR) && (kt->flags & RELOC_SET)){
> > + arm_kdump_phys_base(&phys_offset);
> > + ms->kimage_voffset = ms->vmalloc_start_addr + (kt->relocate
> > * -1) - phys_offset;
> > + }
> > +
> > +}
> >
> > Is that correct? And if so, why not call arm64_kdump_phys_base() instead?
> > Because I see in your "error message without the patch" above, the
> > phys_base
> > seems to have been calculated correctly to be 40000000, so it looks like
> > the
> > call from arm64_calc_phys_offset() to arm64_kdump_phys_base() must have
> > worked.
> > (since arm64_kdump_phys_base() ultimately calls arm_kdump_phys_base() if
> > nothing
> > else works)
> >
> > So what would happen if you called arm64_calc_phys_offset() *before* your
> > new
> > function? Wouldn't it correctly determine phys_offset? And then there
> > would
> > be no need for you to call it in your new function:
> >
> > @@ -324,6 +325,9 @@ arm64_init(int when)
> > machdep->init_kernel_pgd = arm64_init_kernel_pgd;
> >
> > /* use machdep parameters */
> > + arm64_calc_kimage_voffset();
> > +
> > + /* use machdep parameters */
> > arm64_calc_phys_offset();
> When kernel ASLR is enabled on arm64, the kernel image start address
> can be randomized, phys_offset is no more equal the start address of
> first memory block. It means, arm_kdump_phys_base() can not calculate
> correctly address, we need kimage_voffset to calculate correctly
> phys_offset, this is what arm64_calc_phys_offset() to do( just on
> live system & ELF ramdump). So arm64_calc_kimage_voffset() should be
> called first. This is why crash utility is not work if '-m kimage_voffset'
> is not given.
>
> debug log with the patch, kaslr offset is 0x1378e00000, start address of
> first memory block is 0x40000000:
> readmem: read_ramdump()
>
> VA_BITS: 39
>
> using ffffffd340000000 as phys_offset
>
> kimage_voffset: ffffff9340e00000
>
> phys_offset: ffffffd340000000
>
> gdb vmlinux
>
> GNU gdb (GDB) 7.6
>
> Copyright (C) 2013 Free Software Foundation, Inc.
>
> License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
>
> This is free software: you are free to change and redistribute it.
>
> There is NO WARRANTY, to the extent permitted by law. Type "show copying"
>
> and "show warranty" for details.
>
> This GDB was configured as "--host=x86_64-unknown-linux-gnu
> --target=aarch64-elf-linux"...
>
>
> cpu_possible_mask: cpus: 0 1 2 3 4 5 6 7
>
> cpu_present_mask: cpus: 0 1 2 3 4 5 6 7
>
> cpu_online_mask: cpus: 0 1 2 3 4 5 6
>
> cpu_active_mask: cpus: 0 1 2 3 4 5 6
>
> xtime timespec.tv_sec: 58c27009: Fri Mar 10 17:21:13 2017
>
> utsname:
>
> sysname: Linux
>
> nodename: localhost
>
> release: 4.4.21-perf-g5ec6736-00564-gbdc7dcf
>
> version: #1 SMP PREEMPT Wed Mar 8 23:02:12 CST 2017
>
> machine: aarch64
>
> domainname: localdomain
>
>
> > In addition, arm64_calc_phys_offset() also tries to determine the
> > phys_offset value
> > for compressed kdump dumpfiles and live systems. If the dumpfile has been
> > compressed (by the makedumpfile facility), or if you are running on a live
> > system,
> > then your patch would fail to determine phys_offset. But if you were to
> > call
> > arm64_calc_phys_offset() instead, it would call diskdump_phys_base() for
> > compressed
> > dumpfiles, or try to determine the phys_offset value from /proc/iomem on
> > live
> > systems.
> >
> > Dave
> >
> >
> I'm not familar with compressed dumpfiles, just add a judgment in my
> function.
> For live system, if kimage_voffset has been calculated,
> arm64_calc_phys_offset
> will use it calculate correctly phys_offset instead of read from /proc/iomem.
>
> if ((machdep->flags & NEW_VMEMMAP) &&
> ms->kimage_voffset && (sp =
> kernel_symbol_search("memstart_addr"))) {
> paddr = sp->value - machdep->machspec->kimage_voffset;
> if (READMEM(pc->mfd, &phys_offset, sizeof(phys_offset),
> sp->value, paddr) > 0) {
> ms->phys_offset = phys_offset;
> return;
> }
> }
>
> I have attached patch v2, Could you please review it?
>
> Thanks,
> Yueyi Li
> From 10d9a7879589888c8ffe24e8245062115dc16f1e Mon Sep 17 00:00:00 2001
> From: Yueyi Li <liyueyi live com>
> Date: Tue, 14 Mar 2017 21:25:21 +0800
> Subject: [PATCH] [ARM64][patch] Auto calculate kimage_voffset by kaslr offset
>
> ARM64 kimage_voffset can be calculated if kernel ASLR offset is known.
> Add a function to auto calculate kimage_voffset when '--kaslr=<offset>'
> was set.
> ---
> arm64.c | 21 +++++++++++++++++++++
> 1 file changed, 21 insertions(+)
>
> diff --git a/arm64.c b/arm64.c
> index 6eaf96d..b51b826 100644
> --- a/arm64.c
> +++ b/arm64.c
> @@ -27,6 +27,7 @@
> static struct machine_specific arm64_machine_specific = { 0 };
> static int arm64_verify_symbol(const char *, ulong, char);
> static void arm64_parse_cmdline_args(void);
> +static void arm64_calc_kimage_voffset(void);
> static void arm64_calc_phys_offset(void);
> static void arm64_calc_virtual_memory_ranges(void);
> static int arm64_kdump_phys_base(ulong *);
> @@ -324,6 +325,9 @@ arm64_init(int when)
> machdep->init_kernel_pgd = arm64_init_kernel_pgd;
>
> /* use machdep parameters */
> + arm64_calc_kimage_voffset();
> +
> + /* use machdep parameters */
> arm64_calc_phys_offset();
>
> if (CRASHDEBUG(1)) {
> @@ -735,6 +739,23 @@ arm64_parse_cmdline_args(void)
> }
> }
>
> +static void
> +arm64_calc_kimage_voffset(void)
> +{
> + struct machine_specific *ms = machdep->machspec;
> + ulong phys_offset;
> +
> + if (ms->kimage_voffset) /* vmcoreinfo or --machdep override */
> + return;
> +
> + if (DISKDUMP_DUMPFILE())
> + return;
> + else if ((kt->flags2 & KASLR) && (kt->flags & RELOC_SET)){
> + arm_kdump_phys_base(&phys_offset); /*get start address of
> first memory block*/
> + ms->kimage_voffset = ms->vmalloc_start_addr + (kt->relocate *
> -1) - phys_offset;
> + }
> +
> +}
In addition to DISKUMP_DUMPFILE(), it also needs to return on live systems
and any other dumpfile type. I need to see your pc->flags and pc->flags2
settings to see how your dumpfile is recognized -- what do you see when you
run this command against your RAM dump?:
crash> help -p | grep -A3 " flags:" | head -3
flags: 1010000210c06
(RUNTIME|TTY|HASH|SCROLL|GDB_INIT|READLINE|KDUMP|DATADEBUG)
flags2: 100400 (VMCOREINFO|REDZONE)
crash>
Thanks,
Dave
--
Crash-utility mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/crash-utility