[PATCH v6 06/41] arm64: ptdump: Allow all region boundaries to be defined at boot time

Mark Rutland mark.rutland at arm.com
Mon Dec 11 06:15:33 PST 2023


On Wed, Nov 29, 2023 at 12:16:02PM +0100, Ard Biesheuvel wrote:
> From: Ard Biesheuvel <ardb at kernel.org>
> 
> Rework the way the address_markers array is populated so that we can
> tolerate values that are not compile time constants generally, rather
> than keeping track manually of the array indexes in question, and poking
> new values into them manually. This will be needed for VMALLOC_END,
> which will cease to be a compile time constant after a subsequent patch.
> 
> Signed-off-by: Ard Biesheuvel <ardb at kernel.org>
> ---
>  arch/arm64/mm/ptdump.c | 54 ++++++++------------
>  1 file changed, 22 insertions(+), 32 deletions(-)
> 
> diff --git a/arch/arm64/mm/ptdump.c b/arch/arm64/mm/ptdump.c
> index 3958b008f908..bfc307890344 100644
> --- a/arch/arm64/mm/ptdump.c
> +++ b/arch/arm64/mm/ptdump.c
> @@ -26,34 +26,6 @@
>  #include <asm/ptdump.h>
>  
>  
> -enum address_markers_idx {
> -	PAGE_OFFSET_NR = 0,
> -	PAGE_END_NR,
> -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
> -	KASAN_START_NR,
> -#endif
> -};
> -
> -static struct addr_marker address_markers[] = {
> -	{ PAGE_OFFSET,			"Linear Mapping start" },
> -	{ 0 /* PAGE_END */,		"Linear Mapping end" },
> -#if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
> -	{ 0 /* KASAN_SHADOW_START */,	"Kasan shadow start" },
> -	{ KASAN_SHADOW_END,		"Kasan shadow end" },
> -#endif
> -	{ MODULES_VADDR,		"Modules start" },
> -	{ MODULES_END,			"Modules end" },
> -	{ VMALLOC_START,		"vmalloc() area" },
> -	{ VMALLOC_END,			"vmalloc() end" },
> -	{ VMEMMAP_START,		"vmemmap start" },
> -	{ VMEMMAP_START + VMEMMAP_SIZE,	"vmemmap end" },
> -	{ PCI_IO_START,			"PCI I/O start" },
> -	{ PCI_IO_END,			"PCI I/O end" },
> -	{ FIXADDR_TOT_START,		"Fixmap start" },
> -	{ FIXADDR_TOP,			"Fixmap end" },
> -	{ -1,				NULL },
> -};
> -
>  #define pt_dump_seq_printf(m, fmt, args...)	\
>  ({						\
>  	if (m)					\
> @@ -339,9 +311,8 @@ static void __init ptdump_initialize(void)
>  				pg_level[i].mask |= pg_level[i].bits[j].mask;
>  }
>  
> -static struct ptdump_info kernel_ptdump_info = {
> +static struct ptdump_info kernel_ptdump_info __ro_after_init = {
>  	.mm		= &init_mm,
> -	.markers	= address_markers,
>  	.base_addr	= PAGE_OFFSET,
>  };
>  
> @@ -375,10 +346,29 @@ void ptdump_check_wx(void)
>  
>  static int __init ptdump_init(void)
>  {
> -	address_markers[PAGE_END_NR].start_address = PAGE_END;
> +	struct addr_marker m[] = {
> +		{ PAGE_OFFSET,			"Linear Mapping start" },
> +		{ PAGE_END,			"Linear Mapping end" },
>  #if defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)
> -	address_markers[KASAN_START_NR].start_address = KASAN_SHADOW_START;
> +		{ KASAN_SHADOW_START,		"Kasan shadow start" },
> +		{ KASAN_SHADOW_END,		"Kasan shadow end" },
>  #endif
> +		{ MODULES_VADDR,		"Modules start" },
> +		{ MODULES_END,			"Modules end" },
> +		{ VMALLOC_START,		"vmalloc() area" },
> +		{ VMALLOC_END,			"vmalloc() end" },
> +		{ VMEMMAP_START,		"vmemmap start" },
> +		{ VMEMMAP_START + VMEMMAP_SIZE,	"vmemmap end" },
> +		{ PCI_IO_START,			"PCI I/O start" },
> +		{ PCI_IO_END,			"PCI I/O end" },
> +		{ FIXADDR_TOT_START,		"Fixmap start" },
> +		{ FIXADDR_TOP,			"Fixmap end" },
> +		{ -1,				NULL },
> +	};
> +	static struct addr_marker address_markers[ARRAY_SIZE(m)] __ro_after_init;
> +
> +	kernel_ptdump_info.markers = memcpy(address_markers, m, sizeof(m));

That is a neat trick.

Acked-by: Mark Rutland <mark.rutland at arm.com>

Mark.

> +
>  	ptdump_initialize();
>  	ptdump_debugfs_register(&kernel_ptdump_info, "kernel_page_tables");
>  	return 0;
> -- 
> 2.43.0.rc1.413.gea7ed67945-goog
> 



More information about the linux-arm-kernel mailing list