diff options
Diffstat (limited to 'arch/ppc64/kernel/iSeries_htab.c')
-rw-r--r-- | arch/ppc64/kernel/iSeries_htab.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/ppc64/kernel/iSeries_htab.c b/arch/ppc64/kernel/iSeries_htab.c index 2192055a90a0..9a2be3abf349 100644 --- a/arch/ppc64/kernel/iSeries_htab.c +++ b/arch/ppc64/kernel/iSeries_htab.c | |||
@@ -84,6 +84,25 @@ static long iSeries_hpte_insert(unsigned long hpte_group, unsigned long va, | |||
84 | return (secondary << 3) | (slot & 7); | 84 | return (secondary << 3) | (slot & 7); |
85 | } | 85 | } |
86 | 86 | ||
87 | long iSeries_hpte_bolt_or_insert(unsigned long hpte_group, | ||
88 | unsigned long va, unsigned long prpn, unsigned long vflags, | ||
89 | unsigned long rflags) | ||
90 | { | ||
91 | long slot; | ||
92 | hpte_t lhpte; | ||
93 | |||
94 | slot = HvCallHpt_findValid(&lhpte, va >> PAGE_SHIFT); | ||
95 | |||
96 | if (lhpte.v & HPTE_V_VALID) { | ||
97 | /* Bolt the existing HPTE */ | ||
98 | HvCallHpt_setSwBits(slot, 0x10, 0); | ||
99 | HvCallHpt_setPp(slot, PP_RWXX); | ||
100 | return 0; | ||
101 | } | ||
102 | |||
103 | return iSeries_hpte_insert(hpte_group, va, prpn, vflags, rflags); | ||
104 | } | ||
105 | |||
87 | static unsigned long iSeries_hpte_getword0(unsigned long slot) | 106 | static unsigned long iSeries_hpte_getword0(unsigned long slot) |
88 | { | 107 | { |
89 | hpte_t hpte; | 108 | hpte_t hpte; |