RISC-V: Avoid using invalid intermediate translations
authorPalmer Dabbelt <palmer@sifive.com>
Wed, 27 Mar 2019 00:40:24 +0000 (17:40 -0700)
committerPalmer Dabbelt <palmer@sifive.com>
Fri, 17 May 2019 03:42:13 +0000 (20:42 -0700)
This is almost entirely a comment.

Signed-off-by: Palmer Dabbelt <palmer@sifive.com>
Reviewed-by: Anup Patel <anup@brainfault.org>
arch/riscv/kernel/head.S

index 987d4648aad901d53f716df8114d952e6e1c24d4..370c66ce187a8e9225f5ece5dca9043f56d729f6 100644 (file)
@@ -96,7 +96,9 @@ relocate:
 
        /*
         * Load trampoline page directory, which will cause us to trap to
-        * stvec if VA != PA, or simply fall through if VA == PA
+        * stvec if VA != PA, or simply fall through if VA == PA.  We need a
+        * full fence here because setup_vm() just wrote these PTEs and we need
+        * to ensure the new translations are in use.
         */
        la a0, trampoline_pg_dir
        srl a0, a0, PAGE_SHIFT
@@ -115,8 +117,14 @@ relocate:
        la gp, __global_pointer$
 .option pop
 
-       /* Switch to kernel page tables */
+       /*
+        * Switch to kernel page tables.  A full fence is necessary in order to
+        * avoid using the trampoline translations, which are only correct for
+        * the first superpage.  Fetching the fence is guarnteed to work
+        * because that first superpage is translated the same way.
+        */
        csrw CSR_SATP, a2
+       sfence.vma
 
        ret