aboutsummaryrefslogtreecommitdiff
path: root/sys/sparc64/include/tsb.h
diff options
context:
space:
mode:
authorJake Burkholder <jake@FreeBSD.org>2001-12-29 08:15:43 +0000
committerJake Burkholder <jake@FreeBSD.org>2001-12-29 08:15:43 +0000
commit624eb7982145217f96cf59ad97cb937cb6c32dda (patch)
tree4b82430f09c6a4d535c5977a593c62658a85c8ca /sys/sparc64/include/tsb.h
parentb45b19a44eaf77d89ddd4f519f41932ddc422865 (diff)
Remove support for multi level tsbs, making this code much simpler and
much less magic, fragile, broken. Use ttes rather than sttes. We still use the replacement scheme used by the original code, which is pretty cool. Many crucial bug fixes from: tmm
Notes
Notes: svn path=/head/; revision=88649
Diffstat (limited to 'sys/sparc64/include/tsb.h')
-rw-r--r--sys/sparc64/include/tsb.h156
1 files changed, 27 insertions, 129 deletions
diff --git a/sys/sparc64/include/tsb.h b/sys/sparc64/include/tsb.h
index 32e8a9884870..9391e6077fd5 100644
--- a/sys/sparc64/include/tsb.h
+++ b/sys/sparc64/include/tsb.h
@@ -32,150 +32,48 @@
#ifndef _MACHINE_TSB_H_
#define _MACHINE_TSB_H_
-#define TSB_USER_MIN_ADDRESS (UPT_MIN_ADDRESS)
-
-#define TSB_MASK_WIDTH (6)
-
-#define TSB_PRIMARY_BUCKET_SHIFT (2)
-#define TSB_PRIMARY_BUCKET_SIZE (1 << TSB_PRIMARY_BUCKET_SHIFT)
-#define TSB_PRIMARY_BUCKET_MASK (TSB_PRIMARY_BUCKET_SIZE - 1)
-#define TSB_SECONDARY_BUCKET_SHIFT (3)
-#define TSB_SECONDARY_BUCKET_SIZE (1 << TSB_SECONDARY_BUCKET_SHIFT)
-#define TSB_SECONDARY_BUCKET_MASK (TSB_SECONDARY_BUCKET_SIZE - 1)
-
-#define TSB_PRIMARY_STTE_SHIFT \
- (STTE_SHIFT + TSB_PRIMARY_BUCKET_SHIFT)
-#define TSB_PRIMARY_STTE_MASK ((1 << TSB_PRIMARY_STTE_SHIFT) - 1)
-
-#define TSB_LEVEL1_BUCKET_MASK \
- ((TSB_SECONDARY_BUCKET_MASK & ~TSB_PRIMARY_BUCKET_MASK) << \
- (PAGE_SHIFT - TSB_PRIMARY_BUCKET_SHIFT))
-#define TSB_LEVEL1_BUCKET_SHIFT \
- (TSB_BUCKET_SPREAD_SHIFT + \
- (TSB_SECONDARY_BUCKET_SHIFT - TSB_PRIMARY_BUCKET_SHIFT))
-
-#define TSB_BUCKET_SPREAD_SHIFT (2)
-
-#define TSB_DEPTH (7)
-
-#define TSB_KERNEL_MASK \
- (((KVA_PAGES * PAGE_SIZE_4M) >> STTE_SHIFT) - 1)
-#define TSB_KERNEL_VA_MASK (TSB_KERNEL_MASK << STTE_SHIFT)
-
-extern struct stte *tsb_kernel;
+#define TSB_BUCKET_SHIFT (2)
+#define TSB_BUCKET_SIZE (1 << TSB_BUCKET_SHIFT)
+#define TSB_BUCKET_ADDRESS_BITS \
+ (PAGE_SHIFT_8K - TSB_BUCKET_SHIFT - TTE_SHIFT)
+#define TSB_BUCKET_MASK ((1 << TSB_BUCKET_ADDRESS_BITS) - 1)
+
+#define TSB_KERNEL_SIZE \
+ ((KVA_PAGES * PAGE_SIZE_4M) / sizeof(struct tte))
+#define TSB_KERNEL_MASK (TSB_KERNEL_SIZE - 1)
+#define TSB_KERNEL_VA_MASK (TSB_KERNEL_MASK << TTE_SHIFT)
+
+extern struct tte *tsb_kernel;
extern vm_offset_t tsb_kernel_phys;
-static __inline struct stte *
-tsb_base(u_int level)
-{
- vm_offset_t base;
- size_t len;
-
- if (level == 0)
- base = TSB_USER_MIN_ADDRESS;
- else {
- len = 1UL << ((level * TSB_BUCKET_SPREAD_SHIFT) +
- TSB_MASK_WIDTH + TSB_SECONDARY_BUCKET_SHIFT +
- STTE_SHIFT);
- base = TSB_USER_MIN_ADDRESS + len;
- }
- return (struct stte *)base;
-}
-
-static __inline u_long
-tsb_bucket_shift(u_int level)
-{
- return (level == 0 ?
- TSB_PRIMARY_BUCKET_SHIFT : TSB_SECONDARY_BUCKET_SHIFT);
-}
-
-static __inline u_long
-tsb_bucket_size(u_int level)
-{
- return (1UL << tsb_bucket_shift(level));
-}
-
-static __inline u_long
-tsb_bucket_mask(u_int level)
+static __inline struct tte *
+tsb_vpntobucket(pmap_t pm, vm_offset_t vpn)
{
- return (tsb_bucket_size(level) - 1);
+ return (&pm->pm_tsb[(vpn & TSB_BUCKET_MASK) << TSB_BUCKET_SHIFT]);
}
-static __inline u_long
-tsb_mask_width(u_int level)
+static __inline struct tte *
+tsb_vtobucket(pmap_t pm, vm_offset_t va)
{
- return ((level * TSB_BUCKET_SPREAD_SHIFT) + TSB_MASK_WIDTH);
+ return (tsb_vpntobucket(pm, va >> PAGE_SHIFT));
}
-static __inline u_long
-tsb_mask(u_int level)
-{
- return ((1UL << tsb_mask_width(level)) - 1);
-}
-
-static __inline u_int
-tsb_tlb_slot(u_int level)
-{
- return (level == 0 ?
- TLB_SLOT_TSB_USER_PRIMARY : TLB_SLOT_TSB_USER_SECONDARY);
-}
-
-static __inline vm_offset_t
-tsb_stte_vtophys(pmap_t pm, struct stte *stp)
-{
- vm_offset_t va;
- u_long data;
-
- va = (vm_offset_t)stp;
- if (pm == kernel_pmap)
- return (tsb_kernel_phys + (va - (vm_offset_t)tsb_kernel));
-
- if (trunc_page(va) == TSB_USER_MIN_ADDRESS)
- data = pm->pm_stte.st_tte.tte_data;
- else
- data = ldxa(TLB_DAR_SLOT(tsb_tlb_slot(1)),
- ASI_DTLB_DATA_ACCESS_REG);
- return ((vm_offset_t)((TD_PA(data)) + (va & PAGE_MASK)));
-}
-
-static __inline struct stte *
-tsb_vpntobucket(vm_offset_t vpn, u_int level)
-{
- return (tsb_base(level) +
- ((vpn & tsb_mask(level)) << tsb_bucket_shift(level)));
-}
-
-static __inline struct stte *
-tsb_vtobucket(vm_offset_t va, u_int level)
-{
- return (tsb_vpntobucket(va >> PAGE_SHIFT, level));
-}
-
-static __inline struct stte *
-tsb_kvpntostte(vm_offset_t vpn)
+static __inline struct tte *
+tsb_kvpntotte(vm_offset_t vpn)
{
return (&tsb_kernel[vpn & TSB_KERNEL_MASK]);
}
-static __inline struct stte *
-tsb_kvtostte(vm_offset_t va)
+static __inline struct tte *
+tsb_kvtotte(vm_offset_t va)
{
- return (tsb_kvpntostte(va >> PAGE_SHIFT));
+ return (tsb_kvpntotte(va >> PAGE_SHIFT));
}
-struct stte *tsb_get_bucket(pmap_t pm, u_int level, vm_offset_t va,
- int allocate);
-int tsb_miss(pmap_t pm, u_int type, struct mmuframe *mf);
-struct tte tsb_page_alloc(pmap_t pm, vm_offset_t va);
-void tsb_page_fault(pmap_t pm, int level, vm_offset_t va, struct stte *stp);
-void tsb_page_init(void *va, int level);
-struct stte *tsb_stte_lookup(pmap_t pm, vm_offset_t va);
-struct stte *tsb_stte_promote(pmap_t pm, vm_offset_t va, struct stte *stp);
-void tsb_stte_remove(struct stte *stp);
-struct stte *tsb_tte_enter(pmap_t pm, vm_offset_t va, struct tte 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 tte);
void tsb_tte_local_remove(struct tte *tp);
-extern vm_offset_t tsb_bootstrap_pages[];
-extern int tsb_bootstrap_index;
-
#endif /* !_MACHINE_TSB_H_ */