From f44f717e43883473fc399654c38dabbe5753b2a7 Mon Sep 17 00:00:00 2001 From: chaoskagami Date: Sat, 11 Jun 2016 17:55:40 -0400 Subject: [PATCH] Improve logging, make patch versions lockstep to the current release --- patch/aadowngrade.pco | 2 +- patch/agb_biosscreen.pco | 2 +- patch/agb_sig.pco | 2 +- patch/block_cart_update.pco | 2 +- patch/block_eshop_update.pco | 2 +- patch/block_nim_update.pco | 2 +- patch/errdisp.pco | 2 +- patch/friends_ver.pco | 2 +- patch/memexec.pco | 2 +- patch/mset_str.pco | 2 +- patch/ns_force_menu.pco | 2 +- patch/prot.pco | 2 +- patch/regionfree.pco | 2 +- patch/ro_sigs.pco | 2 +- patch/secinfo_sigs.pco | 2 +- patch/sig.pco | 2 +- patch/twl_fix.pco | 2 +- patch/unitinfo.pco | 2 +- source/firm/firm.c | 6 +- source/interp.c | 162 ++++++++++++++++++++++++++--------- 20 files changed, 145 insertions(+), 59 deletions(-) diff --git a/patch/aadowngrade.pco b/patch/aadowngrade.pco index 6fb4f71..5c163fe 100644 --- a/patch/aadowngrade.pco +++ b/patch/aadowngrade.pco @@ -1,6 +1,6 @@ # $name Title Downgrade Fix # $desc Removes added checks to prevent downgrade (in 11.0) -# $ver 01 +# $ver 09 # $uuid 00 # $flags require diff --git a/patch/agb_biosscreen.pco b/patch/agb_biosscreen.pco index 624902c..a15b354 100644 --- a/patch/agb_biosscreen.pco +++ b/patch/agb_biosscreen.pco @@ -1,6 +1,6 @@ # $name AGB Bootscreen # $desc Force usage of GBA bios in AGB_FIRM. -# $ver 01 +# $ver 09 # $uuid 35 # TODO - Make dynamic. Also broken on O3DS. diff --git a/patch/agb_sig.pco b/patch/agb_sig.pco index 653406a..1646020 100644 --- a/patch/agb_sig.pco +++ b/patch/agb_sig.pco @@ -1,6 +1,6 @@ # $name AGB Signature fix # $desc Patches signatures in AGB_FIRM -# $ver 01 +# $ver 09 # $uuid 39 # TODO - Use proper section. diff --git a/patch/block_cart_update.pco b/patch/block_cart_update.pco index 657590a..210f3f0 100644 --- a/patch/block_cart_update.pco +++ b/patch/block_cart_update.pco @@ -1,7 +1,7 @@ # $name Block Cart Updates # $desc Blocks update checks on cartridges (and also allows region free carts, as a byproduct.) # $title 0004013000008002 -# $ver 01 +# $ver 09 # $uuid 01 rel exe_text diff --git a/patch/block_eshop_update.pco b/patch/block_eshop_update.pco index 426f319..b02f03f 100644 --- a/patch/block_eshop_update.pco +++ b/patch/block_eshop_update.pco @@ -1,7 +1,7 @@ # $name Block eShop Updates # $desc Prevents eShop from checking for system updates. # $title 0004013000002C02 -# $ver 01 +# $ver 09 # $uuid 02 rel exe_text diff --git a/patch/block_nim_update.pco b/patch/block_nim_update.pco index 97c45e7..c162ccf 100644 --- a/patch/block_nim_update.pco +++ b/patch/block_nim_update.pco @@ -1,7 +1,7 @@ # $name Block NIM updates # $desc Prevents NIM from downloading system updates. # $title 0004013000002C02 -# $ver 01 +# $ver 09 # $uuid 03 rel exe_text diff --git a/patch/errdisp.pco b/patch/errdisp.pco index 812c688..07748b0 100644 --- a/patch/errdisp.pco +++ b/patch/errdisp.pco @@ -1,7 +1,7 @@ # $name ErrDisp devmode # $desc Forces ErrDisp into displaying developer info without developer UNITINFO. Doesn't break eShop. # $title 0004003000008A02 -# $ver 01 +# $ver 09 # $uuid 04 # $flags devmode diff --git a/patch/friends_ver.pco b/patch/friends_ver.pco index 1e99c44..a8e16b9 100644 --- a/patch/friends_ver.pco +++ b/patch/friends_ver.pco @@ -1,7 +1,7 @@ # $name Fake Friends module version # $desc Allows going online without the latest firmware. # $title 0004013000003202 -# $ver 01 +# $ver 09 # $uuid 05 # $flags noabort diff --git a/patch/memexec.pco b/patch/memexec.pco index 7fb5b61..566fd72 100644 --- a/patch/memexec.pco +++ b/patch/memexec.pco @@ -1,6 +1,6 @@ # $name ARM11 XN Disable # $desc Disables the XN bit on the ARM11 kernel to allow executing code from all memory. May be unsafe. -# $ver 01 +# $ver 09 # $uuid 06 # $flags devmode diff --git a/patch/mset_str.pco b/patch/mset_str.pco index 9c8ea04..6ee3b44 100644 --- a/patch/mset_str.pco +++ b/patch/mset_str.pco @@ -1,7 +1,7 @@ # $name MSET Version # $desc Replaces 'Ver.' with CFW info. # $title 0004001000021000 0004001000020000 0004001000022000 0004001000026000 0004001000027000 0004001000028000 -# $ver 01 +# $ver 09 # $uuid 07 rel exe_text diff --git a/patch/ns_force_menu.pco b/patch/ns_force_menu.pco index f463260..f2aec05 100644 --- a/patch/ns_force_menu.pco +++ b/patch/ns_force_menu.pco @@ -1,7 +1,7 @@ # $name Force TestMenu # $desc Force NS to boot TestMenu rather than HOME (TestMenu must be installed) # $title 0004013000008002 -# $ver 01 +# $ver 09 # $uuid 1e rel exe_text diff --git a/patch/prot.pco b/patch/prot.pco index 61b4ae0..80e45a9 100644 --- a/patch/prot.pco +++ b/patch/prot.pco @@ -1,6 +1,6 @@ # $name FIRM Protect # $desc Prevents writing FIRM to the NAND during updates. -# $ver 01 +# $ver 09 # $uuid 08 # $flags require diff --git a/patch/regionfree.pco b/patch/regionfree.pco index 67e6202..d361430 100644 --- a/patch/regionfree.pco +++ b/patch/regionfree.pco @@ -1,7 +1,7 @@ # $name Region free HOME # $desc Allows launching installed software from any region. # $title 0004003000008F02 0004003000008202 0004003000009802 000400300000A102 000400300000A902 000400300000B102 -# $ver 01 +# $ver 09 # $uuid 09 rel exe_text diff --git a/patch/ro_sigs.pco b/patch/ro_sigs.pco index e1ef8ad..8f00b74 100644 --- a/patch/ro_sigs.pco +++ b/patch/ro_sigs.pco @@ -1,7 +1,7 @@ # $name RO signature fix # $desc Allows usage of unsigned CRO files. This is useful for romhacks. # $title 0004013000003702 -# $ver 01 +# $ver 09 # $uuid 0a rel exe_text diff --git a/patch/secinfo_sigs.pco b/patch/secinfo_sigs.pco index 3adc642..ae439ae 100644 --- a/patch/secinfo_sigs.pco +++ b/patch/secinfo_sigs.pco @@ -1,7 +1,7 @@ # $name SecureInfo_A Signature Fix # $desc Allows using unsigned or improperly signed SecureInfo_A files. Useful for region changes. # $title 0004013000001702 -# $ver 01 +# $ver 09 # $uuid 0b rel exe_text diff --git a/patch/sig.pco b/patch/sig.pco index 0a8fc23..4774715 100644 --- a/patch/sig.pco +++ b/patch/sig.pco @@ -1,6 +1,6 @@ # $name Signature Fix # $desc Disables signature checks on content. -# $ver 01 +# $ver 09 # $uuid 0c # $flags require diff --git a/patch/twl_fix.pco b/patch/twl_fix.pco index f556ee8..a6f18a5 100644 --- a/patch/twl_fix.pco +++ b/patch/twl_fix.pco @@ -1,6 +1,6 @@ # $name TWL Patches # $desc -# $ver 01 +# $ver 09 # $uuid 34 # TODO - Use proper section diff --git a/patch/unitinfo.pco b/patch/unitinfo.pco index 20e073a..f25807a 100644 --- a/patch/unitinfo.pco +++ b/patch/unitinfo.pco @@ -1,6 +1,6 @@ # $name Developer UNITINFO # $desc Imitates a panda's configuration. For the average user, loader ErrDisp is enough. -# $ver 01 +# $ver 09 # $uuid 0d # $flags devmode diff --git a/source/firm/firm.c b/source/firm/firm.c index d275bdf..b46e506 100644 --- a/source/firm/firm.c +++ b/source/firm/firm.c @@ -395,14 +395,17 @@ load_firms() abort("]\n Failed to load NATIVE_FIRM.\n"); } find_proc9(firm_loc, &firm_proc9, &firm_p9_exefs); + fprintf(stderr, "]\n"); + fprintf(stderr, "Ver: %x, %u\n", get_firm_info(firm_loc)->version, get_firm_info(firm_loc)->console ); - fprintf(BOTTOM_SCREEN, "]\nTWL_FIRM\n ["); + fprintf(BOTTOM_SCREEN, "TWL_FIRM\n ["); if (load_firm(twl_firm_loc, PATH_TWL_F, PATH_TWL_FIRMKEY, PATH_TWL_CETK, &twl_firm_size, TWL_FIRM_TITLEID) != 0) { fprintf(BOTTOM_SCREEN, "]\n TWL_FIRM failed to load.\n"); state = 1; } else { find_proc9(twl_firm_loc, &twl_firm_proc9, &twl_firm_p9_exefs); fprintf(stderr, "]\n"); + fprintf(stderr, "Ver: %x, %u\n", get_firm_info(twl_firm_loc)->version, get_firm_info(twl_firm_loc)->console ); } fprintf(BOTTOM_SCREEN, "AGB_FIRM\n ["); @@ -412,6 +415,7 @@ load_firms() } else { find_proc9(agb_firm_loc, &agb_firm_proc9, &agb_firm_p9_exefs); fprintf(stderr, "]\n"); + fprintf(stderr, "Ver: %x, %u\n", get_firm_info(agb_firm_loc)->version, get_firm_info(agb_firm_loc)->console ); } firm_loaded = 1; // Loaded. diff --git a/source/interp.c b/source/interp.c index a4c600f..6971c12 100644 --- a/source/interp.c +++ b/source/interp.c @@ -149,21 +149,32 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) while (code < end && code >= bytecode) { switch (*code) { case OP_NOP: - if (debug) + if (debug) { log("nop\n"); + } code++; break; case OP_REL: // Change relativity. - if (debug) + if (debug) { +#ifdef LOADER log("rel\n"); +#else + fprintf(stderr, "rel %u\n", *(code+1)); +#endif + } code++; current_mode = &modes[*code]; set_mode = *code; code++; break; case OP_FIND: // Find pattern. - if (debug) + if (debug) { +#ifdef LOADER log("find\n"); +#else + fprintf(stderr, "find %u ...\n", *(code+1)); +#endif + } code += 2; found = 0; new_offset = (uint32_t)memfind(current_mode->memory + offset, current_mode->size - offset, code, *(code - 1)); @@ -175,34 +186,50 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) code += *(code - 1); break; case OP_BACK: - if (debug) + if (debug) { +#ifdef LOADER log("back\n"); +#else + fprintf(stderr, "back %u\n", *(code+1)); +#endif + } code++; offset -= *code; code++; break; case OP_FWD: - if (debug) + if (debug) { +#ifdef LOADER log("fwd\n"); +#else + fprintf(stderr, "fwd %u\n", *(code+1)); +#endif + } code++; offset += *code; - if (offset >= current_mode->size) { - // Went out of bounds. Error. - abort("Fwd overflowed.\n"); - } code++; break; case OP_SET: // Set data. - if (debug) + if (debug) { +#ifdef LOADER log("set\n"); +#else + fprintf(stderr, "set %u, ...\n", *(code+1)); +#endif + } code += 2; memcpy(current_mode->memory + offset, code, *(code - 1)); offset += *(code - 1); code += *(code - 1); break; case OP_TEST: // Test data. - if (debug) + if (debug) { +#ifdef LOADER log("test\n"); +#else + fprintf(stderr, "test %u, ...\n", *(code+1)); +#endif + } code += 2; eq = memcmp(current_mode->memory + offset, code, *(code - 1)); if (eq < 0) @@ -213,77 +240,118 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) code += *(code - 1); break; case OP_JMP: // Jump to offset. - if (debug) - log("jmp\n"); code++; code = bytecode + (code[0] + (code[1] << 8)); + if (debug) { +#ifdef LOADER + log("jmp\n"); +#else + fprintf(stderr, "jmp %u\n", code - bytecode); +#endif + } break; case OP_JMPEQ: // Jump to offset if equal - if (debug) - log("jmpeq\n"); code++; if (eq) code = bytecode + (code[0] + (code[1] << 8)); else code += 2; + if (debug) { +#ifdef LOADER + log("jmpeq\n"); +#else + fprintf(stderr, "jmpeq %u\n", code - bytecode); +#endif + } break; case OP_JMPNE: // Jump to offset if not equal - if (debug) - log("jmpne\n"); code++; if (!eq) code = bytecode + (code[0] + (code[1] << 8)); else code += 2; + if (debug) { +#ifdef LOADER + log("jmpne\n"); +#else + fprintf(stderr, "jmpeq %u\n", code - bytecode); +#endif + } break; case OP_JMPLT: // Jump to offset if less than - if (debug) - log("jmplt\n"); code++; if (lt) code = bytecode + (code[0] + (code[1] << 8)); else code += 2; + if (debug) { +#ifdef LOADER + log("jmplt\n"); +#else + fprintf(stderr, "jmplt %u\n", code - bytecode); +#endif + } break; case OP_JMPGT: // Jump to offset if greater than - if (debug) - log("jmpgt\n"); code++; if (gt) code = bytecode + (code[0] + (code[1] << 8)); else code += 2; + if (debug) { +#ifdef LOADER + log("jmplt\n"); +#else + fprintf(stderr, "jmplt %u\n", code - bytecode); +#endif + } break; case OP_JMPLE: // Jump to offset if less than or equal - if (debug) - log("jmple\n"); code++; if (lt || eq) code = bytecode + (code[0] + (code[1] << 8)); else code += 2; + if (debug) { +#ifdef LOADER + log("jmplt\n"); +#else + fprintf(stderr, "jmplt %u\n", code - bytecode); +#endif + } break; case OP_JMPF: // Jump to offset if pattern found - if (debug) - log("jmpf\n"); code++; if (found) code = bytecode + (code[0] + (code[1] << 8)); else code += 2; + if (debug) { +#ifdef LOADER + log("jmplt\n"); +#else + fprintf(stderr, "jmplt %u\n", code - bytecode); +#endif + } break; case OP_JMPNF: // Jump to offset if pattern NOT found - if (debug) - log("jmpnf\n"); code++; if (!found) code = bytecode + (code[0] + (code[1] << 8)); else code += 2; + if (debug) { +#ifdef LOADER + log("jmplt\n"); +#else + fprintf(stderr, "jmplt %u\n", code - bytecode); +#endif + } break; case OP_CLF: // Clear flags. - if (debug) + if (debug) { log("clf\n"); + } code++; found = gt = lt = eq = 0; break; @@ -294,8 +362,9 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) offset = 0; break; case OP_AND: - if (debug) + if (debug) { log("and\n"); + } code += 2; for (i = 0; i < *(code - 1); i++) { *(current_mode->memory + offset) &= code[i]; @@ -304,8 +373,9 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) code += *(code - 1); break; case OP_OR: - if (debug) + if (debug) { log("or\n"); + } code += 2; for (i = 0; i < *(code - 1); i++) { *(current_mode->memory + offset) |= code[i]; @@ -314,8 +384,9 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) code += *(code - 1); break; case OP_XOR: - if (debug) + if (debug) { log("xor\n"); + } code += 2; for (i = 0; i < *(code - 1); i++) { *(current_mode->memory + offset) ^= code[i]; @@ -324,8 +395,9 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) code += *(code - 1); break; case OP_NOT: - if (debug) + if (debug) { log("not\n"); + } for (i = 0; i < *(code + 1); i++) { *(current_mode->memory + offset) = ~*(current_mode->memory + offset); } @@ -333,8 +405,9 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) code += 2; break; case OP_VER: - if (debug) + if (debug) { log("ver\n"); + } code++; eq = memcmp(&ver, code, 2); if (eq < 0) @@ -345,22 +418,28 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) code += 2; break; case OP_N3DS: - if (debug) + if (debug) { log("n3ds\n"); + } code++; eq = is_n3ds; break; case OP_SEEK: // Jump to offset if greater than or equal - if (debug) - log("seek\n"); code++; offset = code[0] + (code[1] << 8) + (code[2] << 16) + (code[3] << 24); - + if (debug) { +#ifdef LOADER + log("seek\n"); +#else + fprintf(stderr, "seek %u\n", offset); +#endif + } code += 4; break; case OP_NEXT: - if (debug) + if (debug) { log("next\n"); + } found = gt = lt = eq = 0; bytecode = code + 1; @@ -399,8 +478,10 @@ exec_bytecode(uint8_t *bytecode, uint16_t ver, uint32_t len, int debug) } #ifndef LOADER - if (debug) + if (debug) { + fprintf(stderr, " l:%u, g:%u, e:%u, f:%u", lt, gt, eq, found); wait(); + } #endif } @@ -514,7 +595,8 @@ execb(char *filename, int build_cache) // We should generate a cache for loader in a file intended for titleid. uint8_t *title_buf = (uint8_t *)patch + sizeof(struct system_patch); - fprintf(stderr, "patch: %s\n", patch->name); + fprintf(stderr, "patch: %s\n", patch->name); + fprintf(stderr, "version: %u\n", patch->version); for (uint32_t i = 0; i < patch->titles; i++) { char cache_path[] = PATH_LOADER_CACHE "/0000000000000000"; -- 2.39.5