Use <string.h> & <3ds/exheader.h>, fix some bugs, etc.

also fix all warnings and use -Werror
This commit is contained in:
TuxSH
2018-05-24 00:55:38 +02:00
parent e6b7dc1dc5
commit d28e961adc
85 changed files with 276 additions and 643 deletions

View File

@@ -54,9 +54,9 @@ INCLUDES := include
ARCH := -marm -march=armv5te -mtune=arm946e-s
DEFINES := -DARM9 -D_3DS
CFLAGS := -g -std=gnu11 -Wall -Wextra -O2 -mword-relocations \
CFLAGS := -g -std=gnu11 -Wall -Wextra -Werror -O2 -mword-relocations \
-fomit-frame-pointer -ffunction-sections -fdata-sections \
-Wno-main -fno-builtin $(ARCH) $(DEFINES)
-Wno-main $(ARCH) $(DEFINES)
CFLAGS += $(INCLUDE)

View File

@@ -30,21 +30,21 @@
#pragma once
typedef struct __attribute__((packed))
typedef struct
{
u32 address;
u32 phyRegionSize;
u32 size;
} CodeSetInfo;
typedef struct __attribute__((packed))
typedef struct
{
u32 saveDataSize[2];
u32 jumpID[2];
u8 reserved[0x30];
} SystemInfo;
typedef struct __attribute__((packed))
typedef struct
{
char appTitle[8];
u8 reserved1[5];
@@ -60,7 +60,7 @@ typedef struct __attribute__((packed))
SystemInfo systemInfo;
} SystemControlInfo;
typedef struct __attribute__((packed))
typedef struct
{
SystemControlInfo systemControlInfo;
u8 aci[0x200];
@@ -69,7 +69,7 @@ typedef struct __attribute__((packed))
u8 aciLim[0x200];
} ExHeader;
typedef struct __attribute__((packed))
typedef struct
{
u8 sig[0x100]; //RSA-2048 signature of the NCCH header, using SHA-256
char magic[4]; //NCCH
@@ -102,13 +102,13 @@ typedef struct __attribute__((packed))
u8 romFsHash[0x20]; //RomFS superblock SHA-256 hash
} Ncch;
typedef struct __attribute__((packed))
typedef struct
{
Ncch ncch;
ExHeader exHeader;
} Cxi;
typedef struct __attribute__((packed))
typedef struct
{
char sigIssuer[0x40];
u8 eccPubKey[0x3C];
@@ -134,7 +134,7 @@ typedef struct __attribute__((packed))
u8 contentIndex[0xAC];
} Ticket;
typedef struct __attribute__((packed))
typedef struct
{
u32 offset;
u8 *address;
@@ -143,7 +143,7 @@ typedef struct __attribute__((packed))
u8 hash[0x20];
} FirmSection;
typedef struct __attribute__((packed))
typedef struct
{
char magic[4];
u32 reserved1;
@@ -153,7 +153,7 @@ typedef struct __attribute__((packed))
FirmSection section[4];
} Firm;
typedef struct __attribute__((packed))
typedef struct
{
u8 keyX[0x10];
u8 keyY[0x10];

View File

@@ -27,7 +27,6 @@
#include "config.h"
#include "memory.h"
#include "fs.h"
#include "strings.h"
#include "utils.h"
#include "screen.h"
#include "draw.h"
@@ -237,8 +236,8 @@ void configMenu(bool oldPinStatus, u32 oldPinMode)
u32 multiOptionsAmount = sizeof(multiOptions) / sizeof(struct multiOption),
singleOptionsAmount = sizeof(singleOptions) / sizeof(struct singleOption),
totalIndexes = multiOptionsAmount + singleOptionsAmount - 1,
selectedOption,
singleSelected;
selectedOption = 0,
singleSelected = 0;
bool isMultiOption = false;
//Parse the existing options

View File

@@ -34,7 +34,6 @@
#include "crypto.h"
#include "memory.h"
#include "emunand.h"
#include "strings.h"
#include "utils.h"
#include "alignedseqmemcpy.h"
#include "fatfs/sdmmc/sdmmc.h"
@@ -581,6 +580,11 @@ void kernel9Loader(Arm9Bin *arm9Section)
u8 arm9BinSlot = k9lVersion == 0 ? 0x15 : 0x16;
// Get size
u32 arm9SectionSize = 0;
for(u32 i = 0; i < 8; i++)
arm9SectionSize = (arm9Section->size[i] - '0') + 10*arm9SectionSize;
//Set keyX
__attribute__((aligned(4))) u8 keyX[AES_BLOCK_SIZE];
aes_use_keyslot(0x11);
@@ -598,7 +602,7 @@ void kernel9Loader(Arm9Bin *arm9Section)
//Decrypt ARM9 binary
aes_use_keyslot(arm9BinSlot);
aes(startOfArm9Bin, startOfArm9Bin, decAtoi(arm9Section->size, sizeof(arm9Section->size)) / AES_BLOCK_SIZE, arm9BinCtr, AES_CTR_MODE, AES_INPUT_BE | AES_INPUT_NORMAL);
aes(startOfArm9Bin, startOfArm9Bin, arm9SectionSize / AES_BLOCK_SIZE, arm9BinCtr, AES_CTR_MODE, AES_INPUT_BE | AES_INPUT_NORMAL);
if(*startOfArm9Bin != 0x47704770 && *startOfArm9Bin != 0xB0862000) error("Failed to decrypt the ARM9 binary.");
}

