Files
ac-decomp/src/dolphin/OS/OSCache.c
T
2023-02-07 11:09:14 +00:00

216 lines
3.0 KiB
C

#include "dolphin/OS/OSCache.h"
//Needs OSError stuff
asm void DCEnable(void){
nofralloc
sync
mfspr r3, 0x3f0
ori r3, r3, 0x4000
mtspr 0x3f0, r3
blr
}
asm void DCInvalidateRange(register void* buf, register u32 len){
nofralloc
cmplwi len, 0
blelr-
clrlwi. r5, buf, 0x1b
beq- pi_r
addi len, len, 0x20
pi_r:
addi len, len, 0x1f
srwi len, len, 5
mtctr len
inv_ran:
dcbi 0, buf
addi buf, buf, 0x20
bdnz inv_ran
blr
}
asm void DCFlushRange(register void* buf, register u32 len){
nofralloc
cmplwi len, 0
blelr-
clrlwi. r5, buf, 0x1b
beq- pf_r
addi len, len, 0x20
pf_r:
addi len, len, 0x1f
srwi len, len, 5
mtctr len
fls_ran:
dcbf 0, buf
addi buf, buf, 0x20
bdnz fls_ran
sc
blr
}
asm void DCStoreRange(register void* buf, register u32 len){
nofralloc
cmplwi len, 0
blelr-
clrlwi. r5, buf, 0x1b
beq- ps_r
addi len, len, 0x20
ps_r:
addi len, len, 0x1f
srwi len, len, 5
mtctr len
st_ran:
dcbst 0, buf
addi buf, buf, 0x20
bdnz st_ran
sc
blr
}
asm void DCFlushRangeNoSync(register void* buf, register u32 len){
nofralloc
cmplwi len, 0
blelr-
clrlwi. r5, buf, 0x1b
beq- pfns_r
addi len, len, 0x20
pfns_r:
addi len, len, 0x1f
srwi len, len, 5
mtctr len
fls_ranns:
dcbf 0, buf
addi buf, buf, 0x20
bdnz fls_ranns
blr
}
asm void DCStoreRangeNoSync(register void* buf, register u32 len){
nofralloc
cmplwi len, 0
blelr-
clrlwi. r5, buf, 0x1b
beq- psns_r
addi len, len, 0x20
psns_r:
addi len, len, 0x1f
srwi len, len, 5
mtctr len
st_ranns:
dcbst 0, buf
addi buf, buf, 0x20
bdnz st_ranns
sc
blr
}
asm void DCZeroRange(register void* buf, register u32 len){
nofralloc
cmplwi len, 0
blelr-
clrlwi. r5, buf, 0x1b
beq- pzr_r
addi len, len, 0x20
pzr_r:
addi len, len, 0x1f
srwi len, len, 5
mtctr len
z_ran:
dcbz 0, buf
addi buf, buf, 0x20
bdnz z_ran
blr
}
asm void DCTouchRange(register void* buf, register u32 len){
nofralloc
cmplwi len, 0
blelr-
clrlwi. r5, buf, 0x1b
beq- ptor_r
addi len, len, 0x20
ptor_r:
addi len, len, 0x1f
srwi len, len, 5
mtctr len
t_ran:
dcbt 0, buf
addi buf, buf, 0x20
bdnz t_ran
blr
}
asm void ICInvalidateRange(register void* buf, register u32 len){
nofralloc
cmplwi len, 0
blelr-
clrlwi. r5, buf, 0x1b
beq- pir_r
addi len, len, 0x20
pir_r:
addi len, len, 0x1f
srwi len, len, 5
mtctr len
i_ran:
icbi 0, buf
addi buf, buf, 0x20
bdnz i_ran
sync
isync
blr
}
asm void ICFlashInvalidate(void){
nofralloc
mfspr r3, 0x3f0
ori r3, r3, 0x800
mtspr 0x3f0, r3
blr
}
asm void ICEnable(void){
nofralloc
isync
mfspr r3, 0x3f0
ori r3, r3, 0x8000
mtspr 0x3f0, r3
blr
}
asm void LCDisable(void){
nofralloc
lis r3, 0xE000
li r4, 0x200
mtctr r4
dis:
dcbi 0, r3
addi r3, r3, 0x20
bdnz dis
mfspr r4, 0x398
rlwinm r4, r4, 0, 4, 2
mtspr 0x398, r4
blr
}