diff options
Diffstat (limited to 'sys/sparc64/include/tsb.h')
-rw-r--r-- | sys/sparc64/include/tsb.h | 156 |
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_ */ |