OSDN Git Service

powerpc/ptdump: Fix generic ptdump for 64-bit
authorMichael Ellerman <mpe@ellerman.id.au>
Tue, 31 Aug 2021 13:51:51 +0000 (23:51 +1000)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 1 Sep 2021 06:52:53 +0000 (16:52 +1000)
commitb14b8b1ed0e15b8f43fba9c25654278a31ee3c2f
tree0a91fac7802cfaee69e85112aaaa285abf9d1404
parent1d78dfde33a02da1d816279c2e3452978b7abd39
powerpc/ptdump: Fix generic ptdump for 64-bit

Since the conversion to generic ptdump we see crashes on 64-bit:

  BUG: Unable to handle kernel data access on read at 0xc0eeff7f00000000
  Faulting instruction address: 0xc00000000045e5fc
  Oops: Kernel access of bad area, sig: 11 [#1]
  ...
  NIP __walk_page_range+0x2bc/0xce0
  LR  __walk_page_range+0x240/0xce0
  Call Trace:
    __walk_page_range+0x240/0xce0 (unreliable)
    walk_page_range_novma+0x74/0xb0
    ptdump_walk_pgd+0x98/0x170
    ptdump_check_wx+0x88/0xd0
    mark_rodata_ro+0x48/0x80
    kernel_init+0x74/0x1a0
    ret_from_kernel_thread+0x5c/0x64

What's happening is that have walked off the end of the kernel page
tables, and started dereferencing junk values.

That happens because we initialised the ptdump_range to span all the way
up to 0xffffffffffffffff:

static struct ptdump_range ptdump_range[] __ro_after_init = {
{TASK_SIZE_MAX, ~0UL},

But the kernel page tables don't span that far. So on 64-bit set the end
of the range to be the address immediately past the end of the kernel
page tables, to limit the page table walk to valid addresses.

Fixes: e084728393a5 ("powerpc/ptdump: Convert powerpc to GENERIC_PTDUMP")
Reported-by: Nathan Chancellor <nathan@kernel.org>
Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20210831135151.886620-1-mpe@ellerman.id.au
arch/powerpc/mm/ptdump/ptdump.c