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

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
Loading
Loading
Loading
Loading
+61 −12
Original line number Diff line number Diff line
@@ -58,29 +58,56 @@ struct ptd_mm_info {
	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[] = {
#ifdef CONFIG_KASAN
	{KASAN_SHADOW_START,	"Kasan shadow start"},
	{KASAN_SHADOW_END,	"Kasan shadow end"},
	{0, "Kasan shadow start"},
	{0, "Kasan shadow end"},
#endif
	{FIXADDR_START,		"Fixmap start"},
	{FIXADDR_TOP,		"Fixmap end"},
	{PCI_IO_START,		"PCI I/O start"},
	{PCI_IO_END,		"PCI I/O end"},
	{0, "Fixmap start"},
	{0, "Fixmap end"},
	{0, "PCI I/O start"},
	{0, "PCI I/O end"},
#ifdef CONFIG_SPARSEMEM_VMEMMAP
	{VMEMMAP_START,		"vmemmap start"},
	{VMEMMAP_END,		"vmemmap end"},
	{0, "vmemmap start"},
	{0, "vmemmap end"},
#endif
	{0, "vmalloc() area"},
	{0, "vmalloc() end"},
	{0, "Linear mapping"},
#ifdef CONFIG_64BIT
	{0, "Modules mapping"},
#endif
	{VMALLOC_START,		"vmalloc() area"},
	{VMALLOC_END,		"vmalloc() end"},
	{PAGE_OFFSET,		"Linear mapping"},
	{0, "Kernel mapping (kernel, BPF)"},
	{-1, NULL},
};

static struct ptd_mm_info kernel_ptd_info = {
	.mm		= &init_mm,
	.markers	= address_markers,
	.base_addr	= KERN_VIRT_START,
	.base_addr	= 0,
	.end		= ULONG_MAX,
};

@@ -335,6 +362,28 @@ static int ptdump_init(void)
{
	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 (j = 0; j < ARRAY_SIZE(pte_bits); j++)
			pg_level[i].mask |= pte_bits[j].mask;