diff options
Diffstat (limited to 'include/asm-sparc64')
-rw-r--r-- | include/asm-sparc64/tsb.h | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/include/asm-sparc64/tsb.h b/include/asm-sparc64/tsb.h index 6e6768067e38..e82612cd9f33 100644 --- a/include/asm-sparc64/tsb.h +++ b/include/asm-sparc64/tsb.h | |||
@@ -243,6 +243,7 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
243 | #define KERNEL_TSB_SIZE_BYTES (32 * 1024) | 243 | #define KERNEL_TSB_SIZE_BYTES (32 * 1024) |
244 | #define KERNEL_TSB_NENTRIES \ | 244 | #define KERNEL_TSB_NENTRIES \ |
245 | (KERNEL_TSB_SIZE_BYTES / 16) | 245 | (KERNEL_TSB_SIZE_BYTES / 16) |
246 | #define KERNEL_TSB4M_NENTRIES 4096 | ||
246 | 247 | ||
247 | /* Do a kernel TSB lookup at tl>0 on VADDR+TAG, branch to OK_LABEL | 248 | /* Do a kernel TSB lookup at tl>0 on VADDR+TAG, branch to OK_LABEL |
248 | * on TSB hit. REG1, REG2, REG3, and REG4 are used as temporaries | 249 | * on TSB hit. REG1, REG2, REG3, and REG4 are used as temporaries |
@@ -263,4 +264,18 @@ extern struct tsb_phys_patch_entry __tsb_phys_patch, __tsb_phys_patch_end; | |||
263 | be,a,pt %xcc, OK_LABEL; \ | 264 | be,a,pt %xcc, OK_LABEL; \ |
264 | mov REG4, REG1; | 265 | mov REG4, REG1; |
265 | 266 | ||
267 | /* This version uses a trick, the TAG is already (VADDR >> 22) so | ||
268 | * we can make use of that for the index computation. | ||
269 | */ | ||
270 | #define KERN_TSB4M_LOOKUP_TL1(TAG, REG1, REG2, REG3, REG4, OK_LABEL) \ | ||
271 | sethi %hi(swapper_4m_tsb), REG1; \ | ||
272 | or REG1, %lo(swapper_4m_tsb), REG1; \ | ||
273 | and TAG, (KERNEL_TSB_NENTRIES - 1), REG2; \ | ||
274 | sllx REG2, 4, REG2; \ | ||
275 | add REG1, REG2, REG2; \ | ||
276 | KTSB_LOAD_QUAD(REG2, REG3); \ | ||
277 | cmp REG3, TAG; \ | ||
278 | be,a,pt %xcc, OK_LABEL; \ | ||
279 | mov REG4, REG1; | ||
280 | |||
266 | #endif /* !(_SPARC64_TSB_H) */ | 281 | #endif /* !(_SPARC64_TSB_H) */ |