Skip to content

Commit

Permalink
Fix multiple bugs reported on GbaTemp. AGB and TWL are no longer requ…
Browse files Browse the repository at this point in the history
…ired to boot and lack thereof shouldn't cause explosions.
  • Loading branch information
chaoskagami committed Jun 4, 2016
1 parent 06ac9ca commit acd129e
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 83 deletions.
45 changes: 0 additions & 45 deletions README.dev.txt

This file was deleted.

1 change: 1 addition & 0 deletions host/copy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ mount ${dev}1 $mnt || exit 0
cp out/arm9loaderhax.bin $mnt/anim/boot/none.bin || exit 0
cp out/arm9loaderhax.bin $mnt/anim/boot/r.bin || exit 0
cp out/arm9loaderhax.bin $mnt/anim/boot/l.bin || exit 0
rm -rf $mnt/corbenik
cp -r out/corbenik $mnt/ || exit 0
cp -r input/corbenik $mnt/ || exit 0
umount $mnt || exit 0
Expand Down
52 changes: 27 additions & 25 deletions source/firm/firm.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ slot0x11key96_init()
// 9.6 crypto may need us to get the key from somewhere else.
// Unless the console already has the key initialized, that is.
uint8_t key[AES_BLOCK_SIZE];
if (read_file(key, PATH_SLOT0X11KEY96, AES_BLOCK_SIZE) || read_file(key, PATH_ALT_SLOT0X11KEY96, AES_BLOCK_SIZE)) {
if (read_file(key, PATH_SLOT0X11KEY96, AES_BLOCK_SIZE) != 0 || read_file(key, PATH_ALT_SLOT0X11KEY96, AES_BLOCK_SIZE) != 0) {
// Read key successfully.
aes_setkey(0x11, key, AES_KEYNORMAL, AES_INPUT_BE | AES_INPUT_NORMAL);

Expand Down Expand Up @@ -148,7 +148,7 @@ load_firm(firm_h *dest, char *path, char *path_firmkey, uint32_t *size, uint64_t
int status = 0;
int firmware_changed = 0;

if (read_file(dest, path, *size)) {
if (read_file(dest, path, *size) == 0) {
fprintf(BOTTOM_SCREEN, "!");

// Only whine about this if it's NATIVE_FIRM, which is important.
Expand All @@ -158,9 +158,10 @@ load_firm(firm_h *dest, char *path, char *path_firmkey, uint32_t *size, uint64_t
"This is fatal. Aborting.\n");
}

status = 1;
goto exit_error;
}
return 1;
} else {
fprintf(BOTTOM_SCREEN, "l");
}

// Check and decrypt FIRM if it is encrypted.
if (dest->magic != FIRM_MAGIC) {
Expand All @@ -169,8 +170,7 @@ load_firm(firm_h *dest, char *path, char *path_firmkey, uint32_t *size, uint64_t
if (firm_title == NATIVE_FIRM_TITLEID) {
fprintf(BOTTOM_SCREEN, "\nFailed to decrypt firmware.\n"
"This is fatal. Aborting.\n");
status = 1;
goto exit_error;
return 1;
}
}
firmware_changed = 1; // Decryption performed.
Expand Down Expand Up @@ -199,8 +199,7 @@ load_firm(firm_h *dest, char *path, char *path_firmkey, uint32_t *size, uint64_t
fprintf(BOTTOM_SCREEN, "\nCouldn't decrypt ARM9 FIRM binary.\n"
"Check if you have the needed key at:\n"
" " PATH_SLOT0X11KEY96 "\n");
status = 1;
goto exit_error;
return 1;
}
firmware_changed = 1; // Decryption of arm9bin performed.
} else {
Expand Down Expand Up @@ -238,10 +237,6 @@ load_firm(firm_h *dest, char *path, char *path_firmkey, uint32_t *size, uint64_t
}

return 0;

exit_error:

return status;
}

// FAIR WARNING; This function is arm11 code, not ARM9.
Expand Down Expand Up @@ -347,33 +342,40 @@ int firm_loaded = 0;
int
load_firms()
{
int state = 0;

if (firm_loaded)
return 0;

fprintf(BOTTOM_SCREEN, "FIRM load triggered.\n");

fprintf(BOTTOM_SCREEN, "NATIVE_FIRM\n [");
if (load_firm(firm_loc, PATH_NATIVE_F, PATH_NATIVE_FIRMKEY, &firm_size, NATIVE_FIRM_TITLEID) != 0)
return 1;
if (load_firm(firm_loc, PATH_NATIVE_F, PATH_NATIVE_FIRMKEY, &firm_size, NATIVE_FIRM_TITLEID) != 0) {
abort("]\n Failed to load NATIVE_FIRM.\n");
}
find_proc9(firm_loc, &firm_proc9, &firm_p9_exefs);

fprintf(BOTTOM_SCREEN, "]\nTWL_FIRM\n [");
if (load_firm(twl_firm_loc, PATH_TWL_F, PATH_TWL_FIRMKEY, &twl_firm_size, TWL_FIRM_TITLEID))
fprintf(BOTTOM_SCREEN, " \nTWL_FIRM failed to load.\n");
else
if (load_firm(twl_firm_loc, PATH_TWL_F, PATH_TWL_FIRMKEY, &twl_firm_size, TWL_FIRM_TITLEID) != 0) {
fprintf(BOTTOM_SCREEN, "]\n TWL_FIRM failed to load.\n");
state =1;
} else {
fprintf(stderr, "]\n");
find_proc9(twl_firm_loc, &twl_firm_proc9, &twl_firm_p9_exefs);
}

fprintf(BOTTOM_SCREEN, "]\nAGB_FIRM\n [");
if (load_firm(agb_firm_loc, PATH_AGB_F, PATH_AGB_FIRMKEY, &agb_firm_size, AGB_FIRM_TITLEID))
fprintf(BOTTOM_SCREEN, " \nAGB_FIRM failed to load.\n");
else
fprintf(BOTTOM_SCREEN, "AGB_FIRM\n [");
if (load_firm(agb_firm_loc, PATH_AGB_F, PATH_AGB_FIRMKEY, &agb_firm_size, AGB_FIRM_TITLEID) != 0) {
fprintf(BOTTOM_SCREEN, "]\n AGB_FIRM failed to load.\n");
state = 1;
} else {
fprintf(stderr, "]\n");
find_proc9(agb_firm_loc, &agb_firm_proc9, &agb_firm_p9_exefs);

fprintf(BOTTOM_SCREEN, "]\n");
}

firm_loaded = 1; // Loaded.

return 0;
return state;
}

void
Expand Down
8 changes: 6 additions & 2 deletions source/firm/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -71,16 +71,20 @@ struct firm_signature firm_signatures[] = {
.version = 0x00,
.version_string = "9.0.0_AGB",
.console = console_n3ds },
{.version = 0xFF } // Terminate list
{.version = 0xFF,
.version_string = "Not found" } // Terminate list
};

struct firm_signature *
get_firm_info(firm_h *firm)
{
for (struct firm_signature *signature = firm_signatures; signature->version != 0xFF; signature++) {
for (struct firm_signature *signature = firm_signatures; ; signature++) {
if (memcmp(signature->sig, firm->section[0].hash, 0x10) == 0) {
return signature;
}
if (signature->version == 0xFF) {
return signature; // Error. Not found, invalid, etc.
}
}

return NULL;
Expand Down
4 changes: 4 additions & 0 deletions source/interp.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,10 @@ execb(char *filename, int build_cache)
// Read patch to scrap memory.

FILE *f = fopen(filename, "r");
if (!f) {
// File wasn't found. The user didn't enable anything.
return 0;
}
size_t len = fsize(f);
fread((uint8_t *)FCRAM_PATCH_LOC, 1, len, f);
fclose(f);
Expand Down
11 changes: 9 additions & 2 deletions source/menu.c
Original file line number Diff line number Diff line change
Expand Up @@ -151,12 +151,18 @@ int list_patches_build_back(char* fpath, int desc_is_path) {
void list_patches_build(char* name, int desc_is_fname) {
current_menu_index_patches = 0;

memset(enable_list, 0, FCRAM_SPACING / 2);

char fpath[256];
strncpy(fpath, name, 256);
list_patches_build_back(fpath, desc_is_fname);
patches[current_menu_index_patches].index = -1;

read_file(enable_list, PATH_TEMP "/PATCHENABLE", FCRAM_SPACING / 2);
FILE* f;
if ((f = fopen(PATH_TEMP "/PATCHENABLE", "r"))) {
fread(enable_list, 1, FCRAM_SPACING / 2, f);
fclose(f);
}
}

int show_menu(struct options_s *options, uint8_t* toggles);
Expand Down Expand Up @@ -207,7 +213,8 @@ menu_info()
" Version: %s (%x)\n"
"TWL_FIRM / DSi Firmware:\n"
" Version: %s (%x)\n",
native->version_string, native->version, agb->version_string, agb->version, twl->version_string, twl->version);
native->version_string, native->version, agb->version_string, agb->version, twl->version_string, twl->version);

wait_key();

need_redraw = 1;
Expand Down
36 changes: 27 additions & 9 deletions source/std/fs.c
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,9 @@ fopen(const char *filename, const char *mode)
void
fclose(FILE *fp)
{
if (!fp->is_open)
return;

f_close(&(fp->handle));

memset(fp, 0, sizeof(FILE));
Expand All @@ -116,6 +119,9 @@ fclose(FILE *fp)
void
fseek(FILE *fp, int64_t offset, int whence)
{
if (!fp->is_open)
return;

uint32_t fixed_offset;
switch (whence) {
case SEEK_SET:
Expand All @@ -137,44 +143,56 @@ fseek(FILE *fp, int64_t offset, int whence)
size_t
ftell(FILE *fp)
{
if (!fp->is_open)
return 0;

return f_tell(&(fp->handle));
}

int
feof(FILE *fp)
{
if (!fp->is_open)
return 0;

return f_eof(&(fp->handle));
}

size_t
fsize(FILE *fp)
{
if (!fp->is_open)
return 0;

return f_size(&(fp->handle));
}

size_t
fwrite(const void *buffer, size_t elementSize, size_t elementCnt, FILE *fp)
{
if (!fp->is_open)
return 0;

UINT br;
if (f_write(&(fp->handle), buffer, elementSize * elementCnt, &br))
return 0;
if (br == elementSize * elementCnt)
if (elementSize != 1)
br /= elementSize;
else
return 0;
return br;
}

size_t
fread(void *buffer, size_t elementSize, size_t elementCnt, FILE *fp)
{
UINT br;
if (!fp->is_open)
return 0;

size_t br;
if (f_read(&(fp->handle), buffer, elementSize * elementCnt, &br))
return 0;
if (br == elementSize * elementCnt)

if (elementSize != 1)
br /= elementSize;
else
return 0;
return br;
}

Expand All @@ -183,7 +201,7 @@ write_file(void *data, char *path, size_t size)
{
FILE *temp = fopen(path, "w");

if (!temp)
if (!temp || !temp->is_open)
return 0;

size_t wrote = fwrite(data, 1, size, temp);
Expand All @@ -198,7 +216,7 @@ read_file(void *data, char *path, size_t size)
{
FILE *temp = fopen(path, "r");

if (!temp)
if (!temp || !temp->is_open)
return 0;

size_t read = fread(data, 1, size, temp);
Expand Down

0 comments on commit acd129e

Please sign in to comment.