Commit 418b4d5e authored by Vasily Gorbik's avatar Vasily Gorbik Committed by Alexander Gordeev
Browse files

s390/boot: Add vmem debugging support



Introduce boot_debug() calls in vmem code to log page table mappings
including KASAN shadow mappings for improved early boot debugging.

Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
Acked-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarAlexander Gordeev <agordeev@linux.ibm.com>
parent a56827e5
Loading
Loading
Loading
Loading
+44 −3
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
#define boot_fmt(fmt) "vmem: " fmt
#include <linux/sched/task.h>
#include <linux/pgtable.h>
#include <linux/kasan.h>
@@ -32,12 +33,42 @@ enum populate_mode {
	POPULATE_IDENTITY,
	POPULATE_KERNEL,
#ifdef CONFIG_KASAN
	/* KASAN modes should be last and grouped together, see is_kasan_populate_mode() */
	POPULATE_KASAN_MAP_SHADOW,
	POPULATE_KASAN_ZERO_SHADOW,
	POPULATE_KASAN_SHALLOW
#endif
};

#define POPULATE_MODE_NAME(t) case POPULATE_ ## t: return #t
static inline const char *get_populate_mode_name(enum populate_mode t)
{
	switch (t) {
	POPULATE_MODE_NAME(NONE);
	POPULATE_MODE_NAME(DIRECT);
	POPULATE_MODE_NAME(LOWCORE);
	POPULATE_MODE_NAME(ABS_LOWCORE);
	POPULATE_MODE_NAME(IDENTITY);
	POPULATE_MODE_NAME(KERNEL);
#ifdef CONFIG_KASAN
	POPULATE_MODE_NAME(KASAN_MAP_SHADOW);
	POPULATE_MODE_NAME(KASAN_ZERO_SHADOW);
	POPULATE_MODE_NAME(KASAN_SHALLOW);
#endif
	default:
		return "UNKNOWN";
	}
}

static bool is_kasan_populate_mode(enum populate_mode mode)
{
#ifdef CONFIG_KASAN
	return mode >= POPULATE_KASAN_MAP_SHADOW;
#else
	return false;
#endif
}

static void pgtable_populate(unsigned long addr, unsigned long end, enum populate_mode mode);

#ifdef CONFIG_KASAN
@@ -53,9 +84,12 @@ static pte_t pte_z;

static inline void kasan_populate(unsigned long start, unsigned long end, enum populate_mode mode)
{
	start = PAGE_ALIGN_DOWN(__sha(start));
	end = PAGE_ALIGN(__sha(end));
	pgtable_populate(start, end, mode);
	unsigned long sha_start = PAGE_ALIGN_DOWN(__sha(start));
	unsigned long sha_end = PAGE_ALIGN(__sha(end));

	boot_debug("%-17s 0x%016lx-0x%016lx >> 0x%016lx-0x%016lx\n", get_populate_mode_name(mode),
		   start, end, sha_start, sha_end);
	pgtable_populate(sha_start, sha_end, mode);
}

static void kasan_populate_shadow(unsigned long kernel_start, unsigned long kernel_end)
@@ -418,6 +452,13 @@ static void pgtable_populate(unsigned long addr, unsigned long end, enum populat
	pgd_t *pgd;
	p4d_t *p4d;

	if (!is_kasan_populate_mode(mode)) {
		boot_debug("%-17s 0x%016lx-0x%016lx -> 0x%016lx-0x%016lx\n",
			   get_populate_mode_name(mode), addr, end,
			   resolve_pa_may_alloc(addr, 0, mode),
			   resolve_pa_may_alloc(end - 1, 0, mode) + 1);
	}

	pgd = pgd_offset(&init_mm, addr);
	for (; addr < end; addr = next, pgd++) {
		next = pgd_addr_end(addr, end);