View File

@@ -30,7 +30,7 @@
*/
#include "draw.h"
#include "strings.h"
#include "memory.h"
#include "screen.h"
#include "utils.h"
#include "fs.h"

View File

@@ -26,7 +26,6 @@
#include "exceptions.h"
#include "fs.h"
#include "strings.h"
#include "memory.h"
#include "screen.h"
#include "draw.h"
@@ -134,16 +133,16 @@ void detectAndProcessExceptionDumps(void)
for(u32 i = 0; i < 17; i += 2)
{
posY = drawFormattedString(true, 10, posY + SPACING_Y, COLOR_WHITE, "%-7s%08X", registerNames[i], regs[i]);
posY = drawFormattedString(true, 10, posY + SPACING_Y, COLOR_WHITE, "%-7s%08lx", registerNames[i], regs[i]);
if(i != 16)
posY = drawFormattedString(true, 10 + 22 * SPACING_X, posY, COLOR_WHITE, "%-7s%08X", registerNames[i + 1], regs[i + 1]);
posY = drawFormattedString(true, 10 + 22 * SPACING_X, posY, COLOR_WHITE, "%-7s%08lx", registerNames[i + 1], regs[i + 1]);
else if(dumpHeader->processor == 11)
posY = drawFormattedString(true, 10 + 22 * SPACING_X, posY, COLOR_WHITE, "%-7s%08X", registerNames[i + 1], regs[20]);
posY = drawFormattedString(true, 10 + 22 * SPACING_X, posY, COLOR_WHITE, "%-7s%08lx", registerNames[i + 1], regs[20]);
}
if(dumpHeader->processor == 11 && dumpHeader->type == 3)
posY = drawFormattedString(true, 10, posY + SPACING_Y, COLOR_WHITE, "%-7s%08X Access type: %s", "FAR", regs[19], regs[17] & (1u << 11) ? "Write" : "Read");
posY = drawFormattedString(true, 10, posY + SPACING_Y, COLOR_WHITE, "%-7s%08lx Access type: %s", "FAR", regs[19], regs[17] & (1u << 11) ? "Write" : "Read");
posY += SPACING_Y;
@@ -155,7 +154,7 @@ void detectAndProcessExceptionDumps(void)
for(u32 line = 0; line < 19 && stackDump < additionalData; line++)
{
posYBottom = drawFormattedString(false, 10, posYBottom + SPACING_Y, COLOR_WHITE, "%08X:", regs[13] + 8 * line);
posYBottom = drawFormattedString(false, 10, posYBottom + SPACING_Y, COLOR_WHITE, "%08lx:", regs[13] + 8 * line);
for(u32 i = 0; i < 8 && stackDump < additionalData; i++, stackDump++)
drawFormattedString(false, 10 + 10 * SPACING_X + 3 * i * SPACING_X, posYBottom, COLOR_WHITE, "%02X", *stackDump);
@@ -171,9 +170,9 @@ void detectAndProcessExceptionDumps(void)
drawString(true, 10, posY + SPACING_Y, COLOR_BLACK, choiceMessage[0]);
drawString(true, 10, posY + SPACING_Y + SPACING_Y , COLOR_BLACK, choiceMessage[1]);
char folderPath[12],
path[36],
fileName[24];
char folderPath[32],
path[128],
fileName[32];
sprintf(folderPath, "dumps/arm%u", dumpHeader->processor);
findDumpFile(folderPath, fileName);
@@ -191,6 +190,6 @@ void detectAndProcessExceptionDumps(void)
waitInput(false);
exit:
memset32((void *)dumpHeader, 0, dumpHeader->totalSize);
memset((void *)dumpHeader, 0, dumpHeader->totalSize);
mcuPowerOff();
}

View File

@@ -31,7 +31,6 @@
#include "exceptions.h"
#include "patches.h"
#include "memory.h"
#include "strings.h"
#include "cache.h"
#include "emunand.h"
#include "crypto.h"

View File

@@ -59,7 +59,7 @@ This code is based on a file that contains the following:
//TuxSH's changes: add support for 64-bit numbers, remove floating-point code
#include "strings.h"
#include "memory.h"
#include "fmt.h"
#define ZEROPAD (1<<0) //Pad with zero
@@ -148,7 +148,7 @@ static char *processNumber(char *str, s64 num, bool isHex, s32 size, s32 precisi
return str;
}
u32 vsprintf(char *buf, const char *fmt, va_list args)
int vsprintf(char *buf, const char *fmt, va_list args)
{
char *str;
@@ -306,14 +306,14 @@ u32 vsprintf(char *buf, const char *fmt, va_list args)
}
*str = 0;
return str - buf;
return (int)(str - buf);
}
u32 sprintf(char *buf, const char *fmt, ...)
int sprintf(char *buf, const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
u32 res = vsprintf(buf, fmt, args);
int res = vsprintf(buf, fmt, args);
va_end(args);
return res;
}

View File

@@ -28,5 +28,5 @@
#include "memory.h"
#include <stdarg.h>
u32 vsprintf(char *buf, const char *fmt, va_list args);
u32 sprintf(char *buf, const char *fmt, ...);
int vsprintf(char *buf, const char *fmt, va_list args);
int sprintf(char *buf, const char *fmt, ...);

View File

@@ -26,7 +26,6 @@
#include "fs.h"
#include "memory.h"
#include "strings.h"
#include "fmt.h"
#include "crypto.h"
#include "cache.h"
@@ -87,7 +86,7 @@ u32 getFileSize(const char *path)
bool fileWrite(const void *buffer, const char *path, u32 size)
{
FIL file;
FRESULT result;
FRESULT result = FR_OK;
switch(f_open(&file, path, FA_WRITE | FA_OPEN_ALWAYS))
{
@@ -273,7 +272,10 @@ u32 firmRead(void *dest, u32 firmType)
//Not a cxi
if(info.fname[9] != 'a' || strlen(info.fname) != 12) continue;
u32 tempVersion = hexAtoi(info.altname, 8);
u32 tempVersion = 0;
char *tmp = info.fname;
for(u32 i = 0; i < 8 && *tmp != 0; tmp++, i++)
tempVersion = (*tmp > '9' ? (*tmp >= 'A' ? *tmp - 'A' : *tmp - 'a') + 10 : *tmp - '0') + (tempVersion << 4);
//Found an older cxi
if(tempVersion < firmVersion) firmVersion = tempVersion;
@@ -282,7 +284,7 @@ u32 firmRead(void *dest, u32 firmType)
if(f_closedir(&dir) != FR_OK || firmVersion == 0xFFFFFFFF) goto exit;
//Complete the string with the .app name
sprintf(path, "%s/%08x.app", folderPath, firmVersion);
sprintf(path, "%s/%08lx.app", folderPath, firmVersion);
if(fileRead(dest, path, 0x400000 + sizeof(Cxi) + 0x200) <= sizeof(Cxi) + 0x400) firmVersion = 0xFFFFFFFF;
@@ -299,7 +301,7 @@ void findDumpFile(const char *folderPath, char *fileName)
{
FILINFO info;
sprintf(fileName, "crash_dump_%08u.dmp", n);
sprintf(fileName, "crash_dump_%08lu.dmp", n);
result = f_findfirst(&dir, &info, folderPath, fileName);
if(result != FR_OK || !info.fname[0]) break;

View File

@@ -31,7 +31,6 @@
#include "utils.h"
#include "exceptions.h"
#include "draw.h"
#include "strings.h"
#include "buttons.h"
#include "pin.h"
#include "crypto.h"
@@ -336,7 +335,7 @@ boot:
u32 firmVersion = loadNintendoFirm(&firmType, firmSource, loadFromStorage, isSafeMode);
bool doUnitinfoPatch = CONFIG(PATCHUNITINFO);
u32 res;
u32 res = 0;
switch(firmType)
{
case NATIVE_FIRM:

View File

@@ -26,50 +26,11 @@
/*
* Boyer-Moore Horspool algorithm adapted from http://www-igm.univ-mlv.fr/~lecroq/string/node18.html#SECTION00180
* memcpy, memset32 and memcmp adapted from https://github.com/mid-kid/CakesForeveryWan/blob/557a8e8605ab3ee173af6497486e8f22c261d0e2/source/memfuncs.c
* memcpy, memset and memcmp adapted from https://github.com/mid-kid/CakesForeveryWan/blob/557a8e8605ab3ee173af6497486e8f22c261d0e2/source/memfuncs.c
*/
#include "memory.h"
void memcpy(void *dest, const void *src, u32 size)
{
u8 *destc = (u8 *)dest;
const u8 *srcc = (const u8 *)src;
for(u32 i = 0; i < size; i++)
destc[i] = srcc[i];
}
void memset(void *dest, u32 filler, u32 size)
{
u8 *destc = (u8 *)dest;
for(u32 i = 0; i < size; i++)
destc[i] = (u8)filler;
}
void memset32(void *dest, u32 filler, u32 size)
{
u32 *dest32 = (u32 *)dest;
for(u32 i = 0; i < size / 4; i++)
dest32[i] = filler;
}
int memcmp(const void *buf1, const void *buf2, u32 size)
{
const u8 *buf1c = (const u8 *)buf1,
*buf2c = (const u8 *)buf2;
for(u32 i = 0; i < size; i++)
{
int cmp = buf1c[i] - buf2c[i];
if(cmp != 0) return cmp;
}
return 0;
}
u8 *memsearch(u8 *startPos, const void *pattern, u32 size, u32 patternSize)
{
const u8 *patternc = (const u8 *)pattern;

View File

@@ -26,15 +26,11 @@
/*
* Boyer-Moore Horspool algorithm adapted from http://www-igm.univ-mlv.fr/~lecroq/string/node18.html#SECTION00180
* memcpy, memset32 and memcmp adapted from https://github.com/mid-kid/CakesForeveryWan/blob/557a8e8605ab3ee173af6497486e8f22c261d0e2/source/memfuncs.c
*/
#pragma once
#include <string.h>
#include "types.h"
void memcpy(void *dest, const void *src, u32 size);
void memset(void *dest, u32 filler, u32 size) __attribute__((used));
void memset32(void *dest, u32 filler, u32 size);
int memcmp(const void *buf1, const void *buf2, u32 size);
u8 *memsearch(u8 *startPos, const void *pattern, u32 size, u32 patternSize);

View File

@@ -373,7 +373,7 @@ u32 patchTitleInstallMinVersionChecks(u8 *pos, u32 size, u32 firmVersion)
off++;
//Zero out the first TitleID in the list
memset32(off, 0, 8);
memset(off, 0, 8);
return 0;
}

View File

@@ -113,7 +113,7 @@ _start:
mov r1, #0
ldr r2, =__bss_end__
sub r2, r0
bl memset32
bl memset
@ Set additional sections up
ldr r0, =__itcm_start__
@@ -126,9 +126,9 @@ _start:
mov r1, #0
ldr r2, =__itcm_end__
sub r2, r0
bl memset32
bl memset
@ bl __libc_init_array
bl __libc_init_array
mov r0, r9
mov r1, r10

View File

@@ -61,7 +61,7 @@ typedef volatile s64 vs64;
#define ISN3DS (CFG11_SOCINFO & 2)
#define ISDEVUNIT (CFG_UNITINFO != 0)
typedef struct __attribute__((packed))
typedef struct __attribute__((packed, aligned(4)))
{
char magic[4];
u16 formatVersionMajor, formatVersionMinor;
@@ -71,7 +71,7 @@ typedef struct __attribute__((packed))
u32 rosalinaMenuCombo;
} CfgData;
typedef struct __attribute__((packed))
typedef struct
{
char magic[4];
u16 formatVersionMajor, formatVersionMinor;
@@ -80,7 +80,7 @@ typedef struct __attribute__((packed))
u8 hash[32];
} PinData;
typedef struct __attribute__((packed))
typedef struct
{
u32 magic[2];
u16 versionMinor, versionMajor;

View File

@@ -35,7 +35,7 @@
#include "draw.h"
#include "cache.h"
#include "fmt.h"
#include "strings.h"
#include "memory.h"
#include "fs.h"
static void startChrono(void)
@@ -86,8 +86,8 @@ u32 waitInput(bool isMenu)
if(!key)
{
if((!(I2C_readReg(I2C_DEV_MCU, 0xF) & 2) && shouldShellShutdown) ||
(I2C_readReg(I2C_DEV_MCU, 0x10) & 1) == 1) mcuPowerOff();
if((!(I2C_readReg(I2C_DEV_MCU, 0xF) & 2) && shouldShellShutdown) ||
(I2C_readReg(I2C_DEV_MCU, 0x10) & 1) == 1) mcuPowerOff();
oldKey = 0;
dPadDelay = 0;
continue;