aboutsummaryrefslogtreecommitdiff
path: root/sys/sparc64/include
diff options
context:
space:
mode:
authorJake Burkholder <jake@FreeBSD.org>2002-08-18 02:09:27 +0000
committerJake Burkholder <jake@FreeBSD.org>2002-08-18 02:09:27 +0000
commit8b53c815ec61af2cf15bf8b67cb472adb7eb5b4f (patch)
tree5417bb6532eaa247e7f078929c7d42f72a3ce98d /sys/sparc64/include
parentb383a8478c66c87355dd618afd27f4d5c048d3d6 (diff)
Add pmap support for user mappings of multiple page sizes (super pages).
This supports all hardware page sizes (8K, 64K, 512K, 4MB), but only 8k pages are actually used as of yet.
Notes
Notes: svn path=/head/; revision=102040
Diffstat (limited to 'sys/sparc64/include')
-rw-r--r--sys/sparc64/include/asmacros.h5
-rw-r--r--sys/sparc64/include/tsb.h6
-rw-r--r--sys/sparc64/include/tte.h54
3 files changed, 32 insertions, 33 deletions
diff --git a/sys/sparc64/include/asmacros.h b/sys/sparc64/include/asmacros.h
index a719efd7b004..540d28f3d0a8 100644
--- a/sys/sparc64/include/asmacros.h
+++ b/sys/sparc64/include/asmacros.h
@@ -44,11 +44,6 @@
*/
#define ASP_REG %g5
-/*
- * MMU %g7 points to the user tsb.
- */
-#define TSB_REG %g7
-
#ifdef LOCORE
/*
diff --git a/sys/sparc64/include/tsb.h b/sys/sparc64/include/tsb.h
index 20db029aff9d..9a817c20376f 100644
--- a/sys/sparc64/include/tsb.h
+++ b/sys/sparc64/include/tsb.h
@@ -55,9 +55,9 @@ tsb_vpntobucket(pmap_t pm, vm_offset_t vpn)
}
static __inline struct tte *
-tsb_vtobucket(pmap_t pm, vm_offset_t va)
+tsb_vtobucket(pmap_t pm, u_long sz, vm_offset_t va)
{
- return (tsb_vpntobucket(pm, va >> PAGE_SHIFT));
+ return (tsb_vpntobucket(pm, va >> TTE_PAGE_SHIFT(sz)));
}
static __inline struct tte *
@@ -77,7 +77,7 @@ typedef int (tsb_callback_t)(struct pmap *, struct pmap *, struct tte *,
struct tte *tsb_tte_lookup(pmap_t pm, vm_offset_t va);
void tsb_tte_remove(struct tte *stp);
-struct tte *tsb_tte_enter(pmap_t pm, vm_page_t m, vm_offset_t va,
+struct tte *tsb_tte_enter(pmap_t pm, vm_page_t m, vm_offset_t va, u_long sz,
u_long data);
void tsb_tte_local_remove(struct tte *tp);
void tsb_foreach(pmap_t pm1, pmap_t pm2, vm_offset_t start, vm_offset_t end,
diff --git a/sys/sparc64/include/tte.h b/sys/sparc64/include/tte.h
index 13a445a8b87d..e86c722f8793 100644
--- a/sys/sparc64/include/tte.h
+++ b/sys/sparc64/include/tte.h
@@ -52,27 +52,27 @@
#define TD_PA_MASK ((1UL << TD_PA_BITS) - 1)
#define TD_SOFT_MASK ((1UL << TD_SOFT_BITS) - 1)
-#define TD_SIZE_SPREAD (3)
+#define TS_8K (0UL)
+#define TS_64K (1UL)
+#define TS_512K (2UL)
+#define TS_4M (3UL)
-#define TS_EXEC (1UL << 4)
-#define TS_REF (1UL << 3)
-#define TS_PV (1UL << 2)
-#define TS_W (1UL << 1)
-#define TS_WIRED (1UL << 0)
+#define TS_MIN TS_8K
+#define TS_MAX TS_4M
#define TD_V (1UL << 63)
-#define TD_8K (0UL << TD_SIZE_SHIFT)
-#define TD_64K (1UL << TD_SIZE_SHIFT)
-#define TD_512K (2UL << TD_SIZE_SHIFT)
-#define TD_4M (3UL << TD_SIZE_SHIFT)
+#define TD_8K (TS_8K << TD_SIZE_SHIFT)
+#define TD_64K (TS_64K << TD_SIZE_SHIFT)
+#define TD_512K (TS_512K << TD_SIZE_SHIFT)
+#define TD_4M (TS_4M << TD_SIZE_SHIFT)
#define TD_NFO (1UL << 60)
#define TD_IE (1UL << 59)
#define TD_PA(pa) ((pa) & (TD_PA_MASK << TD_PA_SHIFT))
-#define TD_EXEC (TS_EXEC << TD_SOFT_SHIFT)
-#define TD_REF (TS_REF << TD_SOFT_SHIFT)
-#define TD_PV (TS_PV << TD_SOFT_SHIFT)
-#define TD_SW (TS_W << TD_SOFT_SHIFT)
-#define TD_WIRED (TS_WIRED << TD_SOFT_SHIFT)
+#define TD_EXEC ((1UL << 4) << TD_SOFT_SHIFT)
+#define TD_REF ((1UL << 3) << TD_SOFT_SHIFT)
+#define TD_PV ((1UL << 2) << TD_SOFT_SHIFT)
+#define TD_SW ((1UL << 1) << TD_SOFT_SHIFT)
+#define TD_WIRED ((1UL << 0) << TD_SOFT_SHIFT)
#define TD_L (1UL << 6)
#define TD_CP (1UL << 5)
#define TD_CV (1UL << 4)
@@ -81,12 +81,17 @@
#define TD_W (1UL << 1)
#define TD_G (1UL << 0)
-#define TV_VPN(va) ((va) >> PAGE_SHIFT)
+#define TV_SIZE_BITS (TD_SIZE_BITS)
+#define TV_VPN(va, sz) ((((va) >> TTE_PAGE_SHIFT(sz)) << TV_SIZE_BITS) | sz)
+
+#define TTE_SIZE_SPREAD (3)
+#define TTE_PAGE_SHIFT(sz) \
+ (PAGE_SHIFT + ((sz) * TTE_SIZE_SPREAD))
#define TTE_GET_SIZE(tp) \
(((tp)->tte_data >> TD_SIZE_SHIFT) & TD_SIZE_MASK)
#define TTE_GET_PAGE_SHIFT(tp) \
- (PAGE_SHIFT + (TTE_GET_SIZE(tp) * TD_SIZE_SPREAD))
+ TTE_PAGE_SHIFT(TTE_GET_SIZE(tp))
#define TTE_GET_PAGE_SIZE(tp) \
(1 << TTE_GET_PAGE_SHIFT(tp))
#define TTE_GET_PAGE_MASK(tp) \
@@ -94,13 +99,17 @@
#define TTE_GET_PA(tp) \
((tp)->tte_data & (TD_PA_MASK << TD_PA_SHIFT))
+#define TTE_GET_VPN(tp) \
+ ((tp)->tte_vpn >> TV_SIZE_BITS)
#define TTE_GET_VA(tp) \
- ((tp)->tte_vpn << PAGE_SHIFT)
+ (TTE_GET_VPN(tp) << TTE_GET_PAGE_SHIFT(tp))
#define TTE_GET_PMAP(tp) \
((tp)->tte_pmap)
#define TTE_ZERO(tp) \
bzero(tp, sizeof(*tp))
+struct pmap;
+
struct tte {
u_long tte_vpn;
u_long tte_data;
@@ -109,15 +118,10 @@ struct tte {
};
static __inline int
-tte_match_vpn(struct tte *tp, vm_offset_t vpn)
-{
- return ((tp->tte_data & TD_V) != 0 && tp->tte_vpn == vpn);
-}
-
-static __inline int
tte_match(struct tte *tp, vm_offset_t va)
{
- return (tte_match_vpn(tp, va >> PAGE_SHIFT));
+ return (((tp->tte_data & TD_V) != 0) &&
+ (tp->tte_vpn == TV_VPN(va, TTE_GET_SIZE(tp))));
}
#endif /* !_MACHINE_TTE_H_ */