|
@@ -11,7 +11,19 @@
|
|
|
extern pgd_t early_level4_pgt[PTRS_PER_PGD];
|
|
|
extern struct range pfn_mapped[E820_X_MAX];
|
|
|
|
|
|
-extern unsigned char kasan_zero_page[PAGE_SIZE];
|
|
|
+static pud_t kasan_zero_pud[PTRS_PER_PUD] __page_aligned_bss;
|
|
|
+static pmd_t kasan_zero_pmd[PTRS_PER_PMD] __page_aligned_bss;
|
|
|
+static pte_t kasan_zero_pte[PTRS_PER_PTE] __page_aligned_bss;
|
|
|
+
|
|
|
+/*
|
|
|
+ * This page used as early shadow. We don't use empty_zero_page
|
|
|
+ * at early stages, stack instrumentation could write some garbage
|
|
|
+ * to this page.
|
|
|
+ * Latter we reuse it as zero shadow for large ranges of memory
|
|
|
+ * that allowed to access, but not instrumented by kasan
|
|
|
+ * (vmalloc/vmemmap ...).
|
|
|
+ */
|
|
|
+static unsigned char kasan_zero_page[PAGE_SIZE] __page_aligned_bss;
|
|
|
|
|
|
static int __init map_range(struct range *range)
|
|
|
{
|
|
@@ -36,7 +48,7 @@ static void __init clear_pgds(unsigned long start,
|
|
|
pgd_clear(pgd_offset_k(start));
|
|
|
}
|
|
|
|
|
|
-void __init kasan_map_early_shadow(pgd_t *pgd)
|
|
|
+static void __init kasan_map_early_shadow(pgd_t *pgd)
|
|
|
{
|
|
|
int i;
|
|
|
unsigned long start = KASAN_SHADOW_START;
|
|
@@ -166,6 +178,26 @@ static struct notifier_block kasan_die_notifier = {
|
|
|
};
|
|
|
#endif
|
|
|
|
|
|
+void __init kasan_early_init(void)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ pteval_t pte_val = __pa_nodebug(kasan_zero_page) | __PAGE_KERNEL;
|
|
|
+ pmdval_t pmd_val = __pa_nodebug(kasan_zero_pte) | _KERNPG_TABLE;
|
|
|
+ pudval_t pud_val = __pa_nodebug(kasan_zero_pmd) | _KERNPG_TABLE;
|
|
|
+
|
|
|
+ for (i = 0; i < PTRS_PER_PTE; i++)
|
|
|
+ kasan_zero_pte[i] = __pte(pte_val);
|
|
|
+
|
|
|
+ for (i = 0; i < PTRS_PER_PMD; i++)
|
|
|
+ kasan_zero_pmd[i] = __pmd(pmd_val);
|
|
|
+
|
|
|
+ for (i = 0; i < PTRS_PER_PUD; i++)
|
|
|
+ kasan_zero_pud[i] = __pud(pud_val);
|
|
|
+
|
|
|
+ kasan_map_early_shadow(early_level4_pgt);
|
|
|
+ kasan_map_early_shadow(init_level4_pgt);
|
|
|
+}
|
|
|
+
|
|
|
void __init kasan_init(void)
|
|
|
{
|
|
|
int i;
|