From 3807c9bf5b19bbea6eb10c12734a17e0c55b4f51 Mon Sep 17 00:00:00 2001 From: Arisotura Date: Wed, 19 Jun 2019 21:57:08 +0200 Subject: [PATCH] combat AES overflowing and/or getting stuck --- src/DSi_AES.cpp | 59 ++++++++++++++++++++++++++++++------------------ src/DSi_AES.h | 2 ++ src/DSi_NDMA.cpp | 4 +++- 3 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/DSi_AES.cpp b/src/DSi_AES.cpp index b427dcda..9f485195 100644 --- a/src/DSi_AES.cpp +++ b/src/DSi_AES.cpp @@ -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(); } diff --git a/src/DSi_AES.h b/src/DSi_AES.h index 77a44002..5e726cdc 100644 --- a/src/DSi_AES.h +++ b/src/DSi_AES.h @@ -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); diff --git a/src/DSi_NDMA.cpp b/src/DSi_NDMA.cpp index cd84901e..a62904a8 100644 --- a/src/DSi_NDMA.cpp +++ b/src/DSi_NDMA.cpp @@ -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(); }