Commit bde258d9 authored by Sean Christopherson's avatar Sean Christopherson Committed by Dave Hansen
Browse files

x86/kasan: Add helpers to align shadow addresses up and down



Add helpers to dedup code for aligning shadow address up/down to page
boundaries when translating an address to its shadow.

No functional change intended.

Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: default avatarAndrey Ryabinin <ryabinin.a.a@gmail.com>
Link: https://lkml.kernel.org/r/20221110203504.1985010-5-seanjc@google.com
parent 7077d2cc
Loading
Loading
Loading
Loading
+22 −18
Original line number Diff line number Diff line
@@ -316,22 +316,33 @@ void __init kasan_early_init(void)
	kasan_map_early_shadow(init_top_pgt);
}

static unsigned long kasan_mem_to_shadow_align_down(unsigned long va)
{
	unsigned long shadow = (unsigned long)kasan_mem_to_shadow((void *)va);

	return round_down(shadow, PAGE_SIZE);
}

static unsigned long kasan_mem_to_shadow_align_up(unsigned long va)
{
	unsigned long shadow = (unsigned long)kasan_mem_to_shadow((void *)va);

	return round_up(shadow, PAGE_SIZE);
}

void __init kasan_populate_shadow_for_vaddr(void *va, size_t size, int nid)
{
	unsigned long shadow_start, shadow_end;

	shadow_start = (unsigned long)kasan_mem_to_shadow(va);
	shadow_start = round_down(shadow_start, PAGE_SIZE);
	shadow_end = (unsigned long)kasan_mem_to_shadow(va + size);
	shadow_end = round_up(shadow_end, PAGE_SIZE);

	shadow_start = kasan_mem_to_shadow_align_down((unsigned long)va);
	shadow_end = kasan_mem_to_shadow_align_up((unsigned long)va + size);
	kasan_populate_shadow(shadow_start, shadow_end, nid);
}

void __init kasan_init(void)
{
	unsigned long shadow_cea_begin, shadow_cea_end;
	int i;
	void *shadow_cea_begin, *shadow_cea_end;

	memcpy(early_top_pgt, init_top_pgt, sizeof(early_top_pgt));

@@ -372,16 +383,9 @@ void __init kasan_init(void)
		map_range(&pfn_mapped[i]);
	}

	shadow_cea_begin = (void *)CPU_ENTRY_AREA_BASE;
	shadow_cea_begin = kasan_mem_to_shadow(shadow_cea_begin);
	shadow_cea_begin = (void *)round_down(
			(unsigned long)shadow_cea_begin, PAGE_SIZE);

	shadow_cea_end = (void *)(CPU_ENTRY_AREA_BASE +
	shadow_cea_begin = kasan_mem_to_shadow_align_down(CPU_ENTRY_AREA_BASE);
	shadow_cea_end = kasan_mem_to_shadow_align_up(CPU_ENTRY_AREA_BASE +
						      CPU_ENTRY_AREA_MAP_SIZE);
	shadow_cea_end = kasan_mem_to_shadow(shadow_cea_end);
	shadow_cea_end = (void *)round_up(
			(unsigned long)shadow_cea_end, PAGE_SIZE);

	kasan_populate_early_shadow(
		kasan_mem_to_shadow((void *)PAGE_OFFSET + MAXMEM),
@@ -403,9 +407,9 @@ void __init kasan_init(void)

	kasan_populate_early_shadow(
		kasan_mem_to_shadow((void *)VMALLOC_END + 1),
		shadow_cea_begin);
		(void *)shadow_cea_begin);

	kasan_populate_early_shadow(shadow_cea_end,
	kasan_populate_early_shadow((void *)shadow_cea_end,
			kasan_mem_to_shadow((void *)__START_KERNEL_map));

	kasan_populate_shadow((unsigned long)kasan_mem_to_shadow(_stext),