diff for duplicates of <20171010155619.GA2517@arm.com> diff --git a/a/1.txt b/N1/1.txt index aea08fe..e44b200 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -28,7 +28,7 @@ Will --->8 ->From 36c6c7c06273d08348b47c1a182116b0a1df8363 Mon Sep 17 00:00:00 2001 +From 36c6c7c06273d08348b47c1a182116b0a1df8363 Mon Sep 17 00:00:00 2001 From: Will Deacon <will.deacon@arm.com> Date: Tue, 10 Oct 2017 15:49:43 +0100 Subject: [PATCH] arm64: kasan: Avoid using vmemmap_populate to initialise diff --git a/a/content_digest b/N1/content_digest index bafd213..fe29c68 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -2,29 +2,8 @@ "ref\020171009221931.1481-8-pasha.tatashin@oracle.com\0" "From\0Will Deacon <will.deacon@arm.com>\0" "Subject\0Re: [PATCH v11 7/9] arm64/kasan: add and use kasan_map_populate()\0" - "Date\0Tue, 10 Oct 2017 16:56:20 +0100\0" - "To\0Pavel Tatashin <pasha.tatashin@oracle.com>\0" - "Cc\0linux-kernel@vger.kernel.org" - sparclinux@vger.kernel.org - linux-mm@kvack.org - linuxppc-dev@lists.ozlabs.org - linux-s390@vger.kernel.org - linux-arm-kernel@lists.infradead.org - x86@kernel.org - kasan-dev@googlegroups.com - borntraeger@de.ibm.com - heiko.carstens@de.ibm.com - davem@davemloft.net - willy@infradead.org - mhocko@kernel.org - ard.biesheuvel@linaro.org - mark.rutland@arm.com - catalin.marinas@arm.com - sam@ravnborg.org - mgorman@techsingularity.net - steven.sistare@oracle.com - daniel.m.jordan@oracle.com - " bob.picco@oracle.com\0" + "Date\0Tue, 10 Oct 2017 15:56:20 +0000\0" + "To\0linux-arm-kernel@lists.infradead.org\0" "\00:1\0" "b\0" "Hi Pavel,\n" @@ -57,7 +36,7 @@ "\n" "--->8\n" "\n" - ">From 36c6c7c06273d08348b47c1a182116b0a1df8363 Mon Sep 17 00:00:00 2001\n" + "From 36c6c7c06273d08348b47c1a182116b0a1df8363 Mon Sep 17 00:00:00 2001\n" "From: Will Deacon <will.deacon@arm.com>\n" "Date: Tue, 10 Oct 2017 15:49:43 +0100\n" "Subject: [PATCH] arm64: kasan: Avoid using vmemmap_populate to initialise\n" @@ -342,4 +321,4 @@ "-- \n" 2.1.4 -54f0d924118ea9e7d5a9a4e88d80a65afd549928e112fc77d43f662045976622 +5eb8b6dd9b2926a87ae0013f942e0dde1751fe0769836c72cab7c7fcf4e5a66f
diff --git a/a/1.txt b/N2/1.txt index aea08fe..49bcc6e 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -301,7 +301,7 @@ index cb4af2951c90..b922826d9908 100644 - * kernel image with SWAPPER_BLOCK_SIZE mappings, so we have to round - * the start and end addresses to SWAPPER_BLOCK_SIZE as well, to prevent - * kasan_populate_zero_shadow() from replacing the page table entries -- * (PMD or PTE) at the edges of the shadow region for the kernel +- * (PMD or PTE)@the edges of the shadow region for the kernel - * image. - */ - kimg_shadow_start = round_down(kimg_shadow_start, SWAPPER_BLOCK_SIZE); diff --git a/a/content_digest b/N2/content_digest index bafd213..d77b625 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -1,30 +1,9 @@ "ref\020171009221931.1481-1-pasha.tatashin@oracle.com\0" "ref\020171009221931.1481-8-pasha.tatashin@oracle.com\0" - "From\0Will Deacon <will.deacon@arm.com>\0" - "Subject\0Re: [PATCH v11 7/9] arm64/kasan: add and use kasan_map_populate()\0" + "From\0will.deacon@arm.com (Will Deacon)\0" + "Subject\0[PATCH v11 7/9] arm64/kasan: add and use kasan_map_populate()\0" "Date\0Tue, 10 Oct 2017 16:56:20 +0100\0" - "To\0Pavel Tatashin <pasha.tatashin@oracle.com>\0" - "Cc\0linux-kernel@vger.kernel.org" - sparclinux@vger.kernel.org - linux-mm@kvack.org - linuxppc-dev@lists.ozlabs.org - linux-s390@vger.kernel.org - linux-arm-kernel@lists.infradead.org - x86@kernel.org - kasan-dev@googlegroups.com - borntraeger@de.ibm.com - heiko.carstens@de.ibm.com - davem@davemloft.net - willy@infradead.org - mhocko@kernel.org - ard.biesheuvel@linaro.org - mark.rutland@arm.com - catalin.marinas@arm.com - sam@ravnborg.org - mgorman@techsingularity.net - steven.sistare@oracle.com - daniel.m.jordan@oracle.com - " bob.picco@oracle.com\0" + "To\0linux-arm-kernel@lists.infradead.org\0" "\00:1\0" "b\0" "Hi Pavel,\n" @@ -330,7 +309,7 @@ "-\t * kernel image with SWAPPER_BLOCK_SIZE mappings, so we have to round\n" "-\t * the start and end addresses to SWAPPER_BLOCK_SIZE as well, to prevent\n" "-\t * kasan_populate_zero_shadow() from replacing the page table entries\n" - "-\t * (PMD or PTE) at the edges of the shadow region for the kernel\n" + "-\t * (PMD or PTE)@the edges of the shadow region for the kernel\n" "-\t * image.\n" "-\t */\n" "-\tkimg_shadow_start = round_down(kimg_shadow_start, SWAPPER_BLOCK_SIZE);\n" @@ -342,4 +321,4 @@ "-- \n" 2.1.4 -54f0d924118ea9e7d5a9a4e88d80a65afd549928e112fc77d43f662045976622 +f014dc64a9e245d1e83c7b73ca492fd53d5241be48219926105564d4693b5a26
diff --git a/a/1.txt b/N3/1.txt index aea08fe..7c24497 100644 --- a/a/1.txt +++ b/N3/1.txt @@ -27,288 +27,3 @@ Cheers, Will --->8 - ->From 36c6c7c06273d08348b47c1a182116b0a1df8363 Mon Sep 17 00:00:00 2001 -From: Will Deacon <will.deacon@arm.com> -Date: Tue, 10 Oct 2017 15:49:43 +0100 -Subject: [PATCH] arm64: kasan: Avoid using vmemmap_populate to initialise - shadow - -The kasan shadow is currently mapped using vmemmap_populate since that -provides a semi-convenient way to map pages into swapper. However, since -that no longer zeroes the mapped pages, it is not suitable for kasan, -which requires that the shadow is zeroed in order to avoid false -positives. - -This patch removes our reliance on vmemmap_populate and reuses the -existing kasan page table code, which is already required for creating -the early shadow. - -Signed-off-by: Will Deacon <will.deacon@arm.com> ---- - arch/arm64/Kconfig | 2 +- - arch/arm64/mm/kasan_init.c | 176 +++++++++++++++++++-------------------------- - 2 files changed, 74 insertions(+), 104 deletions(-) - -diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig -index 0df64a6a56d4..888580b9036e 100644 ---- a/arch/arm64/Kconfig -+++ b/arch/arm64/Kconfig -@@ -68,7 +68,7 @@ config ARM64 - select HAVE_ARCH_BITREVERSE - select HAVE_ARCH_HUGE_VMAP - select HAVE_ARCH_JUMP_LABEL -- select HAVE_ARCH_KASAN if SPARSEMEM_VMEMMAP && !(ARM64_16K_PAGES && ARM64_VA_BITS_48) -+ select HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48) - select HAVE_ARCH_KGDB - select HAVE_ARCH_MMAP_RND_BITS - select HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT -diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c -index cb4af2951c90..b922826d9908 100644 ---- a/arch/arm64/mm/kasan_init.c -+++ b/arch/arm64/mm/kasan_init.c -@@ -11,6 +11,7 @@ - */ - - #define pr_fmt(fmt) "kasan: " fmt -+#include <linux/bootmem.h> - #include <linux/kasan.h> - #include <linux/kernel.h> - #include <linux/sched/task.h> -@@ -28,66 +29,6 @@ - - static pgd_t tmp_pg_dir[PTRS_PER_PGD] __initdata __aligned(PGD_SIZE); - --/* Creates mappings for kasan during early boot. The mapped memory is zeroed */ --static int __meminit kasan_map_populate(unsigned long start, unsigned long end, -- int node) --{ -- unsigned long addr, pfn, next; -- unsigned long long size; -- pgd_t *pgd; -- pud_t *pud; -- pmd_t *pmd; -- pte_t *pte; -- int ret; -- -- ret = vmemmap_populate(start, end, node); -- /* -- * We might have partially populated memory, so check for no entries, -- * and zero only those that actually exist. -- */ -- for (addr = start; addr < end; addr = next) { -- pgd = pgd_offset_k(addr); -- if (pgd_none(*pgd)) { -- next = pgd_addr_end(addr, end); -- continue; -- } -- -- pud = pud_offset(pgd, addr); -- if (pud_none(*pud)) { -- next = pud_addr_end(addr, end); -- continue; -- } -- if (pud_sect(*pud)) { -- /* This is PUD size page */ -- next = pud_addr_end(addr, end); -- size = PUD_SIZE; -- pfn = pud_pfn(*pud); -- } else { -- pmd = pmd_offset(pud, addr); -- if (pmd_none(*pmd)) { -- next = pmd_addr_end(addr, end); -- continue; -- } -- if (pmd_sect(*pmd)) { -- /* This is PMD size page */ -- next = pmd_addr_end(addr, end); -- size = PMD_SIZE; -- pfn = pmd_pfn(*pmd); -- } else { -- pte = pte_offset_kernel(pmd, addr); -- next = addr + PAGE_SIZE; -- if (pte_none(*pte)) -- continue; -- /* This is base size page */ -- size = PAGE_SIZE; -- pfn = pte_pfn(*pte); -- } -- } -- memset(phys_to_virt(PFN_PHYS(pfn)), 0, size); -- } -- return ret; --} -- - /* - * The p*d_populate functions call virt_to_phys implicitly so they can't be used - * directly on kernel symbols (bm_p*d). All the early functions are called too -@@ -95,77 +36,117 @@ static int __meminit kasan_map_populate(unsigned long start, unsigned long end, - * with the physical address from __pa_symbol. - */ - --static void __init kasan_early_pte_populate(pmd_t *pmd, unsigned long addr, -- unsigned long end) -+static phys_addr_t __init kasan_alloc_zeroed_page(int node) - { -- pte_t *pte; -- unsigned long next; -+ void *p = memblock_virt_alloc_try_nid(PAGE_SIZE, PAGE_SIZE, -+ __pa(MAX_DMA_ADDRESS), -+ MEMBLOCK_ALLOC_ACCESSIBLE, node); -+ return __pa(p); -+} - -- if (pmd_none(*pmd)) -- __pmd_populate(pmd, __pa_symbol(kasan_zero_pte), PMD_TYPE_TABLE); -+static pte_t *__init kasan_pte_offset(pmd_t *pmd, unsigned long addr, int node, -+ bool early) -+{ -+ if (pmd_none(*pmd)) { -+ phys_addr_t pte_phys = early ? __pa_symbol(kasan_zero_pte) -+ : kasan_alloc_zeroed_page(node); -+ __pmd_populate(pmd, pte_phys, PMD_TYPE_TABLE); -+ } -+ -+ return early ? pte_offset_kimg(pmd, addr) -+ : pte_offset_kernel(pmd, addr); -+} -+ -+static pmd_t *__init kasan_pmd_offset(pud_t *pud, unsigned long addr, int node, -+ bool early) -+{ -+ if (pud_none(*pud)) { -+ phys_addr_t pmd_phys = early ? __pa_symbol(kasan_zero_pmd) -+ : kasan_alloc_zeroed_page(node); -+ __pud_populate(pud, pmd_phys, PMD_TYPE_TABLE); -+ } -+ -+ return early ? pmd_offset_kimg(pud, addr) : pmd_offset(pud, addr); -+} -+ -+static pud_t *__init kasan_pud_offset(pgd_t *pgd, unsigned long addr, int node, -+ bool early) -+{ -+ if (pgd_none(*pgd)) { -+ phys_addr_t pud_phys = early ? __pa_symbol(kasan_zero_pud) -+ : kasan_alloc_zeroed_page(node); -+ __pgd_populate(pgd, pud_phys, PMD_TYPE_TABLE); -+ } -+ -+ return early ? pud_offset_kimg(pgd, addr) : pud_offset(pgd, addr); -+} -+ -+static void __init kasan_pte_populate(pmd_t *pmd, unsigned long addr, -+ unsigned long end, int node, bool early) -+{ -+ unsigned long next; -+ pte_t *pte = kasan_pte_offset(pmd, addr, node, early); - -- pte = pte_offset_kimg(pmd, addr); - do { -+ phys_addr_t page_phys = early ? __pa_symbol(kasan_zero_page) -+ : kasan_alloc_zeroed_page(node); - next = addr + PAGE_SIZE; -- set_pte(pte, pfn_pte(sym_to_pfn(kasan_zero_page), -- PAGE_KERNEL)); -+ set_pte(pte, pfn_pte(__phys_to_pfn(page_phys), PAGE_KERNEL)); - } while (pte++, addr = next, addr != end && pte_none(*pte)); - } - --static void __init kasan_early_pmd_populate(pud_t *pud, -- unsigned long addr, -- unsigned long end) -+static void __init kasan_pmd_populate(pud_t *pud, unsigned long addr, -+ unsigned long end, int node, bool early) - { -- pmd_t *pmd; - unsigned long next; -+ pmd_t *pmd = kasan_pmd_offset(pud, addr, node, early); - -- if (pud_none(*pud)) -- __pud_populate(pud, __pa_symbol(kasan_zero_pmd), PMD_TYPE_TABLE); -- -- pmd = pmd_offset_kimg(pud, addr); - do { - next = pmd_addr_end(addr, end); -- kasan_early_pte_populate(pmd, addr, next); -+ kasan_pte_populate(pmd, addr, next, node, early); - } while (pmd++, addr = next, addr != end && pmd_none(*pmd)); - } - --static void __init kasan_early_pud_populate(pgd_t *pgd, -- unsigned long addr, -- unsigned long end) -+static void __init kasan_pud_populate(pgd_t *pgd, unsigned long addr, -+ unsigned long end, int node, bool early) - { -- pud_t *pud; - unsigned long next; -+ pud_t *pud = kasan_pud_offset(pgd, addr, node, early); - -- if (pgd_none(*pgd)) -- __pgd_populate(pgd, __pa_symbol(kasan_zero_pud), PUD_TYPE_TABLE); -- -- pud = pud_offset_kimg(pgd, addr); - do { - next = pud_addr_end(addr, end); -- kasan_early_pmd_populate(pud, addr, next); -+ kasan_pmd_populate(pud, addr, next, node, early); - } while (pud++, addr = next, addr != end && pud_none(*pud)); - } - --static void __init kasan_map_early_shadow(void) -+static void __init kasan_pgd_populate(unsigned long addr, unsigned long end, -+ int node, bool early) - { -- unsigned long addr = KASAN_SHADOW_START; -- unsigned long end = KASAN_SHADOW_END; - unsigned long next; - pgd_t *pgd; - - pgd = pgd_offset_k(addr); - do { - next = pgd_addr_end(addr, end); -- kasan_early_pud_populate(pgd, addr, next); -+ kasan_pud_populate(pgd, addr, next, node, early); - } while (pgd++, addr = next, addr != end); - } - -+/* The early shadow maps everything to a single page of zeroes */ - asmlinkage void __init kasan_early_init(void) - { - BUILD_BUG_ON(KASAN_SHADOW_OFFSET != KASAN_SHADOW_END - (1UL << 61)); - BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_START, PGDIR_SIZE)); - BUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_END, PGDIR_SIZE)); -- kasan_map_early_shadow(); -+ kasan_pgd_populate(KASAN_SHADOW_START, KASAN_SHADOW_END, NUMA_NO_NODE, -+ true); -+} -+ -+/* Set up full kasan mappings, ensuring that the mapped pages are zeroed */ -+static void __init kasan_map_populate(unsigned long start, unsigned long end, -+ int node) -+{ -+ kasan_pgd_populate(start & PAGE_MASK, PAGE_ALIGN(end), node, false); - } - - /* -@@ -224,17 +205,6 @@ void __init kasan_init(void) - kasan_map_populate(kimg_shadow_start, kimg_shadow_end, - pfn_to_nid(virt_to_pfn(lm_alias(_text)))); - -- /* -- * kasan_map_populate() has populated the shadow region that covers the -- * kernel image with SWAPPER_BLOCK_SIZE mappings, so we have to round -- * the start and end addresses to SWAPPER_BLOCK_SIZE as well, to prevent -- * kasan_populate_zero_shadow() from replacing the page table entries -- * (PMD or PTE) at the edges of the shadow region for the kernel -- * image. -- */ -- kimg_shadow_start = round_down(kimg_shadow_start, SWAPPER_BLOCK_SIZE); -- kimg_shadow_end = round_up(kimg_shadow_end, SWAPPER_BLOCK_SIZE); -- - kasan_populate_zero_shadow((void *)KASAN_SHADOW_START, - (void *)mod_shadow_start); - kasan_populate_zero_shadow((void *)kimg_shadow_end, --- -2.1.4 diff --git a/a/content_digest b/N3/content_digest index bafd213..ae52010 100644 --- a/a/content_digest +++ b/N3/content_digest @@ -55,291 +55,6 @@ "\n" "Will\n" "\n" - "--->8\n" - "\n" - ">From 36c6c7c06273d08348b47c1a182116b0a1df8363 Mon Sep 17 00:00:00 2001\n" - "From: Will Deacon <will.deacon@arm.com>\n" - "Date: Tue, 10 Oct 2017 15:49:43 +0100\n" - "Subject: [PATCH] arm64: kasan: Avoid using vmemmap_populate to initialise\n" - " shadow\n" - "\n" - "The kasan shadow is currently mapped using vmemmap_populate since that\n" - "provides a semi-convenient way to map pages into swapper. However, since\n" - "that no longer zeroes the mapped pages, it is not suitable for kasan,\n" - "which requires that the shadow is zeroed in order to avoid false\n" - "positives.\n" - "\n" - "This patch removes our reliance on vmemmap_populate and reuses the\n" - "existing kasan page table code, which is already required for creating\n" - "the early shadow.\n" - "\n" - "Signed-off-by: Will Deacon <will.deacon@arm.com>\n" - "---\n" - " arch/arm64/Kconfig | 2 +-\n" - " arch/arm64/mm/kasan_init.c | 176 +++++++++++++++++++--------------------------\n" - " 2 files changed, 74 insertions(+), 104 deletions(-)\n" - "\n" - "diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig\n" - "index 0df64a6a56d4..888580b9036e 100644\n" - "--- a/arch/arm64/Kconfig\n" - "+++ b/arch/arm64/Kconfig\n" - "@@ -68,7 +68,7 @@ config ARM64\n" - " \tselect HAVE_ARCH_BITREVERSE\n" - " \tselect HAVE_ARCH_HUGE_VMAP\n" - " \tselect HAVE_ARCH_JUMP_LABEL\n" - "-\tselect HAVE_ARCH_KASAN if SPARSEMEM_VMEMMAP && !(ARM64_16K_PAGES && ARM64_VA_BITS_48)\n" - "+\tselect HAVE_ARCH_KASAN if !(ARM64_16K_PAGES && ARM64_VA_BITS_48)\n" - " \tselect HAVE_ARCH_KGDB\n" - " \tselect HAVE_ARCH_MMAP_RND_BITS\n" - " \tselect HAVE_ARCH_MMAP_RND_COMPAT_BITS if COMPAT\n" - "diff --git a/arch/arm64/mm/kasan_init.c b/arch/arm64/mm/kasan_init.c\n" - "index cb4af2951c90..b922826d9908 100644\n" - "--- a/arch/arm64/mm/kasan_init.c\n" - "+++ b/arch/arm64/mm/kasan_init.c\n" - "@@ -11,6 +11,7 @@\n" - " */\n" - " \n" - " #define pr_fmt(fmt) \"kasan: \" fmt\n" - "+#include <linux/bootmem.h>\n" - " #include <linux/kasan.h>\n" - " #include <linux/kernel.h>\n" - " #include <linux/sched/task.h>\n" - "@@ -28,66 +29,6 @@\n" - " \n" - " static pgd_t tmp_pg_dir[PTRS_PER_PGD] __initdata __aligned(PGD_SIZE);\n" - " \n" - "-/* Creates mappings for kasan during early boot. The mapped memory is zeroed */\n" - "-static int __meminit kasan_map_populate(unsigned long start, unsigned long end,\n" - "-\t\t\t\t\tint node)\n" - "-{\n" - "-\tunsigned long addr, pfn, next;\n" - "-\tunsigned long long size;\n" - "-\tpgd_t *pgd;\n" - "-\tpud_t *pud;\n" - "-\tpmd_t *pmd;\n" - "-\tpte_t *pte;\n" - "-\tint ret;\n" - "-\n" - "-\tret = vmemmap_populate(start, end, node);\n" - "-\t/*\n" - "-\t * We might have partially populated memory, so check for no entries,\n" - "-\t * and zero only those that actually exist.\n" - "-\t */\n" - "-\tfor (addr = start; addr < end; addr = next) {\n" - "-\t\tpgd = pgd_offset_k(addr);\n" - "-\t\tif (pgd_none(*pgd)) {\n" - "-\t\t\tnext = pgd_addr_end(addr, end);\n" - "-\t\t\tcontinue;\n" - "-\t\t}\n" - "-\n" - "-\t\tpud = pud_offset(pgd, addr);\n" - "-\t\tif (pud_none(*pud)) {\n" - "-\t\t\tnext = pud_addr_end(addr, end);\n" - "-\t\t\tcontinue;\n" - "-\t\t}\n" - "-\t\tif (pud_sect(*pud)) {\n" - "-\t\t\t/* This is PUD size page */\n" - "-\t\t\tnext = pud_addr_end(addr, end);\n" - "-\t\t\tsize = PUD_SIZE;\n" - "-\t\t\tpfn = pud_pfn(*pud);\n" - "-\t\t} else {\n" - "-\t\t\tpmd = pmd_offset(pud, addr);\n" - "-\t\t\tif (pmd_none(*pmd)) {\n" - "-\t\t\t\tnext = pmd_addr_end(addr, end);\n" - "-\t\t\t\tcontinue;\n" - "-\t\t\t}\n" - "-\t\t\tif (pmd_sect(*pmd)) {\n" - "-\t\t\t\t/* This is PMD size page */\n" - "-\t\t\t\tnext = pmd_addr_end(addr, end);\n" - "-\t\t\t\tsize = PMD_SIZE;\n" - "-\t\t\t\tpfn = pmd_pfn(*pmd);\n" - "-\t\t\t} else {\n" - "-\t\t\t\tpte = pte_offset_kernel(pmd, addr);\n" - "-\t\t\t\tnext = addr + PAGE_SIZE;\n" - "-\t\t\t\tif (pte_none(*pte))\n" - "-\t\t\t\t\tcontinue;\n" - "-\t\t\t\t/* This is base size page */\n" - "-\t\t\t\tsize = PAGE_SIZE;\n" - "-\t\t\t\tpfn = pte_pfn(*pte);\n" - "-\t\t\t}\n" - "-\t\t}\n" - "-\t\tmemset(phys_to_virt(PFN_PHYS(pfn)), 0, size);\n" - "-\t}\n" - "-\treturn ret;\n" - "-}\n" - "-\n" - " /*\n" - " * The p*d_populate functions call virt_to_phys implicitly so they can't be used\n" - " * directly on kernel symbols (bm_p*d). All the early functions are called too\n" - "@@ -95,77 +36,117 @@ static int __meminit kasan_map_populate(unsigned long start, unsigned long end,\n" - " * with the physical address from __pa_symbol.\n" - " */\n" - " \n" - "-static void __init kasan_early_pte_populate(pmd_t *pmd, unsigned long addr,\n" - "-\t\t\t\t\tunsigned long end)\n" - "+static phys_addr_t __init kasan_alloc_zeroed_page(int node)\n" - " {\n" - "-\tpte_t *pte;\n" - "-\tunsigned long next;\n" - "+\tvoid *p = memblock_virt_alloc_try_nid(PAGE_SIZE, PAGE_SIZE,\n" - "+\t\t\t\t\t __pa(MAX_DMA_ADDRESS),\n" - "+\t\t\t\t\t MEMBLOCK_ALLOC_ACCESSIBLE, node);\n" - "+\treturn __pa(p);\n" - "+}\n" - " \n" - "-\tif (pmd_none(*pmd))\n" - "-\t\t__pmd_populate(pmd, __pa_symbol(kasan_zero_pte), PMD_TYPE_TABLE);\n" - "+static pte_t *__init kasan_pte_offset(pmd_t *pmd, unsigned long addr, int node,\n" - "+\t\t\t\t bool early)\n" - "+{\n" - "+\tif (pmd_none(*pmd)) {\n" - "+\t\tphys_addr_t pte_phys = early ? __pa_symbol(kasan_zero_pte)\n" - "+\t\t\t\t\t : kasan_alloc_zeroed_page(node);\n" - "+\t\t__pmd_populate(pmd, pte_phys, PMD_TYPE_TABLE);\n" - "+\t}\n" - "+\n" - "+\treturn early ? pte_offset_kimg(pmd, addr)\n" - "+\t\t : pte_offset_kernel(pmd, addr);\n" - "+}\n" - "+\n" - "+static pmd_t *__init kasan_pmd_offset(pud_t *pud, unsigned long addr, int node,\n" - "+\t\t\t\t bool early)\n" - "+{\n" - "+\tif (pud_none(*pud)) {\n" - "+\t\tphys_addr_t pmd_phys = early ? __pa_symbol(kasan_zero_pmd)\n" - "+\t\t\t\t\t : kasan_alloc_zeroed_page(node);\n" - "+\t\t__pud_populate(pud, pmd_phys, PMD_TYPE_TABLE);\n" - "+\t}\n" - "+\n" - "+\treturn early ? pmd_offset_kimg(pud, addr) : pmd_offset(pud, addr);\n" - "+}\n" - "+\n" - "+static pud_t *__init kasan_pud_offset(pgd_t *pgd, unsigned long addr, int node,\n" - "+\t\t\t\t bool early)\n" - "+{\n" - "+\tif (pgd_none(*pgd)) {\n" - "+\t\tphys_addr_t pud_phys = early ? __pa_symbol(kasan_zero_pud)\n" - "+\t\t\t\t\t : kasan_alloc_zeroed_page(node);\n" - "+\t\t__pgd_populate(pgd, pud_phys, PMD_TYPE_TABLE);\n" - "+\t}\n" - "+\n" - "+\treturn early ? pud_offset_kimg(pgd, addr) : pud_offset(pgd, addr);\n" - "+}\n" - "+\n" - "+static void __init kasan_pte_populate(pmd_t *pmd, unsigned long addr,\n" - "+\t\t\t\t unsigned long end, int node, bool early)\n" - "+{\n" - "+\tunsigned long next;\n" - "+\tpte_t *pte = kasan_pte_offset(pmd, addr, node, early);\n" - " \n" - "-\tpte = pte_offset_kimg(pmd, addr);\n" - " \tdo {\n" - "+\t\tphys_addr_t page_phys = early ? __pa_symbol(kasan_zero_page)\n" - "+\t\t\t\t\t : kasan_alloc_zeroed_page(node);\n" - " \t\tnext = addr + PAGE_SIZE;\n" - "-\t\tset_pte(pte, pfn_pte(sym_to_pfn(kasan_zero_page),\n" - "-\t\t\t\t\tPAGE_KERNEL));\n" - "+\t\tset_pte(pte, pfn_pte(__phys_to_pfn(page_phys), PAGE_KERNEL));\n" - " \t} while (pte++, addr = next, addr != end && pte_none(*pte));\n" - " }\n" - " \n" - "-static void __init kasan_early_pmd_populate(pud_t *pud,\n" - "-\t\t\t\t\tunsigned long addr,\n" - "-\t\t\t\t\tunsigned long end)\n" - "+static void __init kasan_pmd_populate(pud_t *pud, unsigned long addr,\n" - "+\t\t\t\t unsigned long end, int node, bool early)\n" - " {\n" - "-\tpmd_t *pmd;\n" - " \tunsigned long next;\n" - "+\tpmd_t *pmd = kasan_pmd_offset(pud, addr, node, early);\n" - " \n" - "-\tif (pud_none(*pud))\n" - "-\t\t__pud_populate(pud, __pa_symbol(kasan_zero_pmd), PMD_TYPE_TABLE);\n" - "-\n" - "-\tpmd = pmd_offset_kimg(pud, addr);\n" - " \tdo {\n" - " \t\tnext = pmd_addr_end(addr, end);\n" - "-\t\tkasan_early_pte_populate(pmd, addr, next);\n" - "+\t\tkasan_pte_populate(pmd, addr, next, node, early);\n" - " \t} while (pmd++, addr = next, addr != end && pmd_none(*pmd));\n" - " }\n" - " \n" - "-static void __init kasan_early_pud_populate(pgd_t *pgd,\n" - "-\t\t\t\t\tunsigned long addr,\n" - "-\t\t\t\t\tunsigned long end)\n" - "+static void __init kasan_pud_populate(pgd_t *pgd, unsigned long addr,\n" - "+\t\t\t\t unsigned long end, int node, bool early)\n" - " {\n" - "-\tpud_t *pud;\n" - " \tunsigned long next;\n" - "+\tpud_t *pud = kasan_pud_offset(pgd, addr, node, early);\n" - " \n" - "-\tif (pgd_none(*pgd))\n" - "-\t\t__pgd_populate(pgd, __pa_symbol(kasan_zero_pud), PUD_TYPE_TABLE);\n" - "-\n" - "-\tpud = pud_offset_kimg(pgd, addr);\n" - " \tdo {\n" - " \t\tnext = pud_addr_end(addr, end);\n" - "-\t\tkasan_early_pmd_populate(pud, addr, next);\n" - "+\t\tkasan_pmd_populate(pud, addr, next, node, early);\n" - " \t} while (pud++, addr = next, addr != end && pud_none(*pud));\n" - " }\n" - " \n" - "-static void __init kasan_map_early_shadow(void)\n" - "+static void __init kasan_pgd_populate(unsigned long addr, unsigned long end,\n" - "+\t\t\t\t int node, bool early)\n" - " {\n" - "-\tunsigned long addr = KASAN_SHADOW_START;\n" - "-\tunsigned long end = KASAN_SHADOW_END;\n" - " \tunsigned long next;\n" - " \tpgd_t *pgd;\n" - " \n" - " \tpgd = pgd_offset_k(addr);\n" - " \tdo {\n" - " \t\tnext = pgd_addr_end(addr, end);\n" - "-\t\tkasan_early_pud_populate(pgd, addr, next);\n" - "+\t\tkasan_pud_populate(pgd, addr, next, node, early);\n" - " \t} while (pgd++, addr = next, addr != end);\n" - " }\n" - " \n" - "+/* The early shadow maps everything to a single page of zeroes */\n" - " asmlinkage void __init kasan_early_init(void)\n" - " {\n" - " \tBUILD_BUG_ON(KASAN_SHADOW_OFFSET != KASAN_SHADOW_END - (1UL << 61));\n" - " \tBUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_START, PGDIR_SIZE));\n" - " \tBUILD_BUG_ON(!IS_ALIGNED(KASAN_SHADOW_END, PGDIR_SIZE));\n" - "-\tkasan_map_early_shadow();\n" - "+\tkasan_pgd_populate(KASAN_SHADOW_START, KASAN_SHADOW_END, NUMA_NO_NODE,\n" - "+\t\t\t true);\n" - "+}\n" - "+\n" - "+/* Set up full kasan mappings, ensuring that the mapped pages are zeroed */\n" - "+static void __init kasan_map_populate(unsigned long start, unsigned long end,\n" - "+\t\t\t\t int node)\n" - "+{\n" - "+\tkasan_pgd_populate(start & PAGE_MASK, PAGE_ALIGN(end), node, false);\n" - " }\n" - " \n" - " /*\n" - "@@ -224,17 +205,6 @@ void __init kasan_init(void)\n" - " \tkasan_map_populate(kimg_shadow_start, kimg_shadow_end,\n" - " \t\t\t pfn_to_nid(virt_to_pfn(lm_alias(_text))));\n" - " \n" - "-\t/*\n" - "-\t * kasan_map_populate() has populated the shadow region that covers the\n" - "-\t * kernel image with SWAPPER_BLOCK_SIZE mappings, so we have to round\n" - "-\t * the start and end addresses to SWAPPER_BLOCK_SIZE as well, to prevent\n" - "-\t * kasan_populate_zero_shadow() from replacing the page table entries\n" - "-\t * (PMD or PTE) at the edges of the shadow region for the kernel\n" - "-\t * image.\n" - "-\t */\n" - "-\tkimg_shadow_start = round_down(kimg_shadow_start, SWAPPER_BLOCK_SIZE);\n" - "-\tkimg_shadow_end = round_up(kimg_shadow_end, SWAPPER_BLOCK_SIZE);\n" - "-\n" - " \tkasan_populate_zero_shadow((void *)KASAN_SHADOW_START,\n" - " \t\t\t\t (void *)mod_shadow_start);\n" - " \tkasan_populate_zero_shadow((void *)kimg_shadow_end,\n" - "-- \n" - 2.1.4 + --->8 -54f0d924118ea9e7d5a9a4e88d80a65afd549928e112fc77d43f662045976622 +b75491045d8bdded6478c478e5cfa875d1397cdb126121cd3687fb3a00d4ae92
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.