summaryrefslogtreecommitdiffstats
path: root/sys/i386/include/pmap.h
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2008-08-15 20:51:31 +0000
committerkmacy <kmacy@FreeBSD.org>2008-08-15 20:51:31 +0000
commit8c05b8ec899e2b20d5eb286770d302b94f0e4536 (patch)
tree01c30bdd7553d9c3ff945b2422e697cffe0f9b20 /sys/i386/include/pmap.h
parent6bfca819a4bf3b98d63e7f4aaed6fa5b0520008a (diff)
downloadFreeBSD-src-8c05b8ec899e2b20d5eb286770d302b94f0e4536.zip
FreeBSD-src-8c05b8ec899e2b20d5eb286770d302b94f0e4536.tar.gz
Integrate support for xen in to i386 common code.
MFC after: 1 month
Diffstat (limited to 'sys/i386/include/pmap.h')
-rw-r--r--sys/i386/include/pmap.h71
1 files changed, 69 insertions, 2 deletions
diff --git a/sys/i386/include/pmap.h b/sys/i386/include/pmap.h
index 1cd2bde..66e17a9 100644
--- a/sys/i386/include/pmap.h
+++ b/sys/i386/include/pmap.h
@@ -198,6 +198,72 @@ extern pd_entry_t *IdlePTD; /* physical address of "Idle" state directory */
#define vtopte(va) (PTmap + i386_btop(va))
#define vtophys(va) pmap_kextract((vm_offset_t)(va))
+#ifdef XEN
+#include <sys/param.h>
+#include <machine/xen/xen-os.h>
+#include <machine/xen/xenvar.h>
+#include <machine/xen/xenpmap.h>
+
+extern pt_entry_t pg_nx;
+
+#define PG_KERNEL (PG_V | PG_A | PG_RW | PG_M)
+
+#define MACH_TO_VM_PAGE(ma) PHYS_TO_VM_PAGE(xpmap_mtop((ma)))
+#define VM_PAGE_TO_MACH(m) xpmap_ptom(VM_PAGE_TO_PHYS((m)))
+
+static __inline vm_paddr_t
+pmap_kextract_ma(vm_offset_t va)
+{
+ vm_paddr_t ma;
+ if ((ma = PTD[va >> PDRSHIFT]) & PG_PS) {
+ ma = (ma & ~(NBPDR - 1)) | (va & (NBPDR - 1));
+ } else {
+ ma = (*vtopte(va) & PG_FRAME) | (va & PAGE_MASK);
+ }
+ return ma;
+}
+
+static __inline vm_paddr_t
+pmap_kextract(vm_offset_t va)
+{
+ return xpmap_mtop(pmap_kextract_ma(va));
+}
+#define vtomach(va) pmap_kextract_ma(((vm_offset_t) (va)))
+
+vm_paddr_t pmap_extract_ma(struct pmap *pmap, vm_offset_t va);
+
+void pmap_kenter_ma(vm_offset_t va, vm_paddr_t pa);
+void pmap_map_readonly(struct pmap *pmap, vm_offset_t va, int len);
+void pmap_map_readwrite(struct pmap *pmap, vm_offset_t va, int len);
+
+static __inline pt_entry_t
+pte_load_store(pt_entry_t *ptep, pt_entry_t v)
+{
+ pt_entry_t r;
+
+ v = xpmap_ptom(v);
+ r = *ptep;
+ PT_SET_VA(ptep, v, TRUE);
+ return (r);
+}
+
+static __inline pt_entry_t
+pte_load_store_ma(pt_entry_t *ptep, pt_entry_t v)
+{
+ pt_entry_t r;
+
+ r = *ptep;
+ PT_SET_VA_MA(ptep, v, TRUE);
+ return (r);
+}
+
+#define pte_load_clear(ptep) pte_load_store((ptep), (pt_entry_t)0ULL)
+
+#define pte_store(ptep, pte) pte_load_store((ptep), (pt_entry_t)pte)
+#define pte_store_ma(ptep, pte) pte_load_store_ma((ptep), (pt_entry_t)pte)
+#define pde_store_ma(ptep, pte) pte_load_store_ma((ptep), (pt_entry_t)pte)
+
+#elif !defined(XEN)
/*
* Routine: pmap_kextract
* Function:
@@ -217,8 +283,9 @@ pmap_kextract(vm_offset_t va)
}
return pa;
}
+#endif
-#ifdef PAE
+#if defined(PAE) && !defined(XEN)
#define pde_cmpset(pdep, old, new) \
atomic_cmpset_64((pdep), (old), (new))
@@ -277,7 +344,7 @@ atomic_cmpset_64(volatile uint64_t *dst, uint64_t exp, uint64_t src)
extern pt_entry_t pg_nx;
-#else /* PAE */
+#elif !defined(PAE) && !defined (XEN)
#define pde_cmpset(pdep, old, new) \
atomic_cmpset_int((pdep), (old), (new))
OpenPOWER on IntegriCloud