Commit 0df68ce4 authored by Alexandre Ghiti's avatar Alexandre Ghiti Committed by Palmer Dabbelt

riscv: Prepare ptdump for vm layout dynamic addresses

This is a preparatory patch for sv48 support that will introduce
dynamic PAGE_OFFSET.

Dynamic PAGE_OFFSET implies that all zones (vmalloc, vmemmap, fixaddr...)
whose addresses depend on PAGE_OFFSET become dynamic and can't be used
to statically initialize the array used by ptdump to identify the
different zones of the vm layout.
Signed-off-by: default avatarAlexandre Ghiti <alex@ghiti.fr>
Reviewed-by: default avatarAnup Patel <anup@brainfault.org>
Signed-off-by: default avatarPalmer Dabbelt <palmerdabbelt@google.com>
parent 2a433cf8
...@@ -58,29 +58,56 @@ struct ptd_mm_info { ...@@ -58,29 +58,56 @@ struct ptd_mm_info {
unsigned long end; unsigned long end;
}; };
enum address_markers_idx {
#ifdef CONFIG_KASAN
KASAN_SHADOW_START_NR,
KASAN_SHADOW_END_NR,
#endif
FIXMAP_START_NR,
FIXMAP_END_NR,
PCI_IO_START_NR,
PCI_IO_END_NR,
#ifdef CONFIG_SPARSEMEM_VMEMMAP
VMEMMAP_START_NR,
VMEMMAP_END_NR,
#endif
VMALLOC_START_NR,
VMALLOC_END_NR,
PAGE_OFFSET_NR,
#ifdef CONFIG_64BIT
MODULES_MAPPING_NR,
#endif
KERNEL_MAPPING_NR,
END_OF_SPACE_NR
};
static struct addr_marker address_markers[] = { static struct addr_marker address_markers[] = {
#ifdef CONFIG_KASAN #ifdef CONFIG_KASAN
{KASAN_SHADOW_START, "Kasan shadow start"}, {0, "Kasan shadow start"},
{KASAN_SHADOW_END, "Kasan shadow end"}, {0, "Kasan shadow end"},
#endif #endif
{FIXADDR_START, "Fixmap start"}, {0, "Fixmap start"},
{FIXADDR_TOP, "Fixmap end"}, {0, "Fixmap end"},
{PCI_IO_START, "PCI I/O start"}, {0, "PCI I/O start"},
{PCI_IO_END, "PCI I/O end"}, {0, "PCI I/O end"},
#ifdef CONFIG_SPARSEMEM_VMEMMAP #ifdef CONFIG_SPARSEMEM_VMEMMAP
{VMEMMAP_START, "vmemmap start"}, {0, "vmemmap start"},
{VMEMMAP_END, "vmemmap end"}, {0, "vmemmap end"},
#endif
{0, "vmalloc() area"},
{0, "vmalloc() end"},
{0, "Linear mapping"},
#ifdef CONFIG_64BIT
{0, "Modules mapping"},
#endif #endif
{VMALLOC_START, "vmalloc() area"}, {0, "Kernel mapping (kernel, BPF)"},
{VMALLOC_END, "vmalloc() end"},
{PAGE_OFFSET, "Linear mapping"},
{-1, NULL}, {-1, NULL},
}; };
static struct ptd_mm_info kernel_ptd_info = { static struct ptd_mm_info kernel_ptd_info = {
.mm = &init_mm, .mm = &init_mm,
.markers = address_markers, .markers = address_markers,
.base_addr = KERN_VIRT_START, .base_addr = 0,
.end = ULONG_MAX, .end = ULONG_MAX,
}; };
...@@ -335,6 +362,28 @@ static int ptdump_init(void) ...@@ -335,6 +362,28 @@ static int ptdump_init(void)
{ {
unsigned int i, j; unsigned int i, j;
#ifdef CONFIG_KASAN
address_markers[KASAN_SHADOW_START_NR].start_address = KASAN_SHADOW_START;
address_markers[KASAN_SHADOW_END_NR].start_address = KASAN_SHADOW_END;
#endif
address_markers[FIXMAP_START_NR].start_address = FIXADDR_START;
address_markers[FIXMAP_END_NR].start_address = FIXADDR_TOP;
address_markers[PCI_IO_START_NR].start_address = PCI_IO_START;
address_markers[PCI_IO_END_NR].start_address = PCI_IO_END;
#ifdef CONFIG_SPARSEMEM_VMEMMAP
address_markers[VMEMMAP_START_NR].start_address = VMEMMAP_START;
address_markers[VMEMMAP_END_NR].start_address = VMEMMAP_END;
#endif
address_markers[VMALLOC_START_NR].start_address = VMALLOC_START;
address_markers[VMALLOC_END_NR].start_address = VMALLOC_END;
address_markers[PAGE_OFFSET_NR].start_address = PAGE_OFFSET;
#ifdef CONFIG_64BIT
address_markers[MODULES_MAPPING_NR].start_address = MODULES_VADDR;
#endif
address_markers[KERNEL_MAPPING_NR].start_address = kernel_virt_addr;
kernel_ptd_info.base_addr = KERN_VIRT_START;
for (i = 0; i < ARRAY_SIZE(pg_level); i++) for (i = 0; i < ARRAY_SIZE(pg_level); i++)
for (j = 0; j < ARRAY_SIZE(pte_bits); j++) for (j = 0; j < ARRAY_SIZE(pte_bits); j++)
pg_level[i].mask |= pte_bits[j].mask; pg_level[i].mask |= pte_bits[j].mask;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment