powerpc/32s: move hash code patching out of MMU_init_hw()
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>
This commit is contained in:
parent
2edb16efc8
commit
72f208c6a8
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
||||
Hash_mask = n_hpteg - 1;
|
||||
hash_mb2 = hash_mb = 32 - LG_HPTEG_SIZE - lg_n_hpteg;
|
||||
if (lg_n_hpteg > 16)
|
||||
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
|
||||
*/
|
||||
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;
|
||||
if (lg_n_hpteg > 16)
|
||||
mb2 = 16 - LG_HPTEG_SIZE;
|
||||
|
||||
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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue