riscv: mm: Fix W+X mappings at boot
When the kernel mapping was moved the last 2GB of the address space,
(__va(PFN_PHYS(max_low_pfn))) is much smaller than the .data section
start address, the last set_memory_nx() in protect_kernel_text_data()
will fail, thus the .data section is still mapped as W+X. This results
in below W+X mapping waring at boot. Fix it by passing the correct
.data section page num to the set_memory_nx().
[ 0.396516] ------------[ cut here ]------------
[ 0.396889] riscv/mm: Found insecure W+X mapping at address (____ptrval____)/0xffffffff80c00000
[ 0.398347] WARNING: CPU: 0 PID: 1 at arch/riscv/mm/ptdump.c:258 note_page+0x244/0x24a
[ 0.398964] Modules linked in:
[ 0.399459] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.13.0-rc1+ #14
[ 0.400003] Hardware name: riscv-virtio,qemu (DT)
[ 0.400591] epc : note_page+0x244/0x24a
[ 0.401368] ra : note_page+0x244/0x24a
[ 0.401772] epc :
ffffffff80007c86 ra :
ffffffff80007c86 sp :
ffffffe000e7bc30
[ 0.402304] gp :
ffffffff80caae88 tp :
ffffffe000e70000 t0 :
ffffffff80cb80cf
[ 0.402800] t1 :
ffffffff80cb80c0 t2 :
0000000000000000 s0 :
ffffffe000e7bc80
[ 0.403310] s1 :
ffffffe000e7bde8 a0 :
0000000000000053 a1 :
ffffffff80c83ff0
[ 0.403805] a2 :
0000000000000010 a3 :
0000000000000000 a4 :
6c7e7a5137233100
[ 0.404298] a5 :
6c7e7a5137233100 a6 :
0000000000000030 a7 :
ffffffffffffffff
[ 0.404849] s2 :
ffffffff80e00000 s3 :
0000000040000000 s4 :
0000000000000000
[ 0.405393] s5 :
0000000000000000 s6 :
0000000000000003 s7 :
ffffffe000e7bd48
[ 0.405935] s8 :
ffffffff81000000 s9 :
ffffffffc0000000 s10:
ffffffe000e7bd48
[ 0.406476] s11:
0000000000001000 t3 :
0000000000000072 t4 :
ffffffffffffffff
[ 0.407016] t5 :
0000000000000002 t6 :
ffffffe000e7b978
[ 0.407435] status:
0000000000000120 badaddr:
0000000000000000 cause:
0000000000000003
[ 0.408052] Call Trace:
[ 0.408343] [<
ffffffff80007c86>] note_page+0x244/0x24a
[ 0.408855] [<
ffffffff8010c5a6>] ptdump_hole+0x14/0x1e
[ 0.409263] [<
ffffffff800f65c6>] walk_pgd_range+0x2a0/0x376
[ 0.409690] [<
ffffffff800f6828>] walk_page_range_novma+0x4e/0x6e
[ 0.410146] [<
ffffffff8010c5f8>] ptdump_walk_pgd+0x48/0x78
[ 0.410570] [<
ffffffff80007d66>] ptdump_check_wx+0xb4/0xf8
[ 0.410990] [<
ffffffff80006738>] mark_rodata_ro+0x26/0x2e
[ 0.411407] [<
ffffffff8031961e>] kernel_init+0x44/0x108
[ 0.411814] [<
ffffffff80002312>] ret_from_exception+0x0/0xc
[ 0.412309] ---[ end trace
7ec3459f2547ea83 ]---
[ 0.413141] Checked W+X mappings: failed, 512 W+X pages found
Fixes: 2bfc6cd81bd17e43 ("riscv: Move kernel mapping outside of linear mapping")
Signed-off-by: Jisheng Zhang <jszhang@kernel.org>
Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>