]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
arm64/mm: move runtime pgds to rodata
authorJun Yao <yaojun8558363@gmail.com>
Mon, 24 Sep 2018 16:56:18 +0000 (17:56 +0100)
committerCatalin Marinas <catalin.marinas@arm.com>
Tue, 25 Sep 2018 14:10:55 +0000 (15:10 +0100)
Now that deliberate writes to swapper_pg_dir are made via the fixmap, we
can defend against errant writes by moving it into the rodata section.
Since tramp_pg_dir and reserved_ttbr0 must be at a fixed offset from
swapper_pg_dir, and are not modified at runtime, these are also moved
into the rodata section. Likewise, idmap_pg_dir is not modified at
runtime, and is moved into rodata.

Signed-off-by: Jun Yao <yaojun8558363@gmail.com>
Reviewed-by: James Morse <james.morse@arm.com>
[Mark: simplify linker script, commit message]
Signed-off-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm64/kernel/head.S
arch/arm64/kernel/vmlinux.lds.S

index 7bf52ee0a805868958661d32a3b74180c787ff7c..4471f570a2952775a1d1224be2d2f6adcbb13027 100644 (file)
@@ -287,18 +287,20 @@ __create_page_tables:
        mov     x28, lr
 
        /*
-        * Invalidate the idmap and swapper page tables to avoid potential
-        * dirty cache lines being evicted.
+        * Invalidate the init page tables to avoid potential dirty cache lines
+        * being evicted. Other page tables are allocated in rodata as part of
+        * the kernel image, and thus are clean to the PoC per the boot
+        * protocol.
         */
-       adrp    x0, idmap_pg_dir
+       adrp    x0, init_pg_dir
        adrp    x1, init_pg_end
        sub     x1, x1, x0
        bl      __inval_dcache_area
 
        /*
-        * Clear the idmap and swapper page tables.
+        * Clear the init page tables.
         */
-       adrp    x0, idmap_pg_dir
+       adrp    x0, init_pg_dir
        adrp    x1, init_pg_end
        sub     x1, x1, x0
 1:     stp     xzr, xzr, [x0], #16
index ac4c10351b17c4bfdb53463eff91e8cc8cae8ea9..ab29c06a7d4bf72b6c8cb6fc1acbd40af1919e87 100644 (file)
@@ -138,6 +138,23 @@ SECTIONS
        EXCEPTION_TABLE(8)              /* __init_begin will be marked RO NX */
        NOTES
 
+       . = ALIGN(PAGE_SIZE);
+       idmap_pg_dir = .;
+       . += IDMAP_DIR_SIZE;
+
+#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
+       tramp_pg_dir = .;
+       . += PAGE_SIZE;
+#endif
+
+#ifdef CONFIG_ARM64_SW_TTBR0_PAN
+       reserved_ttbr0 = .;
+       . += RESERVED_TTBR0_SIZE;
+#endif
+       swapper_pg_dir = .;
+       . += PAGE_SIZE;
+       swapper_pg_end = .;
+
        . = ALIGN(SEGMENT_ALIGN);
        __init_begin = .;
        __inittext_begin = .;
@@ -216,22 +233,6 @@ SECTIONS
        BSS_SECTION(0, 0, 0)
 
        . = ALIGN(PAGE_SIZE);
-       idmap_pg_dir = .;
-       . += IDMAP_DIR_SIZE;
-
-#ifdef CONFIG_UNMAP_KERNEL_AT_EL0
-       tramp_pg_dir = .;
-       . += PAGE_SIZE;
-#endif
-
-#ifdef CONFIG_ARM64_SW_TTBR0_PAN
-       reserved_ttbr0 = .;
-       . += RESERVED_TTBR0_SIZE;
-#endif
-       swapper_pg_dir = .;
-       . += PAGE_SIZE;
-       swapper_pg_end = .;
-
        init_pg_dir = .;
        . += INIT_DIR_SIZE;
        init_pg_end = .;