/* We expand the window flush to get maximum performance. */
hypersparc_flush_cache_mm:
#ifndef CONFIG_SMP ld [%o0 + AOFF_mm_context], %g1
cmp %g1, -1
be hypersparc_flush_cache_mm_out
#endif
WINDOW_FLUSH(%g4, %g5)
/* BLAMMO! */
1:
subcc %o0, %o5, %o0 ! hyper_flush_cache_user sta %g0, [%o0 + %g0] ASI_M_FLUSH_USER sta %g0, [%o0 + %o1] ASI_M_FLUSH_USER sta %g0, [%o0 + %g1] ASI_M_FLUSH_USER sta %g0, [%o0 + %g2] ASI_M_FLUSH_USER sta %g0, [%o0 + %g3] ASI_M_FLUSH_USER sta %g0, [%o0 + %g4] ASI_M_FLUSH_USER sta %g0, [%o0 + %g5] ASI_M_FLUSH_USER
bne 1b sta %g0, [%o0 + %o4] ASI_M_FLUSH_USER
hypersparc_flush_cache_mm_out:
retl
nop
/* The things we do for performance... */
hypersparc_flush_cache_range: ld [%o0 + VMA_VM_MM], %o0
#ifndef CONFIG_SMP ld [%o0 + AOFF_mm_context], %g1
cmp %g1, -1
be hypersparc_flush_cache_range_out
#endif
WINDOW_FLUSH(%g4, %g5)
/* Flush entire user space, believe it or not this is quicker * than page at a time flushings for range > (cache_size<<2).
*/
1:
subcc %o3, %g7, %o3 sta %g0, [%o3 + %g0] ASI_M_FLUSH_USER sta %g0, [%o3 + %o4] ASI_M_FLUSH_USER sta %g0, [%o3 + %o5] ASI_M_FLUSH_USER sta %g0, [%o3 + %g1] ASI_M_FLUSH_USER sta %g0, [%o3 + %g2] ASI_M_FLUSH_USER sta %g0, [%o3 + %g3] ASI_M_FLUSH_USER sta %g0, [%o3 + %g4] ASI_M_FLUSH_USER
bne 1b sta %g0, [%o3 + %g5] ASI_M_FLUSH_USER
retl
nop
/* Below our threshold, flush one page at a time. */
0: ld [%o0 + AOFF_mm_context], %o0
mov SRMMU_CTX_REG, %g7 lda [%g7] ASI_M_MMUREGS, %o3 sta %o0, [%g7] ASI_M_MMUREGS
add %o2, -PAGE_SIZE, %o0
1:
or %o0, 0x400, %g7 lda [%g7] ASI_M_FLUSH_PROBE, %g7
orcc %g7, 0, %g0
be,a 3f
mov %o0, %o2
add %o4, %g5, %g7
2: sub %o2, %g7, %o2 sta %g0, [%o2 + %g0] ASI_M_FLUSH_PAGE sta %g0, [%o2 + %o4] ASI_M_FLUSH_PAGE sta %g0, [%o2 + %o5] ASI_M_FLUSH_PAGE sta %g0, [%o2 + %g1] ASI_M_FLUSH_PAGE sta %g0, [%o2 + %g2] ASI_M_FLUSH_PAGE sta %g0, [%o2 + %g3] ASI_M_FLUSH_PAGE
andcc %o2, 0xffc, %g0 sta %g0, [%o2 + %g4] ASI_M_FLUSH_PAGE
bne 2b sta %g0, [%o2 + %g5] ASI_M_FLUSH_PAGE
3:
cmp %o2, %o1
bne 1b
add %o2, -PAGE_SIZE, %o0
mov SRMMU_FAULT_STATUS, %g5 lda [%g5] ASI_M_MMUREGS, %g0
mov SRMMU_CTX_REG, %g7 sta %o3, [%g7] ASI_M_MMUREGS
hypersparc_flush_cache_range_out:
retl
nop
/* HyperSparc requires a valid mapping where we are about to flush * in order to check for a physical tag match during the flush.
*/ /* Verified, my ass... */
hypersparc_flush_cache_page: ld [%o0 + VMA_VM_MM], %o0 ld [%o0 + AOFF_mm_context], %g2
#ifndef CONFIG_SMP
cmp %g2, -1
be hypersparc_flush_cache_page_out
#endif
WINDOW_FLUSH(%g4, %g5)
/* BLAMMO! */
1: sub %o0, %g7, %o0 sta %g0, [%o0 + %g0] ASI_M_FLUSH_PAGE sta %g0, [%o0 + %o4] ASI_M_FLUSH_PAGE sta %g0, [%o0 + %o5] ASI_M_FLUSH_PAGE sta %g0, [%o0 + %g1] ASI_M_FLUSH_PAGE sta %g0, [%o0 + %g2] ASI_M_FLUSH_PAGE sta %g0, [%o0 + %g3] ASI_M_FLUSH_PAGE
andcc %o0, 0xffc, %g0 sta %g0, [%o0 + %g4] ASI_M_FLUSH_PAGE
bne 1b sta %g0, [%o0 + %g5] ASI_M_FLUSH_PAGE
2:
mov SRMMU_FAULT_STATUS, %g1
retl lda [%g1] ASI_M_MMUREGS, %g0
/* HyperSparc is IO cache coherent. */
hypersparc_flush_page_for_dma:
retl
nop
/* It was noted that at boot time a TLB flush all in a delay slot * can deliver an illegal instruction to the processor if the timing * is just right...
*/
hypersparc_flush_tlb_all:
mov 0x400, %g1 sta %g0, [%g1] ASI_M_FLUSH_PROBE
retl
nop
hypersparc_flush_tlb_mm:
mov SRMMU_CTX_REG, %g1 ld [%o0 + AOFF_mm_context], %o1 lda [%g1] ASI_M_MMUREGS, %g5
#ifndef CONFIG_SMP
cmp %o1, -1
be hypersparc_flush_tlb_mm_out
#endif
mov 0x300, %g2 sta %o1, [%g1] ASI_M_MMUREGS sta %g0, [%g2] ASI_M_FLUSH_PROBE
hypersparc_flush_tlb_mm_out:
retl sta %g5, [%g1] ASI_M_MMUREGS
hypersparc_flush_tlb_range: ld [%o0 + VMA_VM_MM], %o0
mov SRMMU_CTX_REG, %g1 ld [%o0 + AOFF_mm_context], %o3 lda [%g1] ASI_M_MMUREGS, %g5
#ifndef CONFIG_SMP
cmp %o3, -1
be hypersparc_flush_tlb_range_out
#endif sethi %hi(~((1 << PGDIR_SHIFT) - 1)), %o4 sta %o3, [%g1] ASI_M_MMUREGS
and %o1, %o4, %o1
add %o1, 0x200, %o1 sta %g0, [%o1] ASI_M_FLUSH_PROBE
1: sub %o1, %o4, %o1
cmp %o1, %o2
blu,a 1b sta %g0, [%o1] ASI_M_FLUSH_PROBE
hypersparc_flush_tlb_range_out:
retl sta %g5, [%g1] ASI_M_MMUREGS
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.