From 82d6e947894ac6c0d3611b4938778327c986d18e Mon Sep 17 00:00:00 2001 From: d0k3 Date: Wed, 13 Mar 2019 01:36:33 +0100 Subject: [PATCH] Fix compiling in devkitARM r51 Use custom (sequential) memcpy for reading / writing hardware registers. Fixes #460 --- arm9/source/common/common.h | 7 +++++++ arm9/source/crypto/rsa.c | 6 +++--- arm9/source/crypto/sha.c | 11 +++-------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/arm9/source/common/common.h b/arm9/source/common/common.h index 19b682d..39f3023 100644 --- a/arm9/source/common/common.h +++ b/arm9/source/common/common.h @@ -20,22 +20,29 @@ (((a) > (b)) ? (a) : (b)) #define min(a,b) \ (((a) < (b)) ? (a) : (b)) + #define getbe16(d) \ (((d)[0]<<8) | (d)[1]) #define getbe32(d) \ ((((u32) getbe16(d))<<16) | ((u32) getbe16(d+2))) #define getbe64(d) \ ((((u64) getbe32(d))<<32) | ((u64) getbe32(d+4))) + #define getle16(d) \ (((d)[1]<<8) | (d)[0]) #define getle32(d) \ ((((u32) getle16(d+2))<<16) | ((u32) getle16(d))) #define getle64(d) \ ((((u64) getle32(d+4))<<32) | ((u64) getle32(d))) + #define align(v,a) \ (((v) % (a)) ? ((v) + (a) - ((v) % (a))) : (v)) + #define countof(x) \ (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 \ asm("bkpt\n\t") diff --git a/arm9/source/crypto/rsa.c b/arm9/source/crypto/rsa.c index 5c7bff7..753e1c7 100644 --- a/arm9/source/crypto/rsa.c +++ b/arm9/source/crypto/rsa.c @@ -76,7 +76,7 @@ bool RSA_setKey2048(u8 keyslot, const u8 *const mod, u32 exp) REG_RSA_EXP[(0x100>>2) - 1] = exp; 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; } @@ -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; 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; rsaWaitBusy(); - memcpy(decSig, (void*)REG_RSA_TXT, 0x100); + seqmemcpy(decSig, (void*)REG_RSA_TXT, 0x100); return true; } diff --git a/arm9/source/crypto/sha.c b/arm9/source/crypto/sha.c index 7173d61..8e09ddd 100644 --- a/arm9/source/crypto/sha.c +++ b/arm9/source/crypto/sha.c @@ -1,10 +1,5 @@ #include "sha.h" -typedef struct -{ - u32 data[16]; -} _sha_block; - void sha_init(u32 mode) { while(*REG_SHACNT & 1); @@ -17,12 +12,12 @@ void sha_update(const void* src, u32 size) while(size >= 0x40) { while(*REG_SHACNT & 1); - *((_sha_block*)REG_SHAINFIFO) = *((const _sha_block*)src32); + seqmemcpy((void*)REG_SHAINFIFO, src32, 0x40); src32 += 16; size -= 0x40; } 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) { @@ -31,7 +26,7 @@ void sha_get(void* res) { *REG_SHACNT = (*REG_SHACNT & ~SHA_NORMAL_ROUND) | SHA_FINAL_ROUND; while(*REG_SHACNT & SHA_FINAL_ROUND); 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) {