diff options
Diffstat (limited to 'arch/powerpc/mm/hash_utils_64.c')
| -rw-r--r-- | arch/powerpc/mm/hash_utils_64.c | 14 | 
1 files changed, 14 insertions, 0 deletions
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index de6881259aef..d766d6ee33fe 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c @@ -207,6 +207,20 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,  		if (overlaps_kernel_text(vaddr, vaddr + step))  			tprot &= ~HPTE_R_N; +		/* +		 * If relocatable, check if it overlaps interrupt vectors that +		 * are copied down to real 0. For relocatable kernel +		 * (e.g. kdump case) we copy interrupt vectors down to real +		 * address 0. Mark that region as executable. This is +		 * because on p8 system with relocation on exception feature +		 * enabled, exceptions are raised with MMU (IR=DR=1) ON. Hence +		 * in order to execute the interrupt handlers in virtual +		 * mode the vector region need to be marked as executable. +		 */ +		if ((PHYSICAL_START > MEMORY_START) && +			overlaps_interrupt_vector_text(vaddr, vaddr + step)) +				tprot &= ~HPTE_R_N; +  		hash = hpt_hash(vpn, shift, ssize);  		hpteg = ((hash & htab_hash_mask) * HPTES_PER_GROUP);  | 
