Fix compiling in devkitARM r51

Use custom (sequential) memcpy for reading / writing hardware registers.
Fixes #460
This commit is contained in:
d0k3 2019-03-13 01:36:33 +01:00
parent 10ec95b8fe
commit 82d6e94789
3 changed files with 13 additions and 11 deletions

View File

@ -20,22 +20,29 @@
(((a) > (b)) ? (a) : (b)) (((a) > (b)) ? (a) : (b))
#define min(a,b) \ #define min(a,b) \
(((a) < (b)) ? (a) : (b)) (((a) < (b)) ? (a) : (b))
#define getbe16(d) \ #define getbe16(d) \
(((d)[0]<<8) | (d)[1]) (((d)[0]<<8) | (d)[1])
#define getbe32(d) \ #define getbe32(d) \
((((u32) getbe16(d))<<16) | ((u32) getbe16(d+2))) ((((u32) getbe16(d))<<16) | ((u32) getbe16(d+2)))
#define getbe64(d) \ #define getbe64(d) \
((((u64) getbe32(d))<<32) | ((u64) getbe32(d+4))) ((((u64) getbe32(d))<<32) | ((u64) getbe32(d+4)))
#define getle16(d) \ #define getle16(d) \
(((d)[1]<<8) | (d)[0]) (((d)[1]<<8) | (d)[0])
#define getle32(d) \ #define getle32(d) \
((((u32) getle16(d+2))<<16) | ((u32) getle16(d))) ((((u32) getle16(d+2))<<16) | ((u32) getle16(d)))
#define getle64(d) \ #define getle64(d) \
((((u64) getle32(d+4))<<32) | ((u64) getle32(d))) ((((u64) getle32(d+4))<<32) | ((u64) getle32(d)))
#define align(v,a) \ #define align(v,a) \
(((v) % (a)) ? ((v) + (a) - ((v) % (a))) : (v)) (((v) % (a)) ? ((v) + (a) - ((v) % (a))) : (v))
#define countof(x) \ #define countof(x) \
(sizeof(x) / sizeof((x)[0])) (sizeof(x) / sizeof((x)[0]))
#define seqmemcpy(d,o,s) \
for(u32 i = 0; i < (s); i++) ((u8*)(void*)(d))[i] = ((u8*)(void*)(o))[i]
#define bkpt \ #define bkpt \
asm("bkpt\n\t") asm("bkpt\n\t")

View File

@ -76,7 +76,7 @@ bool RSA_setKey2048(u8 keyslot, const u8 *const mod, u32 exp)
REG_RSA_EXP[(0x100>>2) - 1] = exp; REG_RSA_EXP[(0x100>>2) - 1] = exp;
if(slot->REG_RSA_SLOTSIZE != RSA_SLOTSIZE_2048) return false; if(slot->REG_RSA_SLOTSIZE != RSA_SLOTSIZE_2048) return false;
memcpy((void*)REG_RSA_MOD, mod, 0x100); seqmemcpy((void*)REG_RSA_MOD, mod, 0x100);
return true; return true;
} }
@ -88,11 +88,11 @@ bool RSA_decrypt2048(void *const decSig, const void *const encSig)
if(!(rsaSlots[keyslot].REG_RSA_SLOTCNT & RSA_KEY_STAT_SET)) return false; if(!(rsaSlots[keyslot].REG_RSA_SLOTCNT & RSA_KEY_STAT_SET)) return false;
REG_RSA_CNT |= RSA_INPUT_NORMAL | RSA_INPUT_BIG; REG_RSA_CNT |= RSA_INPUT_NORMAL | RSA_INPUT_BIG;
memcpy((void*)REG_RSA_TXT, encSig, 0x100); seqmemcpy((void*)REG_RSA_TXT, encSig, 0x100);
REG_RSA_CNT |= RSA_ENABLE; REG_RSA_CNT |= RSA_ENABLE;
rsaWaitBusy(); rsaWaitBusy();
memcpy(decSig, (void*)REG_RSA_TXT, 0x100); seqmemcpy(decSig, (void*)REG_RSA_TXT, 0x100);
return true; return true;
} }

View File

@ -1,10 +1,5 @@
#include "sha.h" #include "sha.h"
typedef struct
{
u32 data[16];
} _sha_block;
void sha_init(u32 mode) void sha_init(u32 mode)
{ {
while(*REG_SHACNT & 1); while(*REG_SHACNT & 1);
@ -17,12 +12,12 @@ void sha_update(const void* src, u32 size)
while(size >= 0x40) { while(size >= 0x40) {
while(*REG_SHACNT & 1); while(*REG_SHACNT & 1);
*((_sha_block*)REG_SHAINFIFO) = *((const _sha_block*)src32); seqmemcpy((void*)REG_SHAINFIFO, src32, 0x40);
src32 += 16; src32 += 16;
size -= 0x40; size -= 0x40;
} }
while(*REG_SHACNT & 1); while(*REG_SHACNT & 1);
if(size) memcpy((void*)REG_SHAINFIFO, src32, size); if(size) seqmemcpy((void*)REG_SHAINFIFO, src32, size);
} }
void sha_get(void* res) { void sha_get(void* res) {
@ -31,7 +26,7 @@ void sha_get(void* res) {
*REG_SHACNT = (*REG_SHACNT & ~SHA_NORMAL_ROUND) | SHA_FINAL_ROUND; *REG_SHACNT = (*REG_SHACNT & ~SHA_NORMAL_ROUND) | SHA_FINAL_ROUND;
while(*REG_SHACNT & SHA_FINAL_ROUND); while(*REG_SHACNT & SHA_FINAL_ROUND);
while(*REG_SHACNT & 1); while(*REG_SHACNT & 1);
if (hash_size) memcpy(res, (void*)REG_SHAHASH, hash_size); if (hash_size) seqmemcpy(res, (void*)REG_SHAHASH, hash_size);
} }
void sha_quick(void* res, const void* src, u32 size, u32 mode) { void sha_quick(void* res, const void* src, u32 size, u32 mode) {