Print this page
8956 Implement KPTI
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
@@ -20,10 +20,12 @@
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright 2018 Joyent, Inc.
*/
/*
* HAT interfaces used by the kernel debugger to interact with the VM system.
* These interfaces are invoked when the world is stopped. As such, no blocking
@@ -175,11 +177,11 @@
* kdi_pread() to walk the page tables
*/
#if defined(__xpv)
*pap = pfn_to_pa(CPU->cpu_current_hat->hat_htable->ht_pfn);
#else
- *pap = getcr3() & MMU_PAGEMASK;
+ *pap = getcr3_pa();
#endif
for (level = mmu.max_level; ; --level) {
index = (va >> LEVEL_SHIFT(level)) & (mmu.ptes_per_table - 1);
*pap += index << mmu.pte_size_shift;
pte = 0;
@@ -247,11 +249,11 @@
#else
else if (hat_kdi_use_pae)
*hat_kdi_pte = pte;
else
*(x86pte32_t *)hat_kdi_pte = pte;
- mmu_tlbflush_entry((caddr_t)hat_kdi_page);
+ mmu_flush_tlb_kpage(hat_kdi_page);
#endif
bcopy(from, to, sz);
/*
@@ -266,11 +268,11 @@
#else
else if (hat_kdi_use_pae)
*hat_kdi_pte = 0;
else
*(x86pte32_t *)hat_kdi_pte = 0;
- mmu_tlbflush_entry((caddr_t)hat_kdi_page);
+ mmu_flush_tlb_kpage(hat_kdi_page);
#endif
buf += sz;
pa += sz;
nbytes -= sz;
@@ -294,10 +296,23 @@
kdi_pwrite(caddr_t buf, size_t nbytes, uint64_t addr, size_t *ncopiedp)
{
return (kdi_prw(buf, nbytes, addr, ncopiedp, 0));
}
+#if !defined(__xpv)
+/*
+ * This gets used for flushing the TLB on all the slaves just prior to doing a
+ * kdi_prw(). It's unclear why this was originally done, since kdi_prw() itself
+ * will flush any lingering hat_kdi_page mappings, but let's presume it was a
+ * good idea.
+ */
+void
+kdi_flush_caches(void)
+{
+ mmu_flush_tlb(FLUSH_TLB_ALL, NULL);
+}
+#endif
/*
* Return the number of bytes, relative to the beginning of a given range, that
* are non-toxic (can be read from and written to with relative impunity).
*/