|
@@ -413,6 +413,38 @@ static void native_hpte_updateboltedpp(unsigned long newpp, unsigned long ea,
|
|
|
tlbie(vpn, psize, psize, ssize, 0);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Remove a bolted kernel entry. Memory hotplug uses this.
|
|
|
+ *
|
|
|
+ * No need to lock here because we should be the only user.
|
|
|
+ */
|
|
|
+static int native_hpte_removebolted(unsigned long ea, int psize, int ssize)
|
|
|
+{
|
|
|
+ unsigned long vpn;
|
|
|
+ unsigned long vsid;
|
|
|
+ long slot;
|
|
|
+ struct hash_pte *hptep;
|
|
|
+
|
|
|
+ vsid = get_kernel_vsid(ea, ssize);
|
|
|
+ vpn = hpt_vpn(ea, vsid, ssize);
|
|
|
+
|
|
|
+ slot = native_hpte_find(vpn, psize, ssize);
|
|
|
+ if (slot == -1)
|
|
|
+ return -ENOENT;
|
|
|
+
|
|
|
+ hptep = htab_address + slot;
|
|
|
+
|
|
|
+ VM_WARN_ON(!(be64_to_cpu(hptep->v) & HPTE_V_BOLTED));
|
|
|
+
|
|
|
+ /* Invalidate the hpte */
|
|
|
+ hptep->v = 0;
|
|
|
+
|
|
|
+ /* Invalidate the TLB */
|
|
|
+ tlbie(vpn, psize, psize, ssize, 0);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
static void native_hpte_invalidate(unsigned long slot, unsigned long vpn,
|
|
|
int bpsize, int apsize, int ssize, int local)
|
|
|
{
|
|
@@ -731,6 +763,7 @@ void __init hpte_init_native(void)
|
|
|
mmu_hash_ops.hpte_invalidate = native_hpte_invalidate;
|
|
|
mmu_hash_ops.hpte_updatepp = native_hpte_updatepp;
|
|
|
mmu_hash_ops.hpte_updateboltedpp = native_hpte_updateboltedpp;
|
|
|
+ mmu_hash_ops.hpte_removebolted = native_hpte_removebolted;
|
|
|
mmu_hash_ops.hpte_insert = native_hpte_insert;
|
|
|
mmu_hash_ops.hpte_remove = native_hpte_remove;
|
|
|
mmu_hash_ops.hpte_clear_all = native_hpte_clear;
|