aboutsummaryrefslogtreecommitdiff
path: root/i386/intel/pmap.h
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2012-03-18 20:31:22 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-03-28 17:01:53 +0100
commit0b3504b6db86c531e8b53b8e9aa9030db6e72357 (patch)
treebbdcc8907f2e1700721de715220e28773518c657 /i386/intel/pmap.h
parente3460f05cbe141073e62c24afe5e3a8f99c05ed4 (diff)
downloadgnumach-0b3504b6db86c531e8b53b8e9aa9030db6e72357.tar.gz
gnumach-0b3504b6db86c531e8b53b8e9aa9030db6e72357.tar.bz2
gnumach-0b3504b6db86c531e8b53b8e9aa9030db6e72357.zip
pmap.h: Add 64bit variant
* i386/intel/pmap.h (L4SHIFT, L4MASK, lin2l4num): New macros (PDPNUM, PDPMASK, set_pmap): Add 64bit variant. Make PAE use the 64bit mask too. (pmap): Add l4base, user_l4base, user_pdpbase fields. * i386/intel/pmap.c (pmap_bootstrap): Clear the whole PDP. Enable write bit in PDP. Set user pagetable to NULL. Initialize l4base. (pmap_clear_bootstrap_pagetable): Add 4th-level support. (pmap_ceate): Clear the whole PDP. Enable write bit in PDP. Initialize l4base, user_pdpbase, user_l4base. (pmap_destroy): Clear l4base, user_pdpbase, user_l4base. * i386/i386at/model_dep.c (i386at_init): Load l4base on 64bits.
Diffstat (limited to 'i386/intel/pmap.h')
-rw-r--r--i386/intel/pmap.h41
1 files changed, 39 insertions, 2 deletions
diff --git a/i386/intel/pmap.h b/i386/intel/pmap.h
index 5fa2a0c4..4c852543 100644
--- a/i386/intel/pmap.h
+++ b/i386/intel/pmap.h
@@ -48,7 +48,7 @@
* Define the generic in terms of the specific
*/
-#if defined(__i386__)
+#if defined(__i386__) || defined(__x86_64__)
#define INTEL_PGBYTES I386_PGBYTES
#define INTEL_PGSHIFT I386_PGSHIFT
#define intel_btop(x) i386_btop(x)
@@ -71,9 +71,18 @@ typedef phys_addr_t pt_entry_t;
#define INTEL_OFFMASK 0xfff /* offset within page */
#if PAE
+#ifdef __x86_64__
+#define L4SHIFT 39 /* L4 shift */
+#define L4MASK 0x1ff /* mask for L4 index */
+#endif
#define PDPSHIFT 30 /* page directory pointer */
+#ifdef __x86_64__
+/* Enough for 8GiB addressing space. */
+#define PDPNUM 8 /* number of page directory pointers */
+#else
#define PDPNUM 4 /* number of page directory pointers */
-#define PDPMASK 3 /* mask for page directory pointer index */
+#endif
+#define PDPMASK 0x1ff /* mask for page directory pointer index */
#define PDESHIFT 21 /* page descriptor shift */
#define PDEMASK 0x1ff /* mask for page descriptor index */
#define PTESHIFT 12 /* page table shift */
@@ -87,6 +96,13 @@ typedef phys_addr_t pt_entry_t;
#endif /* PAE */
/*
+ * Convert linear offset to L4 pointer index
+ */
+#ifdef __x86_64__
+#define lin2l4num(a) (((a) >> L4SHIFT) & L4MASK)
+#endif
+
+/*
* Convert linear offset to page descriptor index
*/
#define lin2pdenum(a) (((a) >> PDESHIFT) & PDEMASK)
@@ -167,6 +183,13 @@ struct pmap {
#else
pt_entry_t *pdpbase; /* page directory pointer table */
#endif /* ! PAE */
+#ifdef __x86_64__
+ pt_entry_t *l4base; /* l4 table */
+#ifdef MACH_HYP
+ pt_entry_t *user_l4base; /* Userland l4 table */
+ pt_entry_t *user_pdpbase; /* Userland l4 table */
+#endif /* MACH_HYP */
+#endif /* x86_64 */
int ref_count; /* reference count */
decl_simple_lock_data(,lock)
/* lock on map */
@@ -187,7 +210,21 @@ extern void pmap_clear_bootstrap_pagetable(pt_entry_t *addr);
#endif /* MACH_PV_PAGETABLES */
#if PAE
+#ifdef __x86_64__
+#ifdef MACH_HYP
+#define set_pmap(pmap) \
+ MACRO_BEGIN \
+ set_cr3(kvtophys((vm_offset_t)(pmap)->l4base)); \
+ if (pmap->user_l4base) \
+ if (!hyp_set_user_cr3(kvtophys((vm_offset_t)(pmap)->user_l4base))) \
+ panic("set_user_cr3"); \
+ MACRO_END
+#else /* MACH_HYP */
+#define set_pmap(pmap) set_cr3(kvtophys((vm_offset_t)(pmap)->l4base))
+#endif /* MACH_HYP */
+#else /* x86_64 */
#define set_pmap(pmap) set_cr3(kvtophys((vm_offset_t)(pmap)->pdpbase))
+#endif /* x86_64 */
#else /* PAE */
#define set_pmap(pmap) set_cr3(kvtophys((vm_offset_t)(pmap)->dirbase))
#endif /* PAE */