]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
powerpc/32s: move hash code patching out of MMU_init_hw()
authorChristophe Leroy <christophe.leroy@c-s.fr>
Fri, 26 Apr 2019 16:23:35 +0000 (16:23 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 2 May 2019 15:20:26 +0000 (01:20 +1000)
For KASAN, hash table handling will be activated early for
accessing to KASAN shadow areas.

In order to avoid any modification of the hash functions while
they are still used with the early hash table, the code patching
is moved out of MMU_init_hw() and put close to the big-bang switch
to the final hash table.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/head_32.S
arch/powerpc/mm/book3s32/mmu.c
arch/powerpc/mm/mmu_decl.h

index 6e85171e513c821fb69fa5a0ee1d350444e7d1f8..5958ea685968670560e5e0d2f64290e2d3951471 100644 (file)
@@ -977,6 +977,9 @@ start_here:
        bl      machine_init
        bl      __save_cpu_setup
        bl      MMU_init
+BEGIN_MMU_FTR_SECTION
+       bl      MMU_init_hw_patch
+END_MMU_FTR_SECTION_IFSET(MMU_FTR_HPTE_TABLE)
 
 /*
  * Go back to running unmapped so we can load up new values
index 1db55159031ceda2a26067d3a1c085cbf4d72ff5..165529cc9087c04f94b75a46c1cc0e426da2320b 100644 (file)
@@ -39,6 +39,7 @@
 struct hash_pte *Hash, *Hash_end;
 unsigned long Hash_size, Hash_mask;
 unsigned long _SDR1;
+static unsigned int hash_mb, hash_mb2;
 
 struct ppc_bat BATS[8][2];     /* 8 pairs of IBAT, DBAT */
 
@@ -308,7 +309,6 @@ void hash_preload(struct mm_struct *mm, unsigned long ea,
  */
 void __init MMU_init_hw(void)
 {
-       unsigned int hmask, mb, mb2;
        unsigned int n_hpteg, lg_n_hpteg;
 
        if (!mmu_has_feature(MMU_FTR_HPTE_TABLE))
@@ -351,20 +351,30 @@ void __init MMU_init_hw(void)
               (unsigned long long)(total_memory >> 20), Hash_size >> 10, Hash);
 
 
-       /*
-        * Patch up the instructions in hashtable.S:create_hpte
-        */
-       if ( ppc_md.progress ) ppc_md.progress("hash:patch", 0x345);
        Hash_mask = n_hpteg - 1;
-       hmask = Hash_mask >> (16 - LG_HPTEG_SIZE);
-       mb2 = mb = 32 - LG_HPTEG_SIZE - lg_n_hpteg;
+       hash_mb2 = hash_mb = 32 - LG_HPTEG_SIZE - lg_n_hpteg;
        if (lg_n_hpteg > 16)
-               mb2 = 16 - LG_HPTEG_SIZE;
+               hash_mb2 = 16 - LG_HPTEG_SIZE;
+}
+
+void __init MMU_init_hw_patch(void)
+{
+       unsigned int hmask = Hash_mask >> (16 - LG_HPTEG_SIZE);
 
+       if (ppc_md.progress)
+               ppc_md.progress("hash:patch", 0x345);
+       if (ppc_md.progress)
+               ppc_md.progress("hash:done", 0x205);
+
+       /* WARNING: Make sure nothing can trigger a KASAN check past this point */
+
+       /*
+        * Patch up the instructions in hashtable.S:create_hpte
+        */
        modify_instruction_site(&patch__hash_page_A0, 0xffff,
                                ((unsigned int)Hash - PAGE_OFFSET) >> 16);
-       modify_instruction_site(&patch__hash_page_A1, 0x7c0, mb << 6);
-       modify_instruction_site(&patch__hash_page_A2, 0x7c0, mb2 << 6);
+       modify_instruction_site(&patch__hash_page_A1, 0x7c0, hash_mb << 6);
+       modify_instruction_site(&patch__hash_page_A2, 0x7c0, hash_mb2 << 6);
        modify_instruction_site(&patch__hash_page_B, 0xffff, hmask);
        modify_instruction_site(&patch__hash_page_C, 0xffff, hmask);
 
@@ -373,11 +383,9 @@ void __init MMU_init_hw(void)
         */
        modify_instruction_site(&patch__flush_hash_A0, 0xffff,
                                ((unsigned int)Hash - PAGE_OFFSET) >> 16);
-       modify_instruction_site(&patch__flush_hash_A1, 0x7c0, mb << 6);
-       modify_instruction_site(&patch__flush_hash_A2, 0x7c0, mb2 << 6);
+       modify_instruction_site(&patch__flush_hash_A1, 0x7c0, hash_mb << 6);
+       modify_instruction_site(&patch__flush_hash_A2, 0x7c0, hash_mb2 << 6);
        modify_instruction_site(&patch__flush_hash_B, 0xffff, hmask);
-
-       if ( ppc_md.progress ) ppc_md.progress("hash:done", 0x205);
 }
 
 void setup_initial_memory_limit(phys_addr_t first_memblock_base,
index 74ff61dabcb1dddb1088cff3a1f6e14561b9ead5..d726ff7760546ec0d63f738478f0d9a09a18ed10 100644 (file)
@@ -130,6 +130,7 @@ extern void wii_memory_fixups(void);
  */
 #ifdef CONFIG_PPC32
 extern void MMU_init_hw(void);
+void MMU_init_hw_patch(void);
 unsigned long mmu_mapin_ram(unsigned long base, unsigned long top);
 #endif