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: Sean Christopherson <seanjc@google.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Link: https://lkml.kernel.org/r/20221110203504.1985010-5-seanjc@google.com
This commit is contained in:
Sean Christopherson 2022-11-10 20:35:03 +00:00 committed by Dave Hansen
parent 7077d2ccb9
commit bde258d974
1 changed files with 22 additions and 18 deletions

View File

@ -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 +
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);
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);
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),