On 2017/3/18 4:27, Dave Anderson wrote:
>
> ----- Original Message -----
>> On 2017/3/17 22:25, Dave Anderson wrote:
>>> ----- Original Message -----
>>>> However, that is why I am interested in your live system initialization
>>>> of kimage_voffset -- for live system access using /dev/mem,
/proc/kcore,
>>>> or an older version of the /dev/crash driver that did not have the
>>>> ioctl()
>>>> to read kimage_voffset. But, in order to do that,
>>>> arm64_calc_kimage_voffset()
>>>> needs to be able to handle all /proc/iomem cases to correctly calculate
>>>> PHYS_OFFSET.
>>> Or better stated, your arm64_calc_kimage_voffset() needs to be able to
>>> handle all
>>> /proc/iomem cases to correctly calculate kimage_voffset. Because on the
>>> 4.8
>>> kernel, it does not work.
>> Dave,
>>
>> Sorry for my misunderstanding of PHYS_OFFSET, actually kimage_voffset
>> is the offset between kernel virtual address and physical address. So,
>> to calculate it need find out which physical address is mapping to
>> VA_START, not PHYS_OFFSET.
>>
>> Please check patch v5, it should be OK for live system.
>>
>> Thanks,
>> Yueyi
>
> Yueyi,
>
> Yes, thanks, this patch does select the correct "offset" for
> use by your calculation. On both the 4.8 and 4.10 kernels,
> the System RAM segment at 0x4000200000 is selected.
>
> However, I wonder if it would be simpler to just select the
> System RAM segment that *contains* the "Kernel code" segment,
> which would follow it in /proc/iomem:
>
> 4.8 kernel:
>
> 4000000000-40001fffff : System RAM
> 4000200000-43fa59ffff : System RAM
> 4000280000-4000c7ffff : Kernel code
> 4000d90000-400166ffff : Kernel data
> 43fa5a0000-43fa9dffff : System RAM
> 43fa9e0000-43ff99ffff : System RAM
> 43ff9a0000-43ff9affff : System RAM
> 43ff9b0000-43ff9bffff : System RAM
> 43ff9c0000-43ff9effff : System RAM
> 43ff9f0000-43ffffffff : System RAM
>
> 4.10 kernel:
>
> 4000000000-40001fffff : reserved
> 4000200000-4001ffffff : System RAM
> 4000280000-4000ccffff : Kernel code
> 4000e00000-40016effff : Kernel data
> 40023b0000-4ff733ffff : System RAM
> 4ff7340000-4ff77cffff : reserved
> 4ff77d0000-4ff792ffff : System RAM
> 4ff7930000-4ff7e7ffff : reserved
> 4ff7e80000-4ff7e8ffff : System RAM
> 4ff7e90000-4ff7efffff : reserved
> 4ff7f10000-4ff800ffff : reserved
> 4ff8010000-4fffffffff : System RAM
>
> In other words, just walk through the /proc/iomem entries, saving
> the System RAM start address as you go. Then when "Kernel code" is
> found, use the last RAM start address.
>
> And a couple other things...
>
> For backwards compatibility (i.e., kernels without kimage_voffset),
> the call from arm64_init() should be conditional like this:
>
> if (machdep->flags & NEW_VMEMMAP)
> arm64_calc_kimage_voffset();
>
> And for live systems without /dev/crash, it wouldn't be necessary to
> add "--kaslr=0" to the command line if arm64_calc_kimage_voffset()
started
> something like this:
>
> static void
> arm64_calc_kimage_voffset(void)
> {
> struct machine_specific *ms = machdep->machspec;
> ulong offset;
>
> if (ms->kimage_voffset) /* vmcoreinfo, --machdep override, or
> ioctl */
> return;
>
> if (DUMPFILE()) {
> if (!(kt->flags2 & KASLR) || !(kt->flags &
RELOC_SET))
> return;
> }
> ...
>
> What do you think?
>
> Thanks,
> Dave
>
> --
> Crash-utility mailing list
> Crash-utility(a)redhat.com
>
https://www.redhat.com/mailman/listinfo/crash-utility
Agreed, I have made change as your recommendation. For NEW_VMEMMAP,
always calculate kimage_voffset if it not be given.
Thanks,
Yueyi
Ok, this looks good.
One minor thing --- I removed the DISKDUMP_DUMPFILE() check from
arm64_calc_kimage_voffset(),
because if the compressed dumpfile does not contain the kimage_voffset value in its
VMCOREINFO, then I want the generic error message to be displayed.
Queued for crash-7.1.9: