summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/ia64/ia64/pmap.c263
-rw-r--r--sys/ia64/include/pte.h99
2 files changed, 140 insertions, 222 deletions
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c
index 8dff93d..8525dcb 100644
--- a/sys/ia64/ia64/pmap.c
+++ b/sys/ia64/ia64/pmap.c
@@ -124,52 +124,15 @@ MALLOC_DEFINE(M_PMAP, "PMAP", "PMAP Structures");
#define PMAP_SHPGPERPROC 200
#endif
-#if defined(DIAGNOSTIC)
-#define PMAP_DIAGNOSTIC
-#endif
-
#define MINPV 2048 /* Preallocate at least this many */
-#if 0
-#define PMAP_DIAGNOSTIC
-#define PMAP_DEBUG
-#endif
-
-#if !defined(PMAP_DIAGNOSTIC)
+#if !defined(DIAGNOSTIC)
#define PMAP_INLINE __inline
#else
#define PMAP_INLINE
#endif
-/*
- * Get PDEs and PTEs for user/kernel address space
- */
-#define pmap_pte_w(pte) ((pte)->pte_ig & PTE_IG_WIRED)
-#define pmap_pte_managed(pte) ((pte)->pte_ig & PTE_IG_MANAGED)
-#define pmap_pte_v(pte) ((pte)->pte_p)
#define pmap_pte_pa(pte) (((pte)->pte_ppn) << 12)
-#define pmap_pte_prot(pte) (((pte)->pte_ar << 2) | (pte)->pte_pl)
-
-#define pmap_pte_set_w(pte, v) ((v)?((pte)->pte_ig |= PTE_IG_WIRED) \
- :((pte)->pte_ig &= ~PTE_IG_WIRED))
-#define pmap_pte_set_prot(pte, v) do { \
- (pte)->pte_ar = v >> 2; \
- (pte)->pte_pl = v & 3; \
-} while (0)
-
-/*
- * Given a map and a machine independent protection code,
- * convert to an ia64 protection code.
- */
-#define pte_prot(m, p) (protection_codes[m == kernel_pmap ? 0 : 1][p])
-#define pte_prot_pl(m, p) (pte_prot(m, p) & 3)
-#define pte_prot_ar(m, p) (pte_prot(m, p) >> 2)
-int protection_codes[2][8];
-
-/*
- * Return non-zero if this pmap is currently active
- */
-#define pmap_isactive(pmap) (pmap->pm_active)
/*
* Statically allocated kernel pmap
@@ -244,7 +207,6 @@ SYSCTL_INT(_vm_stats_vhpt, OID_AUTO, resident, CTLFLAG_RD,
static PMAP_INLINE void free_pv_entry(pv_entry_t pv);
static pv_entry_t get_pv_entry(void);
-static void ia64_protection_init(void);
static pmap_t pmap_install(pmap_t);
static void pmap_invalidate_all(pmap_t pmap);
@@ -438,11 +400,6 @@ pmap_bootstrap()
virtual_end = VM_MAX_KERNEL_ADDRESS;
/*
- * Initialize protection array.
- */
- ia64_protection_init();
-
- /*
* Initialize the kernel pmap (which is statically allocated).
*/
PMAP_LOCK_INIT(kernel_pmap);
@@ -998,7 +955,7 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
PMAP_LOCK(pmap);
oldpmap = pmap_install(pmap);
pte = pmap_find_vhpt(va);
- if (pte != NULL && pmap_pte_v(pte))
+ if (pte != NULL && pte->pte_p)
pa = pmap_pte_pa(pte);
pmap_install(oldpmap);
PMAP_UNLOCK(pmap);
@@ -1015,18 +972,24 @@ pmap_extract(pmap_t pmap, vm_offset_t va)
vm_page_t
pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot)
{
- vm_paddr_t pa;
+ struct ia64_lpte *pte;
+ pmap_t oldpmap;
vm_page_t m;
m = NULL;
- mtx_lock(&Giant);
- if ((pa = pmap_extract(pmap, va)) != 0) {
- m = PHYS_TO_VM_PAGE(pa);
- vm_page_lock_queues();
+ if (pmap == NULL)
+ return (m);
+ vm_page_lock_queues();
+ PMAP_LOCK(pmap);
+ oldpmap = pmap_install(pmap);
+ pte = pmap_find_vhpt(va);
+ if (pte != NULL && pte->pte_p && (pte->pte_prot & prot) == prot) {
+ m = PHYS_TO_VM_PAGE(pmap_pte_pa(pte));
vm_page_hold(m);
- vm_page_unlock_queues();
}
- mtx_unlock(&Giant);
+ vm_page_unlock_queues();
+ pmap_install(oldpmap);
+ PMAP_UNLOCK(pmap);
return (m);
}
@@ -1085,31 +1048,48 @@ pmap_free_pte(struct ia64_lpte *pte, vm_offset_t va)
pte->pte_p = 0;
}
+static PMAP_INLINE void
+pmap_pte_prot(pmap_t pm, struct ia64_lpte *pte, vm_prot_t prot)
+{
+ static int prot2ar[4] = {
+ PTE_AR_R, /* VM_PROT_NONE */
+ PTE_AR_RW, /* VM_PROT_WRITE */
+ PTE_AR_RX, /* VM_PROT_EXECUTE */
+ PTE_AR_RWX /* VM_PROT_WRITE|VM_PROT_EXECUTE */
+ };
+
+ pte->pte_prot = prot;
+ pte->pte_pl = (prot == VM_PROT_NONE || pm == kernel_pmap)
+ ? PTE_PL_KERN : PTE_PL_USER;
+ pte->pte_ar = prot2ar[(prot & VM_PROT_ALL) >> 1];
+}
+
/*
* Set a pte to contain a valid mapping and enter it in the VHPT. If
* the pte was orginally valid, then its assumed to already be in the
* VHPT.
+ * This functions does not set the protection bits. It's expected
+ * that those have been set correctly prior to calling this function.
*/
static void
pmap_set_pte(struct ia64_lpte *pte, vm_offset_t va, vm_offset_t pa,
- int ig, int pl, int ar)
+ boolean_t wired, boolean_t managed)
{
int wasvalid = pte->pte_p;
pte->pte_p = 1;
pte->pte_ma = PTE_MA_WB;
- if (ig & PTE_IG_MANAGED) {
+ if (managed) {
pte->pte_a = 0;
pte->pte_d = 0;
} else {
pte->pte_a = 1;
pte->pte_d = 1;
}
- pte->pte_pl = pl;
- pte->pte_ar = ar;
pte->pte_ppn = pa >> 12;
pte->pte_ed = 0;
- pte->pte_ig = ig;
+ pte->pte_w = (wired) ? 1 : 0;
+ pte->pte_m = (managed) ? 1 : 0;
pte->pte_ps = PAGE_SHIFT;
pte->pte_key = 0;
@@ -1162,11 +1142,11 @@ pmap_remove_pte(pmap_t pmap, struct ia64_lpte *pte, vm_offset_t va,
*/
pte->pte_p = 0;
- if (pte->pte_ig & PTE_IG_WIRED)
+ if (pte->pte_w)
pmap->pm_stats.wired_count -= 1;
pmap->pm_stats.resident_count -= 1;
- if (pte->pte_ig & PTE_IG_MANAGED) {
+ if (pte->pte_m) {
m = PHYS_TO_VM_PAGE(pmap_pte_pa(pte));
if (pte->pte_d)
if (pmap_track_modified(va))
@@ -1212,16 +1192,15 @@ pmap_kextract(vm_offset_t va)
pte = pmap_find_kpte(va);
if (!pte->pte_p)
return (0);
- return ((pte->pte_ppn << 12) | (va & PAGE_MASK));
+ return (pmap_pte_pa(pte) | (va & PAGE_MASK));
}
/*
- * Add a list of wired pages to the kva
- * this routine is only used for temporary
- * kernel mappings that do not need to have
- * page modification or references recorded.
- * Note that old mappings are simply written
- * over. The page *must* be wired.
+ * Add a list of wired pages to the kva this routine is only used for
+ * temporary kernel mappings that do not need to have page modification
+ * or references recorded. Note that old mappings are simply written
+ * over. The page is effectively wired, but it's customary to not have
+ * the PTE reflect that, nor update statistics.
*/
void
pmap_qenter(vm_offset_t va, vm_page_t *m, int count)
@@ -1234,8 +1213,8 @@ pmap_qenter(vm_offset_t va, vm_page_t *m, int count)
int wasvalid;
pte = pmap_find_kpte(tva);
wasvalid = pte->pte_p;
- pmap_set_pte(pte, tva, VM_PAGE_TO_PHYS(m[i]),
- 0, PTE_PL_KERN, PTE_AR_RWX);
+ pmap_pte_prot(kernel_pmap, pte, VM_PROT_ALL);
+ pmap_set_pte(pte, tva, VM_PAGE_TO_PHYS(m[i]), FALSE, FALSE);
if (wasvalid)
ia64_ptc_g(tva, PAGE_SHIFT << 2);
}
@@ -1259,7 +1238,8 @@ pmap_qremove(vm_offset_t va, int count)
}
/*
- * Add a wired page to the kva.
+ * Add a wired page to the kva. As for pmap_qenter(), it's customary
+ * to not have the PTE reflect that, nor update statistics.
*/
void
pmap_kenter(vm_offset_t va, vm_offset_t pa)
@@ -1269,7 +1249,8 @@ pmap_kenter(vm_offset_t va, vm_offset_t pa)
pte = pmap_find_kpte(va);
wasvalid = pte->pte_p;
- pmap_set_pte(pte, va, pa, 0, PTE_PL_KERN, PTE_AR_RWX);
+ pmap_pte_prot(kernel_pmap, pte, VM_PROT_ALL);
+ pmap_set_pte(pte, va, pa, FALSE, FALSE);
if (wasvalid)
ia64_ptc_g(va, PAGE_SHIFT << 2);
}
@@ -1404,7 +1385,7 @@ pmap_remove_all(vm_page_t m)
pv_entry_t pv;
int s;
-#if defined(PMAP_DIAGNOSTIC)
+#if defined(DIAGNOSTIC)
/*
* XXX this makes pmap_page_protect(NONE) illegal for non-managed
* pages!
@@ -1448,7 +1429,6 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
{
pmap_t oldpmap;
struct ia64_lpte *pte;
- int newprot;
if (pmap == NULL)
return;
@@ -1461,8 +1441,6 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
if (prot & VM_PROT_WRITE)
return;
- newprot = pte_prot(pmap, prot);
-
if ((sva & PAGE_MASK) || (eva & PAGE_MASK))
panic("pmap_protect: unaligned addresses");
@@ -1479,8 +1457,8 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
continue;
}
- if (pmap_pte_prot(pte) != newprot) {
- if (pte->pte_ig & PTE_IG_MANAGED) {
+ if (pte->pte_prot != prot) {
+ if (pte->pte_m) {
vm_offset_t pa = pmap_pte_pa(pte);
vm_page_t m = PHYS_TO_VM_PAGE(pa);
if (pte->pte_d) {
@@ -1493,7 +1471,7 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
pte->pte_a = 0;
}
}
- pmap_pte_set_prot(pte, newprot);
+ pmap_pte_prot(pmap, pte, prot);
pmap_update_vhpt(pte, sva);
pmap_invalidate_page(pmap, sva);
}
@@ -1519,14 +1497,14 @@ pmap_protect(pmap_t pmap, vm_offset_t sva, vm_offset_t eva, vm_prot_t prot)
*/
void
pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
- boolean_t wired)
+ boolean_t wired)
{
pmap_t oldpmap;
vm_offset_t pa;
vm_offset_t opa;
struct ia64_lpte origpte;
struct ia64_lpte *pte;
- int managed;
+ boolean_t managed;
if (pmap == NULL)
return;
@@ -1536,7 +1514,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
oldpmap = pmap_install(pmap);
va &= ~PAGE_MASK;
-#ifdef PMAP_DIAGNOSTIC
+#ifdef DIAGNOSTIC
if (va > VM_MAX_KERNEL_ADDRESS)
panic("pmap_enter: toobig");
#endif
@@ -1559,7 +1537,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
opa = pmap_pte_pa(&origpte);
else
opa = 0;
- managed = 0;
+ managed = FALSE;
pa = VM_PAGE_TO_PHYS(m) & ~PAGE_MASK;
@@ -1573,16 +1551,16 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
* are valid mappings in them. Hence, if a user page is wired,
* the PT page will be also.
*/
- if (wired && ((origpte.pte_ig & PTE_IG_WIRED) == 0))
+ if (wired && !origpte.pte_w)
pmap->pm_stats.wired_count++;
- else if (!wired && (origpte.pte_ig & PTE_IG_WIRED))
+ else if (!wired && origpte.pte_w)
pmap->pm_stats.wired_count--;
/*
* We might be turning off write access to the page,
* so we go ahead and sense modify status.
*/
- if (origpte.pte_ig & PTE_IG_MANAGED) {
+ if (origpte.pte_m) {
if (origpte.pte_d && pmap_track_modified(va)) {
vm_page_t om;
om = PHYS_TO_VM_PAGE(opa);
@@ -1590,7 +1568,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
}
}
- managed = origpte.pte_ig & PTE_IG_MANAGED;
+ managed = (origpte.pte_m) ? TRUE : FALSE;
goto validate;
}
/*
@@ -1610,7 +1588,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
if (pmap_initialized &&
(m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
pmap_insert_entry(pmap, va, m);
- managed |= PTE_IG_MANAGED;
+ managed = TRUE;
}
/*
@@ -1626,8 +1604,8 @@ validate:
* Now validate mapping with desired protection/wiring. This
* adds the pte to the VHPT if necessary.
*/
- pmap_set_pte(pte, va, pa, managed | (wired ? PTE_IG_WIRED : 0),
- pte_prot_pl(pmap, prot), pte_prot_ar(pmap, prot));
+ pmap_pte_prot(pmap, pte, prot);
+ pmap_set_pte(pte, va, pa, wired, managed);
/*
* if the mapping or permission bits are different, we need
@@ -1657,7 +1635,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
{
struct ia64_lpte *pte;
pmap_t oldpmap;
- int managed;
+ boolean_t managed;
vm_page_lock_queues();
PMAP_LOCK(pmap);
@@ -1674,7 +1652,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
}
if (pte->pte_p)
goto reinstall;
- managed = 0;
+ managed = FALSE;
/*
* Enter on the PV list since its part of our managed memory.
@@ -1682,7 +1660,7 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
if (pmap_initialized &&
(m->flags & (PG_FICTITIOUS | PG_UNMANAGED)) == 0) {
pmap_insert_entry(pmap, va, m);
- managed |= PTE_IG_MANAGED;
+ managed = TRUE;
}
/*
@@ -1693,8 +1671,9 @@ pmap_enter_quick(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_page_t mpte)
/*
* Initialise PTE with read-only protection and enter into VHPT.
*/
- pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m), managed,
- PTE_PL_USER, PTE_AR_R);
+ pmap_pte_prot(pmap, pte, VM_PROT_READ);
+ pmap_set_pte(pte, va, VM_PAGE_TO_PHYS(m), FALSE, managed);
+
reinstall:
vm_page_unlock_queues();
pmap_install(oldpmap);
@@ -1742,16 +1721,16 @@ pmap_change_wiring(pmap, va, wired)
pte = pmap_find_vhpt(va);
KASSERT(pte != NULL, ("pte"));
- if (wired && !pmap_pte_w(pte))
+ if (wired && !pte->pte_w)
pmap->pm_stats.wired_count++;
- else if (!wired && pmap_pte_w(pte))
+ else if (!wired && pte->pte_w)
pmap->pm_stats.wired_count--;
/*
* Wiring is not a hardware characteristic so there is no need to
* invalidate TLB.
*/
- pmap_pte_set_w(pte, wired);
+ pte->pte_w = (wired) ? 1 : 0;
pmap_install(oldpmap);
PMAP_UNLOCK(pmap);
@@ -1903,7 +1882,7 @@ pmap_remove_pages(pmap_t pmap, vm_offset_t sva, vm_offset_t eva)
pte = pmap_find_vhpt(pv->pv_va);
KASSERT(pte != NULL, ("pte"));
- if (pte->pte_ig & PTE_IG_WIRED)
+ if (pte->pte_w)
continue;
pmap_remove_pte(pmap, pte, pv->pv_va, pv, 1);
@@ -1923,7 +1902,7 @@ void
pmap_page_protect(vm_page_t m, vm_prot_t prot)
{
struct ia64_lpte *pte;
- pmap_t oldpmap;
+ pmap_t oldpmap, pmap;
pv_entry_t pv;
if ((prot & VM_PROT_WRITE) != 0)
@@ -1932,16 +1911,16 @@ pmap_page_protect(vm_page_t m, vm_prot_t prot)
if ((m->flags & PG_WRITEABLE) == 0)
return;
TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
- int newprot = pte_prot(pv->pv_pmap, prot);
- PMAP_LOCK(pv->pv_pmap);
- oldpmap = pmap_install(pv->pv_pmap);
+ pmap = pv->pv_pmap;
+ PMAP_LOCK(pmap);
+ oldpmap = pmap_install(pmap);
pte = pmap_find_vhpt(pv->pv_va);
KASSERT(pte != NULL, ("pte"));
- pmap_pte_set_prot(pte, newprot);
+ pmap_pte_prot(pmap, pte, prot);
pmap_update_vhpt(pte, pv->pv_va);
- pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
+ pmap_invalidate_page(pmap, pv->pv_va);
pmap_install(oldpmap);
- PMAP_UNLOCK(pv->pv_pmap);
+ PMAP_UNLOCK(pmap);
}
vm_page_flag_clear(m, PG_WRITEABLE);
} else {
@@ -2127,63 +2106,6 @@ pmap_clear_reference(vm_page_t m)
}
/*
- * Miscellaneous support routines follow
- */
-
-static void
-ia64_protection_init()
-{
- int prot, *kp, *up;
-
- kp = protection_codes[0];
- up = protection_codes[1];
-
- for (prot = 0; prot < 8; prot++) {
- switch (prot) {
- case VM_PROT_NONE | VM_PROT_NONE | VM_PROT_NONE:
- *kp++ = (PTE_AR_R << 2) | PTE_PL_KERN;
- *up++ = (PTE_AR_R << 2) | PTE_PL_KERN;
- break;
-
- case VM_PROT_NONE | VM_PROT_NONE | VM_PROT_EXECUTE:
- *kp++ = (PTE_AR_X_RX << 2) | PTE_PL_KERN;
- *up++ = (PTE_AR_X_RX << 2) | PTE_PL_USER;
- break;
-
- case VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_NONE:
- *kp++ = (PTE_AR_RW << 2) | PTE_PL_KERN;
- *up++ = (PTE_AR_RW << 2) | PTE_PL_USER;
- break;
-
- case VM_PROT_NONE | VM_PROT_WRITE | VM_PROT_EXECUTE:
- *kp++ = (PTE_AR_RWX << 2) | PTE_PL_KERN;
- *up++ = (PTE_AR_RWX << 2) | PTE_PL_USER;
- break;
-
- case VM_PROT_READ | VM_PROT_NONE | VM_PROT_NONE:
- *kp++ = (PTE_AR_R << 2) | PTE_PL_KERN;
- *up++ = (PTE_AR_R << 2) | PTE_PL_USER;
- break;
-
- case VM_PROT_READ | VM_PROT_NONE | VM_PROT_EXECUTE:
- *kp++ = (PTE_AR_RX << 2) | PTE_PL_KERN;
- *up++ = (PTE_AR_RX << 2) | PTE_PL_USER;
- break;
-
- case VM_PROT_READ | VM_PROT_WRITE | VM_PROT_NONE:
- *kp++ = (PTE_AR_RW << 2) | PTE_PL_KERN;
- *up++ = (PTE_AR_RW << 2) | PTE_PL_USER;
- break;
-
- case VM_PROT_READ | VM_PROT_WRITE | VM_PROT_EXECUTE:
- *kp++ = (PTE_AR_RWX << 2) | PTE_PL_KERN;
- *up++ = (PTE_AR_RWX << 2) | PTE_PL_USER;
- break;
- }
- }
-}
-
-/*
* Map a set of physical memory pages into the kernel virtual
* address space. Return a pointer to where it is mapped. This
* routine is intended to be used for mapping device memory,
@@ -2227,12 +2149,12 @@ pmap_mincore(pmap_t pmap, vm_offset_t addr)
if (!pte)
return 0;
- if (pmap_pte_v(pte)) {
+ if (pte->pte_p) {
vm_page_t m;
vm_offset_t pa;
val = MINCORE_INCORE;
- if ((pte->pte_ig & PTE_IG_MANAGED) == 0)
+ if (!pte->pte_m)
return val;
pa = pmap_pte_pa(pte);
@@ -2347,18 +2269,17 @@ static const char* psnames[] = {
static void
print_trs(int type)
{
- struct ia64_pal_result res;
- int i, maxtr;
+ struct ia64_pal_result res;
+ int i, maxtr;
struct {
struct ia64_pte pte;
struct ia64_itir itir;
- struct ia64_ifa ifa;
+ uint64_t ifa;
struct ia64_rr rr;
- } buf;
- static const char* manames[] = {
+ } buf;
+ static const char *manames[] = {
"WB", "bad", "bad", "bad",
"UC", "UCE", "WC", "NaT",
-
};
res = ia64_call_pal_static(PAL_VM_SUMMARY, 0, 0, 0);
@@ -2387,9 +2308,9 @@ print_trs(int type)
buf.pte.pte_ma = 0;
db_printf(
"%d %06x %013lx %013lx %4s %d %d %d %d %d %-3s %d %06x\n",
- buf.ifa.ifa_ig & 1,
+ (int)buf.ifa & 1,
buf.rr.rr_rid,
- buf.ifa.ifa_vpn,
+ buf.ifa >> 12,
buf.pte.pte_ppn,
psnames[buf.itir.itir_ps],
buf.pte.pte_ed,
diff --git a/sys/ia64/include/pte.h b/sys/ia64/include/pte.h
index 28d47c0..09b0b54c 100644
--- a/sys/ia64/include/pte.h
+++ b/sys/ia64/include/pte.h
@@ -70,79 +70,76 @@
#define PTE_AR_RWX_RW 6
#define PTE_AR_X_RX 7
-#define PTE_IG_WIRED 1
-#define PTE_IG_MANAGED 2
-
/*
* A short-format VHPT entry. Also matches the TLB insertion format.
*/
struct ia64_pte {
- u_int64_t pte_p :1; /* bits 0..0 */
- u_int64_t pte_rv1 :1; /* bits 1..1 */
- u_int64_t pte_ma :3; /* bits 2..4 */
- u_int64_t pte_a :1; /* bits 5..5 */
- u_int64_t pte_d :1; /* bits 6..6 */
- u_int64_t pte_pl :2; /* bits 7..8 */
- u_int64_t pte_ar :3; /* bits 9..11 */
- u_int64_t pte_ppn :38; /* bits 12..49 */
- u_int64_t pte_rv2 :2; /* bits 50..51 */
- u_int64_t pte_ed :1; /* bits 52..52 */
- u_int64_t pte_ig :11; /* bits 53..63 */
+ uint64_t pte_p :1; /* bit 0 */
+ uint64_t __rv1__ :1; /* bit 1 */
+ uint64_t pte_ma :3; /* bits 2..4 */
+ uint64_t pte_a :1; /* bit 5 */
+ uint64_t pte_d :1; /* bit 6 */
+ uint64_t pte_pl :2; /* bits 7..8 */
+ uint64_t pte_ar :3; /* bits 9..11 */
+ uint64_t pte_ppn :38; /* bits 12..49 */
+ uint64_t __rv2__ :2; /* bits 50..51 */
+ uint64_t pte_ed :1; /* bit 52 */
+ /* The following bits are ignored by the hardware. */
+ uint64_t pte_w :1; /* bit 53 */
+ uint64_t pte_m :1; /* bit 54 */
+ uint64_t pte_prot:3; /* bits 55..57 */
+ uint64_t __ig__ :6; /* bits 58..63 */
};
/*
* A long-format VHPT entry.
*/
struct ia64_lpte {
- u_int64_t pte_p :1; /* bits 0..0 */
- u_int64_t pte_rv1 :1; /* bits 1..1 */
- u_int64_t pte_ma :3; /* bits 2..4 */
- u_int64_t pte_a :1; /* bits 5..5 */
- u_int64_t pte_d :1; /* bits 6..6 */
- u_int64_t pte_pl :2; /* bits 7..8 */
- u_int64_t pte_ar :3; /* bits 9..11 */
- u_int64_t pte_ppn :38; /* bits 12..49 */
- u_int64_t pte_rv2 :2; /* bits 50..51 */
- u_int64_t pte_ed :1; /* bits 52..52 */
- u_int64_t pte_ig :11; /* bits 53..63 */
-
- u_int64_t pte_rv3 :2; /* bits 0..1 */
- u_int64_t pte_ps :6; /* bits 2..7 */
- u_int64_t pte_key :24; /* bits 8..31 */
- u_int64_t pte_rv4 :32; /* bits 32..63 */
-
- u_int64_t pte_tag; /* includes ti */
-
- u_int64_t pte_chain; /* pa of collision chain */
+ uint64_t pte_p :1; /* bit 0 */
+ uint64_t __rv1__ :1; /* bit 1 */
+ uint64_t pte_ma :3; /* bits 2..4 */
+ uint64_t pte_a :1; /* bit 5 */
+ uint64_t pte_d :1; /* bit 6 */
+ uint64_t pte_pl :2; /* bits 7..8 */
+ uint64_t pte_ar :3; /* bits 9..11 */
+ uint64_t pte_ppn :38; /* bits 12..49 */
+ uint64_t __rv2__ :2; /* bits 50..51 */
+ uint64_t pte_ed :1; /* bit 52 */
+ /* The following 11 bits are ignored by the hardware. */
+ uint64_t pte_w :1; /* bit 53 */
+ uint64_t pte_m :1; /* bit 54 */
+ uint64_t pte_prot:3; /* bits 55..57 */
+ uint64_t __ig__ :6; /* bits 58..63 */
+
+ uint64_t __rv3__ :2; /* bits 0..1 */
+ uint64_t pte_ps :6; /* bits 2..7 */
+ uint64_t pte_key :24; /* bits 8..31 */
+ uint64_t __rv4__ :32; /* bits 32..63 */
+
+ uint64_t pte_tag; /* includes ti */
+
+ uint64_t pte_chain; /* pa of collision chain */
};
/*
* Layout of cr.itir.
*/
struct ia64_itir {
- u_int64_t itir_rv1 :2; /* bits 0..1 */
- u_int64_t itir_ps :6; /* bits 2..7 */
- u_int64_t itir_key :24; /* bits 8..31 */
- u_int64_t itir_rv2 :32; /* bits 32..63 */
-};
-
-/*
- * Layout of cr.ifa.
- */
-struct ia64_ifa {
- u_int64_t ifa_ig :12; /* bits 0..11 */
- u_int64_t ifa_vpn :52; /* bits 12..63 */
+ uint64_t __rv1__ :2; /* bits 0..1 */
+ uint64_t itir_ps :6; /* bits 2..7 */
+ uint64_t itir_key:24; /* bits 8..31 */
+ uint64_t __rv2__ :32; /* bits 32..63 */
};
/*
* Layout of rr[x].
*/
struct ia64_rr {
- u_int64_t rr_ve :1; /* bits 0..0 */
- u_int64_t rr_rv1 :1; /* bits 1..1 */
- u_int64_t rr_ps :6; /* bits 2..7 */
- u_int64_t rr_rid :24; /* bits 8..31 */
- u_int64_t rr_rv2 :32; /* bits 32..63 */
+ uint64_t rr_ve :1; /* bit 0 */
+ uint64_t __rv1__ :1; /* bit 1 */
+ uint64_t rr_ps :6; /* bits 2..7 */
+ uint64_t rr_rid :24; /* bits 8..31 */
+ uint64_t __rv2__ :32; /* bits 32..63 */
};
#endif /* !LOCORE */
OpenPOWER on IntegriCloud