From: anton@samba.org

Fix up iseries updatepp, from Ben Herrenschmidt



---

 arch/ppc64/kernel/iSeries_htab.c |    8 +++++++-
 1 files changed, 7 insertions(+), 1 deletion(-)

diff -puN arch/ppc64/kernel/iSeries_htab.c~ppc64-iseries-updatepp arch/ppc64/kernel/iSeries_htab.c
--- 25/arch/ppc64/kernel/iSeries_htab.c~ppc64-iseries-updatepp	2004-02-04 00:11:51.000000000 -0800
+++ 25-akpm/arch/ppc64/kernel/iSeries_htab.c	2004-02-04 00:11:51.000000000 -0800
@@ -109,6 +109,12 @@ static long iSeries_hpte_remove(unsigned
 	return -1;
 }
 
+/*
+ * The HyperVisor expects the "flags" argument in this form:
+ * 	bits  0..59 : reserved
+ * 	bit      60 : N
+ * 	bits 61..63 : PP2,PP1,PP0
+ */
 static long iSeries_hpte_updatepp(unsigned long slot, unsigned long newpp,
 				  unsigned long va, int large, int local)
 {
@@ -117,7 +123,7 @@ static long iSeries_hpte_updatepp(unsign
 
 	HvCallHpt_get(&hpte, slot);
 	if ((hpte.dw0.dw0.avpn == avpn) && (hpte.dw0.dw0.v)) {
-		HvCallHpt_setPp(slot, newpp);
+		HvCallHpt_setPp(slot, (newpp & 0x3) | ((newpp & 0x4) << 1));
 		return 0;
 	}
 	return -1;

_