-.set kLog2CacheLineSize, 5
-.set kCacheLineSize, 32
-
-ENTRY(kdp_flush_cache, TAG_NO_FRAME_USED)
- cmpi cr0,0,r4,0 /* is this zero length? */
- add r4,r3,r4 /* calculate last byte + 1 */
- subi r4,r4,1 /* calculate last byte */
-
- srwi r5,r3,kLog2CacheLineSize /* calc first cache line index */
- srwi r4,r4,kLog2CacheLineSize /* calc last cache line index */
- beq cr0, LdataToCodeDone /* done if zero length */
-
- subf r4,r5,r4 /* calc diff (# lines minus 1) */
- addi r4,r4,1 /* # of cache lines to flush */
- slwi r5,r5,kLog2CacheLineSize /* calc addr of first cache line */
-
- /* flush the data cache lines */
- mr r3,r5 /* starting address for loop */
- mtctr r4 /* loop count */
-LdataToCodeFlushLoop:
- dcbf 0, r3 /* flush the data cache line */
- addi r3,r3,kCacheLineSize /* advance to next cache line */
- bdnz LdataToCodeFlushLoop /* loop until count is zero */
- sync /* wait until RAM is valid */
-
- /* invalidate the code cache lines */
- mr r3,r5 /* starting address for loop */
- mtctr r4 /* loop count */
-LdataToCodeInvalidateLoop:
- icbi 0, r3 /* invalidate code cache line */
- addi r3,r3,kCacheLineSize /* advance to next cache line */
- bdnz LdataToCodeInvalidateLoop /* loop until count is zero */
- sync /* wait until last icbi completes */
- isync /* discard prefetched instructions */
-LdataToCodeDone:
- blr /* return nothing */
-