combat AES overflowing and/or getting stuck

This commit is contained in:
Arisotura 2019-06-19 21:57:08 +02:00
parent dcae9788e5
commit 3807c9bf5b
3 changed files with 42 additions and 23 deletions

View File

@ -207,6 +207,9 @@ void WriteBlkCnt(u32 val)
u32 ReadOutputFIFO() u32 ReadOutputFIFO()
{ {
u32 ret = OutputFIFO->Read(); u32 ret = OutputFIFO->Read();
CheckInputDMA();
CheckOutputDMA();
return ret; return ret;
} }
@ -218,28 +221,7 @@ void WriteInputFIFO(u32 val)
if (!(Cnt & (1<<31))) return; if (!(Cnt & (1<<31))) return;
while (InputFIFO->Level() >= 4 && RemBlocks > 0) Update();
{
switch (AESMode)
{
case 2:
case 3: ProcessBlock_CTR(); break;
default:
// dorp
OutputFIFO->Write(InputFIFO->Read());
OutputFIFO->Write(InputFIFO->Read());
OutputFIFO->Write(InputFIFO->Read());
OutputFIFO->Write(InputFIFO->Read());
}
RemBlocks--;
}
if (OutputFIFO->Level() >= OutputDMASize)
{
// trigger output DMA
DSi::CheckNDMAs(1, 0x2B);
}
if (RemBlocks == 0) if (RemBlocks == 0)
{ {
@ -261,6 +243,39 @@ void CheckInputDMA()
// trigger input DMA // trigger input DMA
DSi::CheckNDMAs(1, 0x2A); DSi::CheckNDMAs(1, 0x2A);
} }
Update();
}
void CheckOutputDMA()
{
if (OutputFIFO->Level() >= OutputDMASize)
{
// trigger output DMA
DSi::CheckNDMAs(1, 0x2B);
}
}
void Update()
{
while (InputFIFO->Level() >= 4 && OutputFIFO->Level() <= 12 && RemBlocks > 0)
{
switch (AESMode)
{
case 2:
case 3: ProcessBlock_CTR(); break;
default:
// dorp
OutputFIFO->Write(InputFIFO->Read());
OutputFIFO->Write(InputFIFO->Read());
OutputFIFO->Write(InputFIFO->Read());
OutputFIFO->Write(InputFIFO->Read());
}
RemBlocks--;
}
CheckOutputDMA();
} }

View File

@ -37,6 +37,8 @@ void WriteBlkCnt(u32 val);
u32 ReadOutputFIFO(); u32 ReadOutputFIFO();
void WriteInputFIFO(u32 val); void WriteInputFIFO(u32 val);
void CheckInputDMA(); void CheckInputDMA();
void CheckOutputDMA();
void Update();
void WriteIV(u32 offset, u32 val, u32 mask); void WriteIV(u32 offset, u32 val, u32 mask);
void WriteMAC(u32 offset, u32 val, u32 mask); void WriteMAC(u32 offset, u32 val, u32 mask);

View File

@ -129,7 +129,7 @@ void DSi_NDMA::Start()
if (Cnt & (1<<12)) CurDstAddr = DstAddr; if (Cnt & (1<<12)) CurDstAddr = DstAddr;
if (Cnt & (1<<15)) CurSrcAddr = SrcAddr; if (Cnt & (1<<15)) CurSrcAddr = SrcAddr;
printf("ARM%d NDMA%d %08X %02X %08X->%08X %d bytes, total=%d\n", CPU?7:9, Num, Cnt, StartMode, CurSrcAddr, CurDstAddr, RemCount*4, TotalRemCount*4); //printf("ARM%d NDMA%d %08X %02X %08X->%08X %d bytes, total=%d\n", CPU?7:9, Num, Cnt, StartMode, CurSrcAddr, CurDstAddr, RemCount*4, TotalRemCount*4);
//IsGXFIFODMA = (CPU == 0 && (CurSrcAddr>>24) == 0x02 && CurDstAddr == 0x04000400 && DstAddrInc == 0); //IsGXFIFODMA = (CPU == 0 && (CurSrcAddr>>24) == 0x02 && CurDstAddr == 0x04000400 && DstAddrInc == 0);
@ -307,6 +307,7 @@ void DSi_NDMA::Run7()
NDS::ResumeCPU(1, 1<<(Num+4)); NDS::ResumeCPU(1, 1<<(Num+4));
DSi_AES::CheckInputDMA(); DSi_AES::CheckInputDMA();
DSi_AES::CheckOutputDMA();
} }
return; return;
@ -331,4 +332,5 @@ void DSi_NDMA::Run7()
NDS::ResumeCPU(1, 1<<(Num+4)); NDS::ResumeCPU(1, 1<<(Num+4));
DSi_AES::CheckInputDMA(); DSi_AES::CheckInputDMA();
DSi_AES::CheckOutputDMA();
} }