[Patch 2/2] Kexec/Kdump support - POWER6
Mohan Kumar M
mohan at in.ibm.com
Thu May 24 08:17:51 EDT 2007
On Wed, May 23, 2007 at 08:55:00PM +1000, Paul Mackerras wrote:
> Sachin P. Sant writes:
> > 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.
> Surely all we need to do is to avoid clearing the VRMA entries. We
> can do this by not clearing any HPTE where the top 40 bits of the
> first dword are 0x4001ffffff (B=1 for a 1TB segment and the
> 0x0001ffffff special VSID). In fact we can avoid having to read each
> entry by doing the H_REMOVEs with H_ANDCOND and the bolted bit when we
> clear the hash table, and only reading the HPTEs for which the
> H_REMOVE returns an error.
Thanks for your suggestion.
But we can not use 0x4001fffff for H_ANDCOND flag since AND'ing
0x4001ffff value with most of the HPTEs results in non-zero and most of
the HPTE entries are not removed.
>From POWER ISA 2.04 document page 425,
Software should specify PTE(B) = 0b01 for all Page
Table Entries that map the VRMA in order to be
consistent with the values in Figure 14."
So I tried 0x4000000000000000 as AVPN parameter and using that it
removes all hpte entries other than VRMA(ie non 1TB segment size PTE
Tested on POWER6/POWER5 machines.
Starting from POWER5+, hypervisor stores VRMA entries in the HPTE tables
and these entries are need by OS and they should not be cleared. These
VRMA entries will be of segment size 1TB. Using H_ANDCOND flag for
H_REMOVE hypervisor call it is made sure that we will not remove any PTE
whose size is 1TB(ie VRMA entries)
Signed-off-by: Sachin Sant <sachinp at in.ibm.com>
Signed-off-by: Mohan Kumar M <mohan at in.ibm.com>
arch/powerpc/platforms/pseries/lpar.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
@@ -369,6 +369,8 @@ static long pSeries_lpar_hpte_remove(uns
+#define VRMA_HPTE_B_1TB ASM_CONST(0x4000000000000000)
static void pSeries_lpar_hptab_clear(void)
unsigned long size_bytes = 1UL << ppc64_pft_size;
@@ -378,7 +380,9 @@ static void pSeries_lpar_hptab_clear(voi
/* TODO: Use bulk call */
for (i = 0; i < hpte_count; i++)
- plpar_pte_remove_raw(0, i, 0, &dummy1, &dummy2);
+ /* dont remove HPTEs of segments size 1TB (VRMA entries) */
+ plpar_pte_remove_raw(H_ANDCOND, i, VRMA_HPTE_B_1TB,
+ &dummy1, &dummy2);
More information about the kexec