X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/eb6b6ca394357805f2bdba989abae309f718b4d8..f427ee49d309d8fc33ebf3042c3a775f2f530ded:/osfmk/arm/caches_asm.s diff --git a/osfmk/arm/caches_asm.s b/osfmk/arm/caches_asm.s index 0b305f48f..5556a00ae 100644 --- a/osfmk/arm/caches_asm.s +++ b/osfmk/arm/caches_asm.s @@ -31,6 +31,7 @@ #include <arm/pmap.h> #include <sys/errno.h> #include "assym.s" +#include "caches_macros.s" /* @@ -143,31 +144,37 @@ fmir_loop: LEXT(CleanPoC_Dcache) LEXT(clean_mmu_dcache) #if !defined(__ARM_L1_WT_CACHE__) + mov r0, #0 + GET_CACHE_CONFIG r0, r1, r2, r3 mov r0, #0 dsb clean_dcacheway: clean_dcacheline: mcr p15, 0, r0, c7, c10, 2 // clean dcache line by way/set - add r0, r0, #1 << MMU_I7SET // increment set index - tst r0, #1 << (MMU_NSET + MMU_I7SET) // look for overflow + add r0, r0, r1 // increment set index + tst r0, r2 // look for overflow beq clean_dcacheline - bic r0, r0, #1 << (MMU_NSET + MMU_I7SET) // clear set overflow - adds r0, r0, #1 << MMU_I7WAY // increment way + bic r0, r0, r2 // clear set overflow + adds r0, r0, r3 // increment way bcc clean_dcacheway // loop #endif -#if __ARM_L2CACHE__ + HAS_L2_CACHE r0 + cmp r0, #0 + beq clean_skipl2dcache + mov r0, #1 + GET_CACHE_CONFIG r0, r1, r2, r3 dsb mov r0, #2 clean_l2dcacheway: clean_l2dcacheline: mcr p15, 0, r0, c7, c10, 2 // clean dcache line by way/set - add r0, r0, #1 << L2_I7SET // increment set index - tst r0, #1 << (L2_NSET + L2_I7SET) // look for overflow + add r0, r0, r1 // increment set index + tst r0, r2 // look for overflow beq clean_l2dcacheline - bic r0, r0, #1 << (L2_NSET + L2_I7SET) // clear set overflow - adds r0, r0, #1 << L2_I7WAY // increment way + bic r0, r0, r2 // clear set overflow + adds r0, r0, r3 // increment way bcc clean_l2dcacheway // loop -#endif +clean_skipl2dcache: dsb bx lr @@ -181,16 +188,18 @@ clean_l2dcacheline: .globl EXT(CleanPoU_Dcache) LEXT(CleanPoU_Dcache) #if !defined(__ARM_PoU_WT_CACHE__) + mov r0, #0 + GET_CACHE_CONFIG r0, r1, r2, r3 mov r0, #0 dsb clean_dcacheway_idle: clean_dcacheline_idle: mcr p15, 0, r0, c7, c10, 2 // clean dcache line by way/set - add r0, r0, #1 << MMU_I7SET // increment set index - tst r0, #1 << (MMU_NSET + MMU_I7SET) // look for overflow + add r0, r0, r1 // increment set index + tst r0, r2 // look for overflow beq clean_dcacheline_idle - bic r0, r0, #1 << (MMU_NSET + MMU_I7SET) // clear set overflow - adds r0, r0, #1 << MMU_I7WAY // increment way + bic r0, r0, r2 // clear set overflow + adds r0, r0, r3 // increment way bcc clean_dcacheway_idle // loop #endif dsb @@ -224,7 +233,7 @@ cudr_loop: bx lr /* - * void CleanPoC_DcacheRegion(vm_offset_t va, unsigned length) + * void CleanPoC_DcacheRegion(vm_offset_t va, size_t length) * * Clean d-cache region to Point of Coherency */ @@ -256,30 +265,36 @@ ccdr_loop: .align 2 .globl EXT(FlushPoC_Dcache) LEXT(FlushPoC_Dcache) + mov r0, #0 + GET_CACHE_CONFIG r0, r1, r2, r3 mov r0, #0 dsb cleanflush_dcacheway: cleanflush_dcacheline: mcr p15, 0, r0, c7, c14, 2 // cleanflush dcache line by way/set - add r0, r0, #1 << MMU_I7SET // increment set index - tst r0, #1 << (MMU_NSET + MMU_I7SET) // look for overflow + add r0, r0, r1 // increment set index + tst r0, r2 // look for overflow beq cleanflush_dcacheline - bic r0, r0, #1 << (MMU_NSET + MMU_I7SET) // clear set overflow - adds r0, r0, #1 << MMU_I7WAY // increment way + bic r0, r0, r2 // clear set overflow + adds r0, r0, r3 // increment way bcc cleanflush_dcacheway // loop -#if __ARM_L2CACHE__ + HAS_L2_CACHE r0 + cmp r0, #0 + beq cleanflush_skipl2dcache + mov r0, #1 + GET_CACHE_CONFIG r0, r1, r2, r3 dsb mov r0, #2 cleanflush_l2dcacheway: cleanflush_l2dcacheline: mcr p15, 0, r0, c7, c14, 2 // cleanflush dcache line by way/set - add r0, r0, #1 << L2_I7SET // increment set index - tst r0, #1 << (L2_NSET + L2_I7SET) // look for overflow + add r0, r0, r1 // increment set index + tst r0, r2 // look for overflow beq cleanflush_l2dcacheline - bic r0, r0, #1 << (L2_NSET + L2_I7SET) // clear set overflow - adds r0, r0, #1 << L2_I7WAY // increment way + bic r0, r0, r2 // clear set overflow + adds r0, r0, r3 // increment way bcc cleanflush_l2dcacheway // loop -#endif +cleanflush_skipl2dcache: dsb bx lr @@ -292,16 +307,18 @@ cleanflush_l2dcacheline: .align 2 .globl EXT(FlushPoU_Dcache) LEXT(FlushPoU_Dcache) + mov r0, #0 + GET_CACHE_CONFIG r0, r1, r2, r3 mov r0, #0 dsb fpud_way: fpud_line: mcr p15, 0, r0, c7, c14, 2 // cleanflush dcache line by way/set - add r0, r0, #1 << MMU_I7SET // increment set index - tst r0, #1 << (MMU_NSET + MMU_I7SET) // look for overflow + add r0, r0, r1 // increment set index + tst r0, r2 // look for overflow beq fpud_line - bic r0, r0, #1 << (MMU_NSET + MMU_I7SET) // clear set overflow - adds r0, r0, #1 << MMU_I7WAY // increment way + bic r0, r0, r2 // clear set overflow + adds r0, r0, r3 // increment way bcc fpud_way // loop dsb bx lr