aboutsummaryrefslogtreecommitdiff
path: root/sys/sparc64/include/tsb.h
diff options
context:
space:
mode:
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_ */