mirror of https://github.com/zeldaret/tp.git
502 lines
11 KiB
C
502 lines
11 KiB
C
//
|
|
// Generated By: dol2asm
|
|
// Translation Unit: OSCache
|
|
//
|
|
|
|
#include "dolphin/os/OSCache.h"
|
|
#include "dol2asm.h"
|
|
#include "dolphin/os/OSError.h"
|
|
#include "dolphin/os/OSInterrupt.h"
|
|
|
|
//
|
|
// External References:
|
|
//
|
|
|
|
void OSReport();
|
|
void PPCMfmsr();
|
|
void PPCMtmsr();
|
|
void PPCMfhid0();
|
|
void PPCMfl2cr();
|
|
void PPCMtl2cr();
|
|
void PPCHalt();
|
|
void PPCMfhid2();
|
|
void PPCMthid2();
|
|
void OSDumpContext();
|
|
void DBPrintf();
|
|
|
|
//
|
|
// Declarations:
|
|
//
|
|
|
|
/* 8033B56C-8033B580 335EAC 0014+00 1/1 0/0 0/0 .text DCEnable */
|
|
static asm void DCEnable(void) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
sync
|
|
mfspr r3, 0x3F0
|
|
ori r3, r3, 0x4000
|
|
mtspr 0x3F0, r3
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B580-8033B5AC 335EC0 002C+00 0/0 30/30 1/1 .text DCInvalidateRange */
|
|
asm void DCInvalidateRange(register void* start, register u32 nBytes) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
cmplwi nBytes, 0
|
|
blelr
|
|
|
|
clrlwi r5, start, 0x1B
|
|
add nBytes, nBytes, r5
|
|
addi nBytes, nBytes, 0x1F
|
|
srwi nBytes, nBytes, 5
|
|
mtctr nBytes
|
|
|
|
do_invalidate:
|
|
dcbi 0, start
|
|
addi start, start, 0x20
|
|
bdnz do_invalidate
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B5AC-8033B5DC 335EEC 0030+00 0/0 11/11 0/0 .text DCFlushRange */
|
|
asm void DCFlushRange(register void* start, register u32 nBytes) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
cmplwi nBytes, 0
|
|
blelr
|
|
|
|
clrlwi r5, start, 0x1B
|
|
add nBytes, nBytes, r5
|
|
addi nBytes, nBytes, 0x1F
|
|
srwi nBytes, nBytes, 5
|
|
mtctr nBytes
|
|
|
|
do_flush:
|
|
dcbf 0, start
|
|
addi start, start, 0x20
|
|
bdnz do_flush
|
|
sc
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B5DC-8033B60C 335F1C 0030+00 0/0 54/54 1/1 .text DCStoreRange */
|
|
asm void DCStoreRange(register void* start, register u32 nBytes) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
cmplwi nBytes, 0
|
|
blelr
|
|
|
|
clrlwi r5, start, 0x1B
|
|
add nBytes, nBytes, r5
|
|
addi nBytes, nBytes, 0x1F
|
|
srwi nBytes, nBytes, 5
|
|
mtctr nBytes
|
|
|
|
do_store:
|
|
dcbst 0, start
|
|
addi start, start, 0x20
|
|
bdnz do_store
|
|
sc
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B60C-8033B638 335F4C 002C+00 0/0 2/2 0/0 .text DCFlushRangeNoSync */
|
|
asm void DCFlushRangeNoSync(register void* start, register u32 nBytes) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
cmplwi nBytes, 0
|
|
blelr
|
|
|
|
clrlwi r5, start, 0x1B
|
|
add nBytes, nBytes, r5
|
|
addi nBytes, nBytes, 0x1F
|
|
srwi nBytes, nBytes, 5
|
|
mtctr nBytes
|
|
|
|
do_flush:
|
|
dcbf 0, start
|
|
addi start, start, 0x20
|
|
bdnz do_flush
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B638-8033B664 335F78 002C+00 0/0 13/13 3/3 .text DCStoreRangeNoSync */
|
|
asm void DCStoreRangeNoSync(register void* start, register u32 nBytes) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
cmplwi nBytes, 0
|
|
blelr
|
|
|
|
clrlwi r5, start, 0x1B
|
|
add nBytes, nBytes, r5
|
|
addi nBytes, nBytes, 0x1F
|
|
srwi nBytes, nBytes, 5
|
|
mtctr nBytes
|
|
|
|
do_store:
|
|
dcbst 0, start
|
|
addi start, start, 0x20
|
|
bdnz do_store
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B664-8033B690 335FA4 002C+00 0/0 1/1 1/1 .text DCZeroRange */
|
|
asm void DCZeroRange(register void* start, register u32 nBytes) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
cmplwi nBytes, 0
|
|
blelr
|
|
|
|
clrlwi r5, start, 0x1B
|
|
add nBytes, nBytes, r5
|
|
addi nBytes, nBytes, 0x1F
|
|
srwi nBytes, nBytes, 5
|
|
mtctr nBytes
|
|
|
|
do_zero:
|
|
dcbz 0, start
|
|
addi start, start, 0x20
|
|
bdnz do_zero
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B690-8033B6C4 335FD0 0034+00 0/0 6/6 0/0 .text ICInvalidateRange */
|
|
asm void ICInvalidateRange(register void* start, register u32 nBytes) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
cmplwi nBytes, 0
|
|
blelr
|
|
|
|
clrlwi r5, start, 0x1B
|
|
add nBytes, nBytes, r5
|
|
addi nBytes, nBytes, 0x1F
|
|
srwi nBytes, nBytes, 5
|
|
mtctr nBytes
|
|
|
|
do_invalidate:
|
|
icbi 0, start
|
|
addi start, start, 0x20
|
|
bdnz do_invalidate
|
|
|
|
sync
|
|
isync
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B6C4-8033B6D4 336004 0010+00 0/0 5/5 0/0 .text ICFlashInvalidate */
|
|
asm void ICFlashInvalidate(void) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
mfspr r3, 0x3F0
|
|
ori r3, r3, 0x800
|
|
mtspr 0x3F0, r3
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B6D4-8033B6E8 336014 0014+00 1/1 0/0 0/0 .text ICEnable */
|
|
static asm void ICEnable(void) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
isync
|
|
mfspr r3, 0x3F0
|
|
ori r3, r3, 0x8000
|
|
mtspr 0x3F0, r3
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B6E8-8033B7B4 336028 00CC+00 1/1 0/0 0/0 .text __LCEnable */
|
|
asm void __LCEnable(void) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
mfmsr r5
|
|
ori r5, r5, 0x1000
|
|
mtmsr r5
|
|
|
|
lis r3, 0x8000
|
|
li r4, 0x400
|
|
mtctr r4
|
|
|
|
do_store:
|
|
dcbt 0, r3
|
|
dcbst 0, r3
|
|
addi r3, r3, 0x20
|
|
bdnz do_store
|
|
|
|
mfspr r4, 0x398
|
|
oris r4, r4, 0x100F
|
|
mtspr 0x398, r4
|
|
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
lis r3, 0xE000
|
|
ori r3, r3, 0x0002
|
|
mtdbatl 3, r3
|
|
ori r3, r3, 0x1FE
|
|
mtdbatu 3, r3
|
|
isync
|
|
|
|
lis r3, 0xE000
|
|
li r6, 0x200
|
|
mtctr r6
|
|
li r6, 0
|
|
do_load:
|
|
dcbz_l r6, r3
|
|
addi r3, r3, 0x0020
|
|
bdnz do_load
|
|
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
nop
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B7B4-8033B7EC 3360F4 0038+00 0/0 0/0 1/1 .text LCEnable */
|
|
void LCEnable(void) {
|
|
BOOL interrupt = OSDisableInterrupts();
|
|
__LCEnable();
|
|
OSRestoreInterrupts(interrupt);
|
|
}
|
|
|
|
/* 8033B7EC-8033B814 33612C 0028+00 0/0 2/2 1/1 .text LCDisable */
|
|
asm void LCDisable(void) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
lis r3, 0xE000
|
|
li r4, 0x200
|
|
mtctr r4
|
|
do_invalidate:
|
|
dcbi 0, r3
|
|
addi r3, r3, 0x20
|
|
bdnz do_invalidate
|
|
|
|
mfspr r4, 0x398
|
|
rlwinm r4, r4, 0, 4, 2
|
|
mtspr 0x398, r4
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* 8033B814-8033B838 336154 0024+00 1/1 0/0 0/0 .text LCStoreBlocks */
|
|
static asm void LCStoreBlocks(register void* destAddr, register void* srcAddr,
|
|
register u32 blockNum) {
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
rlwinm r6, blockNum, 0x1E, 0x1B, 0x1F
|
|
clrlwi destAddr, destAddr, 4
|
|
or r6, r6, destAddr
|
|
mtspr 0x39A, r6
|
|
rlwinm r6, blockNum, 2, 0x1C, 0x1D
|
|
or r6, r6, srcAddr
|
|
ori r6, r6, 2
|
|
mtspr 0x39B, r6
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
/* 8033B838-8033B8E4 336178 00AC+00 0/0 0/0 3/3 .text LCStoreData */
|
|
u32 LCStoreData(void* destAddr, void* srcAddr, u32 nBytes) {
|
|
u32 blocks = (nBytes + 31) / 32;
|
|
u32 ret = (blocks + 127) / 128;
|
|
|
|
while (blocks > 0) {
|
|
if (blocks < 128) {
|
|
LCStoreBlocks(destAddr, srcAddr, blocks);
|
|
blocks = 0;
|
|
} else {
|
|
LCStoreBlocks(destAddr, srcAddr, 0);
|
|
blocks -= 128;
|
|
|
|
destAddr = (char*)destAddr + 0x1000;
|
|
srcAddr = (char*)srcAddr + 0x1000;
|
|
}
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/* 8033B8E4-8033B8F8 336224 0014+00 0/0 0/0 3/3 .text LCQueueWait */
|
|
asm void LCQueueWait(register u32 len){
|
|
// clang-format off
|
|
nofralloc
|
|
|
|
mfspr r4, 0x398
|
|
rlwinm r4, r4, 8, 28, 31
|
|
cmpw r4, len
|
|
bgt LCQueueWait
|
|
|
|
blr
|
|
// clang-format on
|
|
}
|
|
|
|
/* ############################################################################################## */
|
|
/* 803CF510-803CF53C 02C630 0029+03 3/3 0/0 0/0 .data @63 */
|
|
SECTION_DATA static char lit_63[] = ">>> L2 INVALIDATE : SHOULD NEVER HAPPEN\n";
|
|
|
|
/* 8033B8F8-8033B990 336238 0098+00 1/1 0/0 0/0 .text L2GlobalInvalidate */
|
|
#pragma push
|
|
#pragma optimization_level 0
|
|
#pragma optimizewithasm off
|
|
static asm void L2GlobalInvalidate(void) {
|
|
nofralloc
|
|
#include "asm/dolphin/os/OSCache/L2GlobalInvalidate.s"
|
|
}
|
|
#pragma pop
|
|
|
|
/* ############################################################################################## */
|
|
/* 803CF53C-803CF554 02C65C 0018+00 0/1 0/0 0/0 .data @84 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_84[] = "Machine check received\n";
|
|
#pragma pop
|
|
|
|
/* 803CF554-803CF570 02C674 001B+01 0/1 0/0 0/0 .data @85 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_85[] = "HID2 = 0x%x SRR1 = 0x%x\n";
|
|
#pragma pop
|
|
|
|
/* 803CF570-803CF5A0 02C690 0030+00 0/1 0/0 0/0 .data @86 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_86[] = "Machine check was not DMA/locked cache related\n";
|
|
#pragma pop
|
|
|
|
/* 803CF5A0-803CF5DC 02C6C0 003C+00 0/1 0/0 0/0 .data @87 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_87[] = "DMAErrorHandler(): An error occurred while processing DMA.\n";
|
|
#pragma pop
|
|
|
|
/* 803CF5DC-803CF614 02C6FC 0037+01 0/1 0/0 0/0 .data @88 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_88[] = "The following errors have been detected and cleared :\n";
|
|
#pragma pop
|
|
|
|
/* 803CF614-803CF654 02C734 003F+01 0/1 0/0 0/0 .data @89 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_89[] =
|
|
"\t- Requested a locked cache tag that was already in the cache\n";
|
|
#pragma pop
|
|
|
|
/* 803CF654-803CF680 02C774 0029+03 0/1 0/0 0/0 .data @90 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_90[] = "\t- DMA attempted to access normal cache\n";
|
|
#pragma pop
|
|
|
|
/* 803CF680-803CF6A0 02C7A0 001D+03 0/1 0/0 0/0 .data @91 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_91[] = "\t- DMA missed in data cache\n";
|
|
#pragma pop
|
|
|
|
/* 803CF6A0-803CF6BC 02C7C0 0019+03 0/1 0/0 0/0 .data @92 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_92[] = "\t- DMA queue overflowed\n";
|
|
#pragma pop
|
|
|
|
/* 8033B990-8033BAF0 3362D0 0160+00 1/1 0/0 0/0 .text DMAErrorHandler */
|
|
#pragma push
|
|
#pragma optimization_level 0
|
|
#pragma optimizewithasm off
|
|
static asm void DMAErrorHandler(s32 error, OSContext* context) {
|
|
nofralloc
|
|
#include "asm/dolphin/os/OSCache/DMAErrorHandler.s"
|
|
}
|
|
#pragma pop
|
|
|
|
/* ############################################################################################## */
|
|
/* 803CF6BC-803CF6D8 02C7DC 0019+03 0/1 0/0 0/0 .data @104 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_104[] = "L1 i-caches initialized\n";
|
|
#pragma pop
|
|
|
|
/* 803CF6D8-803CF6F4 02C7F8 0019+03 0/1 0/0 0/0 .data @105 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_105[] = "L1 d-caches initialized\n";
|
|
#pragma pop
|
|
|
|
/* 803CF6F4-803CF70C 02C814 0016+02 0/1 0/0 0/0 .data @106 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_106[] = "L2 cache initialized\n";
|
|
#pragma pop
|
|
|
|
/* 803CF70C-803CF740 02C82C 002E+06 0/1 0/0 0/0 .data @107 */
|
|
#pragma push
|
|
#pragma force_active on
|
|
SECTION_DATA static char lit_107[] = "Locked cache machine check handler installed\n";
|
|
#pragma pop
|
|
|
|
/* 8033BAF0-8033BBE4 336430 00F4+00 0/0 2/2 0/0 .text __OSCacheInit */
|
|
#pragma push
|
|
#pragma optimization_level 0
|
|
#pragma optimizewithasm off
|
|
asm void __OSCacheInit(void) {
|
|
nofralloc
|
|
#include "asm/dolphin/os/OSCache/__OSCacheInit.s"
|
|
}
|
|
#pragma pop
|