combat AES overflowing and/or getting stuck
This commit is contained in:
parent
dcae9788e5
commit
3807c9bf5b
|
@ -207,6 +207,9 @@ void WriteBlkCnt(u32 val)
|
|||
u32 ReadOutputFIFO()
|
||||
{
|
||||
u32 ret = OutputFIFO->Read();
|
||||
|
||||
CheckInputDMA();
|
||||
CheckOutputDMA();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -218,28 +221,7 @@ void WriteInputFIFO(u32 val)
|
|||
|
||||
if (!(Cnt & (1<<31))) return;
|
||||
|
||||
while (InputFIFO->Level() >= 4 && 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--;
|
||||
}
|
||||
|
||||
if (OutputFIFO->Level() >= OutputDMASize)
|
||||
{
|
||||
// trigger output DMA
|
||||
DSi::CheckNDMAs(1, 0x2B);
|
||||
}
|
||||
Update();
|
||||
|
||||
if (RemBlocks == 0)
|
||||
{
|
||||
|
@ -261,6 +243,39 @@ void CheckInputDMA()
|
|||
// trigger input DMA
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -37,6 +37,8 @@ void WriteBlkCnt(u32 val);
|
|||
u32 ReadOutputFIFO();
|
||||
void WriteInputFIFO(u32 val);
|
||||
void CheckInputDMA();
|
||||
void CheckOutputDMA();
|
||||
void Update();
|
||||
|
||||
void WriteIV(u32 offset, u32 val, u32 mask);
|
||||
void WriteMAC(u32 offset, u32 val, u32 mask);
|
||||
|
|
|
@ -129,7 +129,7 @@ void DSi_NDMA::Start()
|
|||
if (Cnt & (1<<12)) CurDstAddr = DstAddr;
|
||||
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);
|
||||
|
||||
|
@ -307,6 +307,7 @@ void DSi_NDMA::Run7()
|
|||
NDS::ResumeCPU(1, 1<<(Num+4));
|
||||
|
||||
DSi_AES::CheckInputDMA();
|
||||
DSi_AES::CheckOutputDMA();
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -331,4 +332,5 @@ void DSi_NDMA::Run7()
|
|||
NDS::ResumeCPU(1, 1<<(Num+4));
|
||||
|
||||
DSi_AES::CheckInputDMA();
|
||||
DSi_AES::CheckOutputDMA();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue