Fix Kexec/Kdump for power6
PATCH 1/1 Fix Kexec/Kdump for power6
Paul, please consider the following patch for next merge.
Thanks
-Sachin
Signed-off-by Sachin Sant <[email protected]>
Signed-off-by Mohan Kumar M <[email protected]>
Acked-by Olof Johansson <[email protected]>
* On Power machines supporting VRMA, Kexec/Kdump does not work.
* Hypervisor stores VRMA mapping used by the OS, in the hpte hash tables.
* Make sure these hpte entries are left untouched.
*
* This patch also adds plpar_pte_read_raw() on the lines of
* plpar_pte_remove_raw().
Signed-off-by Sachin Sant <[email protected]>
Signed-off-by Mohan Kumar M <[email protected]>
Acked-by Olof Johansson <[email protected]>
---
arch/powerpc/platforms/pseries/lpar.c +14 -3
@@ -373,12 +373,23 @@ static void pSeries_lpar_hptab_clear(voi {unsigned long size_bytes =1UL << ppc64_pft_size;unsigned long hpte_count = size_bytes >>4 ; -unsigned long dummy1, dummy2; +unsigned long dummy1, dummy2, dword0; +long lpar_rc;int i;/* TODO: Use bulk call */ -for (i =0 ; i < hpte_count; i++) -plpar_pte_remove_raw (0 , i,0 , &dummy1, &dummy2); +for (i =0 ; i < hpte_count; i++) { +/* dont remove HPTEs with VRMA mappings */ + lpar_rc =plpar_pte_remove_raw (H_ANDCOND , i,HPTE_V_1TB_SEG , + &dummy1, &dummy2); +if (lpar_rc ==H_NOT_FOUND ) { + lpar_rc =plpar_pte_read_raw (0 , i, &dword0, &dummy1); +if (!lpar_rc && ((dword0 &HPTE_V_VRMA_MASK ) + !=HPTE_V_VRMA_MASK )) +/* Can be hpte for 1TB Seg. So remove it */ +plpar_pte_remove_raw (0 , i,0 , &dummy1, &dummy2); + } + } }/*
arch/powerpc/platforms/pseries/plpar_wrappers.h +15 -0
@@ -108,6 +108,21 @@ static inline long plpar_pte_read(unsignreturn rc; } +/* plpar_pte_read_raw can be called in real mode. It calls plpar_hcall_raw */ +static inline long plpar_pte_read_raw (unsigned long flags,unsigned long ptex, +unsigned long *old_pteh_ret,unsigned long *old_ptel_ret) +{ +long rc; +unsigned long retbuf[PLPAR_HCALL_BUFSIZE ]; + + rc =plpar_hcall_raw (H_READ , retbuf, flags, ptex); + + *old_pteh_ret = retbuf[0 ]; + *old_ptel_ret = retbuf[1 ]; + +return rc; +} +static inline long plpar_pte_protect (unsigned long flags,unsigned long ptex,unsigned long avpn) {
include/asm-powerpc/mmu-hash64.h +3 -0
@@ -94,6 +94,9 @@ extern char initial_stab[];#define HPTE_R_C ASM_CONST(0x0000000000000080)#define HPTE_R_R ASM_CONST(0x0000000000000100) +#define HPTE_V_1TB_SEG ASM_CONST(0x4000000000000000) +#define HPTE_V_VRMA_MASK ASM_CONST(0x4001ffffff000000) +/* Values for PP (assumes Ks=0, Kp=1) */ /* pp0 will always be 0 for linux */ #define PP_RWXX 0/* Supervisor read/write, User none */