Permalink
Comparing changes
Open a pull request
- 11 commits
- 10 files changed
- 0 commit comments
- 5 contributors
Unified
Split
Showing
with
140 additions
and 72 deletions.
- +1 −1 NX_Sysmodules
- +1 −1 src/bootloader.c
- +12 −21 src/firmware.c
- +44 −1 src/firmware.h
- +0 −1 src/fs.c
- +16 −0 src/fs.h
- +1 −17 src/hwinit.h
- +45 −26 src/kippatches.c
- +4 −4 src/kippatches/fs.inc
- +16 −0 src/package.h
Submodule NX_Sysmodules
updated
5 files
| +1 −0 | .gitignore | |
| +1 −2 | loader/source/ldr_main.cpp | |
| +11 −1 | loader/source/ldr_npdm.cpp | |
| +11 −1 | loader/source/ldr_nso.cpp | |
| +0 −7 | pm/source/pm_main.cpp |
| @@ -1,5 +1,5 @@ | ||
| /* | ||
| * Copyright (c) 2018 Reisyukaku | ||
| * Copyright (c) 2018 Reisyukaku, naehrwert | ||
| * | ||
| * This program is free software; you can redistribute it and/or modify it | ||
| * under the terms and conditions of the GNU General Public License, | ||
| @@ -25,22 +25,10 @@ | ||
| #include "firmware.h" | ||
| #include "kippatches.h" | ||
| #define VERSION "v0.1" | ||
| #define VERSION "v1.0" | ||
| static pk11_offs *pk11Offs = NULL; | ||
| // TODO: Maybe find these with memsearch | ||
| static const pk11_offs _pk11_offs[] = { | ||
| //{ "20161121183008", 0, 0x1900, 0x3FE0, { 2, 1, 0 }, 0x4002B020, 0x8000D000, 1 }, //TODO: relocator patch for 1.0.0 | ||
| { "20161121183008", 0, 0x1900, 0x3FE0, { 2, 1, 0 }, 0x40014020, 0x8000D000, 1 }, //1.0.0 | ||
| { "20170210155124", 0, 0x1900, 0x3FE0, { 0, 1, 2 }, 0x4002D000, 0x8000D000, 1 }, //2.0.0 - 2.3.0 | ||
| { "20170519101410", 1, 0x1A00, 0x3FE0, { 0, 1, 2 }, 0x4002D000, 0x8000D000, 1 }, //3.0.0 | ||
| { "20170710161758", 2, 0x1A00, 0x3FE0, { 0, 1, 2 }, 0x4002D000, 0x8000D000, 1 }, //3.0.1 - 3.0.2 | ||
| { "20170921172629", 3, 0x1800, 0x3FE0, { 1, 2, 0 }, 0x4002B000, 0x4003B000, 0 }, //4.0.0 - 4.1.0 | ||
| { "20180220163747", 4, 0x1900, 0x3FE0, { 1, 2, 0 }, 0x4002B000, 0x4003B000, 0 }, //5.0.0 - 5.0.2 | ||
| { NULL, 0, 0, 0, 0 } // End. | ||
| }; | ||
| static void SE_lock() { | ||
| for (u32 i = 0; i < 16; i++) | ||
| se_key_acc_ctrl(i, 0x15); | ||
| @@ -159,20 +147,23 @@ void patch(pk11_offs *pk11, pkg2_hdr_t *pkg2, link_t *kips) { | ||
| } | ||
| u8 kipHash[0x20]; | ||
| char *patchFilter[] = { "nogc", "nosigchk", "nocmac", NULL }; | ||
| char *patchFilter[] = { "nosigchk", "nocmac", "nogc", NULL }; | ||
| // enable nogc if there's a file called "nogc" in /ReiNX/ | ||
| //(I expect the 1% of people this effects can read the guide) | ||
| if (!fopen("/ReiNX/nogc", "rb")) { | ||
| patchFilter[2] = NULL; | ||
| fclose(); | ||
| } | ||
| //Patch FS module (truly not my proudest code TODO cleanup) | ||
| LIST_FOREACH_ENTRY(pkg2_kip1_info_t, ki, kips, link) { | ||
| //Patch FS | ||
| if(ki->kip1->tid == 0x0100000000000000) { | ||
| print("Patching FS\n"); | ||
| // calc hash of source kip | ||
| se_calc_sha256(kipHash, ki->kip1, ki->size); | ||
| // HACK: for some reason it doesn't always compute correct hash the first time, | ||
| // but seems to always do it correctly on the second try. maybe there's some | ||
| // init code missing to make this work? I don't even | ||
| se_calc_sha256(kipHash, ki->kip1, ki->size); | ||
| se_calc_sha256(&kipHash, ki->kip1, ki->size); | ||
| se_calc_sha256(&kipHash, ki->kip1, ki->size); | ||
| //Create header | ||
| size_t sizeDiff = ki->kip1->sections[0].size_decomp - ki->kip1->sections[0].size_comp; | ||
| @@ -1,3 +1,18 @@ | ||
| /* | ||
| * Copyright (c) 2018 Reisyukaku, naehrwert | ||
| * | ||
| * This program is free software; you can redistribute it and/or modify it | ||
| * under the terms and conditions of the GNU General Public License, | ||
| * version 2, as published by the Free Software Foundation. | ||
| * | ||
| * This program is distributed in the hope it will be useful, but WITHOUT | ||
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| * more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| */ | ||
| #pragma once | ||
| #include "hwinit/types.h" | ||
| @@ -15,4 +30,32 @@ | ||
| #define NOP 0xD503201F | ||
| #define ADRP(r, o) 0x90000000 | ((((o) >> 12) & 0x3) << 29) | ((((o) >> 12) & 0x1FFFFC) << 3) | ((r) & 0x1F) | ||
| void firmware(); | ||
| // TODO: Maybe find these with memsearch | ||
| static const pk11_offs _pk11_offs[] = { | ||
| //{ "20161121183008", 0, 0x1900, 0x3FE0, { 2, 1, 0 }, 0x4002B020, 0x8000D000, 1 }, //TODO: relocator patch for 1.0.0 | ||
| { "20161121183008", 0, 0x1900, 0x3FE0, { 2, 1, 0 }, 0x40014020, 0x8000D000, 1 }, //1.0.0 | ||
| { "20170210155124", 0, 0x1900, 0x3FE0, { 0, 1, 2 }, 0x4002D000, 0x8000D000, 1 }, //2.0.0 - 2.3.0 | ||
| { "20170519101410", 1, 0x1A00, 0x3FE0, { 0, 1, 2 }, 0x4002D000, 0x8000D000, 1 }, //3.0.0 | ||
| { "20170710161758", 2, 0x1A00, 0x3FE0, { 0, 1, 2 }, 0x4002D000, 0x8000D000, 1 }, //3.0.1 - 3.0.2 | ||
| { "20170921172629", 3, 0x1800, 0x3FE0, { 1, 2, 0 }, 0x4002B000, 0x4003B000, 0 }, //4.0.0 - 4.1.0 | ||
| { "20180220163747", 4, 0x1900, 0x3FE0, { 1, 2, 0 }, 0x4002B000, 0x4003B000, 0 }, //5.0.0 - 5.0.2 | ||
| { NULL, 0, 0, 0, 0 } // End. | ||
| }; | ||
| #define NUM_KEYBLOB_KEYS 5 | ||
| static const u8 keyblob_keyseeds[NUM_KEYBLOB_KEYS][0x10] = { | ||
| { 0xDF, 0x20, 0x6F, 0x59, 0x44, 0x54, 0xEF, 0xDC, 0x70, 0x74, 0x48, 0x3B, 0x0D, 0xED, 0x9F, 0xD3 }, //1.0.0 | ||
| { 0x0C, 0x25, 0x61, 0x5D, 0x68, 0x4C, 0xEB, 0x42, 0x1C, 0x23, 0x79, 0xEA, 0x82, 0x25, 0x12, 0xAC }, //3.0.0 | ||
| { 0x33, 0x76, 0x85, 0xEE, 0x88, 0x4A, 0xAE, 0x0A, 0xC2, 0x8A, 0xFD, 0x7D, 0x63, 0xC0, 0x43, 0x3B }, //3.0.1 | ||
| { 0x2D, 0x1F, 0x48, 0x80, 0xED, 0xEC, 0xED, 0x3E, 0x3C, 0xF2, 0x48, 0xB5, 0x65, 0x7D, 0xF7, 0xBE }, //4.0.0 | ||
| { 0xBB, 0x5A, 0x01, 0xF9, 0x88, 0xAF, 0xF5, 0xFC, 0x6C, 0xFF, 0x07, 0x9E, 0x13, 0x3C, 0x39, 0x80 } //5.0.0 | ||
| }; | ||
| static const u8 cmac_keyseed[0x10] = { 0x59, 0xC7, 0xFB, 0x6F, 0xBE, 0x9B, 0xBE, 0x87, 0x65, 0x6B, 0x15, 0xC0, 0x53, 0x73, 0x36, 0xA5 }; | ||
| static const u8 master_keyseed_retail[0x10] = { 0xD8, 0xA2, 0x41, 0x0A, 0xC6, 0xC5, 0x90, 0x01, 0xC6, 0x1D, 0x6A, 0x26, 0x7C, 0x51, 0x3F, 0x3C }; | ||
| static const u8 console_keyseed[0x10] = { 0x4F, 0x02, 0x5F, 0x0E, 0xB6, 0x6D, 0x11, 0x0E, 0xDC, 0x32, 0x7D, 0x41, 0x86, 0xC2, 0xF4, 0x78 }; | ||
| static const u8 key8_keyseed[] = { 0xFB, 0x8B, 0x6A, 0x9C, 0x79, 0x00, 0xC8, 0x49, 0xEF, 0xD2, 0x4D, 0x85, 0x4D, 0x30, 0xA0, 0xC7 }; | ||
| static const u8 master_keyseed_4xx[0x10] = { 0x2D, 0xC1, 0xF4, 0x8D, 0xF3, 0x5B, 0x69, 0x33, 0x42, 0x10, 0xAC, 0x65, 0xDA, 0x90, 0x46, 0x66 }; | ||
| static const u8 console_keyseed_4xx[0x10] = { 0x0C, 0x91, 0x09, 0xDB, 0x93, 0x93, 0x07, 0x81, 0x07, 0x3C, 0xC4, 0x16, 0x22, 0x7C, 0x6C, 0x28 }; | ||
| void firmware(); | ||
| @@ -1,5 +1,4 @@ | ||
| /* | ||
| * Copyright (c) 2018 naehrwert | ||
| * Copyright (c) 2018 Reisyukaku | ||
| * | ||
| * This program is free software; you can redistribute it and/or modify it | ||
| @@ -1,3 +1,19 @@ | ||
| /* | ||
| * Copyright (c) 2018 Reisyukaku | ||
| * | ||
| * This program is free software; you can redistribute it and/or modify it | ||
| * under the terms and conditions of the GNU General Public License, | ||
| * version 2, as published by the Free Software Foundation. | ||
| * | ||
| * This program is distributed in the hope it will be useful, but WITHOUT | ||
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| * more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| */ | ||
| #pragma once | ||
| u32 sd_mount(); | ||
| @@ -41,20 +41,4 @@ | ||
| #include "hwinit/nx_emmc.h" | ||
| #include "hwinit/se.h" | ||
| #include "hwinit/se_t210.h" | ||
| #include "hwinit/mmc.h" | ||
| #define NUM_KEYBLOB_KEYS 5 | ||
| static const u8 keyblob_keyseeds[NUM_KEYBLOB_KEYS][0x10] = { | ||
| { 0xDF, 0x20, 0x6F, 0x59, 0x44, 0x54, 0xEF, 0xDC, 0x70, 0x74, 0x48, 0x3B, 0x0D, 0xED, 0x9F, 0xD3 }, //1.0.0 | ||
| { 0x0C, 0x25, 0x61, 0x5D, 0x68, 0x4C, 0xEB, 0x42, 0x1C, 0x23, 0x79, 0xEA, 0x82, 0x25, 0x12, 0xAC }, //3.0.0 | ||
| { 0x33, 0x76, 0x85, 0xEE, 0x88, 0x4A, 0xAE, 0x0A, 0xC2, 0x8A, 0xFD, 0x7D, 0x63, 0xC0, 0x43, 0x3B }, //3.0.1 | ||
| { 0x2D, 0x1F, 0x48, 0x80, 0xED, 0xEC, 0xED, 0x3E, 0x3C, 0xF2, 0x48, 0xB5, 0x65, 0x7D, 0xF7, 0xBE }, //4.0.0 | ||
| { 0xBB, 0x5A, 0x01, 0xF9, 0x88, 0xAF, 0xF5, 0xFC, 0x6C, 0xFF, 0x07, 0x9E, 0x13, 0x3C, 0x39, 0x80 } //5.0.0 | ||
| }; | ||
| static const u8 cmac_keyseed[0x10] = { 0x59, 0xC7, 0xFB, 0x6F, 0xBE, 0x9B, 0xBE, 0x87, 0x65, 0x6B, 0x15, 0xC0, 0x53, 0x73, 0x36, 0xA5 }; | ||
| static const u8 master_keyseed_retail[0x10] = { 0xD8, 0xA2, 0x41, 0x0A, 0xC6, 0xC5, 0x90, 0x01, 0xC6, 0x1D, 0x6A, 0x26, 0x7C, 0x51, 0x3F, 0x3C }; | ||
| static const u8 console_keyseed[0x10] = { 0x4F, 0x02, 0x5F, 0x0E, 0xB6, 0x6D, 0x11, 0x0E, 0xDC, 0x32, 0x7D, 0x41, 0x86, 0xC2, 0xF4, 0x78 }; | ||
| static const u8 key8_keyseed[] = { 0xFB, 0x8B, 0x6A, 0x9C, 0x79, 0x00, 0xC8, 0x49, 0xEF, 0xD2, 0x4D, 0x85, 0x4D, 0x30, 0xA0, 0xC7 }; | ||
| static const u8 master_keyseed_4xx[0x10] = { 0x2D, 0xC1, 0xF4, 0x8D, 0xF3, 0x5B, 0x69, 0x33, 0x42, 0x10, 0xAC, 0x65, 0xDA, 0x90, 0x46, 0x66 }; | ||
| static const u8 console_keyseed_4xx[0x10] = { 0x0C, 0x91, 0x09, 0xDB, 0x93, 0x93, 0x07, 0x81, 0x07, 0x3C, 0xC4, 0x16, 0x22, 0x7C, 0x6C, 0x28 }; | ||
| #include "hwinit/mmc.h" | ||
| @@ -17,32 +17,36 @@ | ||
| #include <string.h> | ||
| #include "hwinit/types.h" | ||
| #include "hwinit/util.h" | ||
| #include "kippatches.h" | ||
| #include "fs.h" | ||
| #include "kippatches/fs.inc" | ||
| #define NOP 0xD503201F | ||
| // TODO: get full hashes somewhere and not just the first 16 bytes | ||
| // every second one is the exfat version | ||
| kippatchset_t kip_patches[] = { | ||
| { "FS", "\xde\x9f\xdd\xa4\x08\x5d\xd5\xfe\x68\xdc\xb2\x0b\x41\x09\x5b\xb4", fs_kip_patches_100 }, | ||
| { "FS", "\xfc\x3e\x80\x99\x1d\xca\x17\x96\x4a\x12\x1f\x04\xb6\x1b\x17\x5e", fs_kip_patches_100 }, | ||
| { "FS", "\xcd\x7b\xbe\x18\xd6\x13\x0b\x28\xf6\x2f\x19\xfa\x79\x45\x53\x5b", fs_kip_patches_200 }, | ||
| { "FS", "\xe7\x66\x92\xdf\xaa\x04\x20\xe9\xfd\xd6\x8e\x43\x63\x16\x18\x18", fs_kip_patches_200 }, | ||
| { "FS", "\x0d\x70\x05\x62\x7b\x07\x76\x7c\x0b\x96\x3f\x9a\xff\xdd\xe5\x66", fs_kip_patches_210 }, | ||
| { "FS", "\xdb\xd8\x5f\xca\xcc\x19\x3d\xa8\x30\x51\xc6\x64\xe6\x45\x2d\x32", fs_kip_patches_210 }, | ||
| { "FS", "\xa8\x6d\xa5\xe8\x7e\xf1\x09\x7b\x23\xda\xb5\xb4\xdb\xba\xef\xe7", fs_kip_patches_300 }, | ||
| { "FS", "\x98\x1c\x57\xe7\xf0\x2f\x70\xf7\xbc\xde\x75\x31\x81\xd9\x01\xa6", fs_kip_patches_300 }, | ||
| { "FS", "\x57\x39\x7c\x06\x3f\x10\xb6\x31\x3f\x4d\x83\x76\x53\xcc\xc3\x71", fs_kip_patches_301 }, | ||
| { "FS", "\x07\x30\x99\xd7\xc6\xad\x7d\x89\x83\xbc\x7a\xdd\x93\x2b\xe3\xd1", fs_kip_patches_301 }, | ||
| { "FS", "\x06\xe9\x07\x19\x59\x5a\x01\x0c\x62\x46\xff\x70\x94\x6f\x10\xfb", fs_kip_patches_401 }, | ||
| { "FS", "\x54\x9b\x0f\x8d\x6f\x72\xc4\xe9\xf3\xfd\x1f\x19\xea\xce\x4a\x5a", fs_kip_patches_401 }, | ||
| { "FS", "\x80\x96\xaf\x7c\x6a\x35\xaa\x82\x71\xf3\x91\x69\x95\x41\x3b\x0b", fs_kip_patches_410 }, | ||
| { "FS", "\x02\xd5\xab\xaa\xfd\x20\xc8\xb0\x63\x3a\xa0\xdb\xae\xe0\x37\x7e", fs_kip_patches_410 }, | ||
| { "FS", "\xa6\xf2\x7a\xd9\xac\x7c\x73\xad\x41\x9b\x63\xb2\x3e\x78\x5a\x0c", fs_kip_patches_500 }, | ||
| { "FS", "\xce\x3e\xcb\xa2\xf2\xf0\x62\xf5\x75\xf8\xf3\x60\x84\x2b\x32\xb4", fs_kip_patches_500 }, | ||
| { "FS", "\x76\xf8\x74\x02\xc9\x38\x7c\x0f\x0a\x2f\xab\x1b\x45\xce\xbb\x93", fs_kip_patches_510 }, | ||
| { "FS", "\x10\xb2\xd8\x16\x05\x48\x85\x99\xdf\x22\x42\xcb\x6b\xac\x2d\xf1", fs_kip_patches_510 }, | ||
| { NULL, NULL, NULL }, | ||
| { "FS", "\xde\x9f\xdd\xa4\x08\x5d\xd5\xfe\x68\xdc\xb2\x0b\x41\x09\x5b\xb4", fs_kip_patches_100 }, | ||
| { "FS", "\xfc\x3e\x80\x99\x1d\xca\x17\x96\x4a\x12\x1f\x04\xb6\x1b\x17\x5e", fs_kip_patches_100 }, | ||
| { "FS", "\xcd\x7b\xbe\x18\xd6\x13\x0b\x28\xf6\x2f\x19\xfa\x79\x45\x53\x5b", fs_kip_patches_200 }, | ||
| { "FS", "\xe7\x66\x92\xdf\xaa\x04\x20\xe9\xfd\xd6\x8e\x43\x63\x16\x18\x18", fs_kip_patches_200 }, | ||
| { "FS", "\x0d\x70\x05\x62\x7b\x07\x76\x7c\x0b\x96\x3f\x9a\xff\xdd\xe5\x66", fs_kip_patches_210 }, | ||
| { "FS", "\xdb\xd8\x5f\xca\xcc\x19\x3d\xa8\x30\x51\xc6\x64\xe6\x45\x2d\x32", fs_kip_patches_210 }, | ||
| { "FS", "\xa8\x6d\xa5\xe8\x7e\xf1\x09\x7b\x23\xda\xb5\xb4\xdb\xba\xef\xe7", fs_kip_patches_300 }, | ||
| { "FS", "\x98\x1c\x57\xe7\xf0\x2f\x70\xf7\xbc\xde\x75\x31\x81\xd9\x01\xa6", fs_kip_patches_300 }, | ||
| { "FS", "\x57\x39\x7c\x06\x3f\x10\xb6\x31\x3f\x4d\x83\x76\x53\xcc\xc3\x71", fs_kip_patches_301 }, | ||
| { "FS", "\x07\x30\x99\xd7\xc6\xad\x7d\x89\x83\xbc\x7a\xdd\x93\x2b\xe3\xd1", fs_kip_patches_301 }, | ||
| { "FS", "\x06\xe9\x07\x19\x59\x5a\x01\x0c\x62\x46\xff\x70\x94\x6f\x10\xfb", fs_kip_patches_401 }, | ||
| { "FS", "\x54\x9b\x0f\x8d\x6f\x72\xc4\xe9\xf3\xfd\x1f\x19\xea\xce\x4a\x5a", fs_kip_patches_401 }, | ||
| { "FS", "\x80\x96\xaf\x7c\x6a\x35\xaa\x82\x71\xf3\x91\x69\x95\x41\x3b\x0b", fs_kip_patches_410 }, | ||
| { "FS", "\x02\xd5\xab\xaa\xfd\x20\xc8\xb0\x63\x3a\xa0\xdb\xae\xe0\x37\x7e", fs_kip_patches_410 }, | ||
| { "FS", "\xa6\xf2\x7a\xd9\xac\x7c\x73\xad\x41\x9b\x63\xb2\x3e\x78\x5a\x0c", fs_kip_patches_500 }, | ||
| { "FS", "\xce\x3e\xcb\xa2\xf2\xf0\x62\xf5\x75\xf8\xf3\x60\x84\x2b\x32\xb4", fs_kip_patches_500 }, | ||
| { "FS", "\x76\xf8\x74\x02\xc9\x38\x7c\x0f\x0a\x2f\xab\x1b\x45\xce\xbb\x93", fs_kip_patches_510 }, | ||
| { "FS", "\x10\xb2\xd8\x16\x05\x48\x85\x99\xdf\x22\x42\xcb\x6b\xac\x2d\xf1", fs_kip_patches_510 }, | ||
| { NULL, NULL, NULL }, | ||
| }; | ||
| int kippatch_apply(u8 *kipdata, u64 kipdata_len, kippatch_t *patch) { | ||
| @@ -61,6 +65,25 @@ int kippatch_apply(u8 *kipdata, u64 kipdata_len, kippatch_t *patch) { | ||
| return 0; | ||
| } | ||
| int nca_patch(u8 * kipdata, u64 kipdata_len) { | ||
| char pattern[8] = {0xE5, 0x07, 0x00, 0x32, 0xE0, 0x03, 0x16, 0xAA}; | ||
| char buf[0x10]; | ||
| memcpy(buf, kipdata+0x1C450, 0x10); | ||
| u32 * addr = memsearch(kipdata, kipdata_len, pattern, sizeof(pattern)); | ||
| int ret=0; | ||
| int max_dist = 0x10; | ||
| for(int i=0; i<max_dist; i++) { | ||
| u32 op = addr[i]; | ||
| if((op & 0xFC000000)==0x94000000) { //is a BL op | ||
| addr[i] = NOP; | ||
| ret=1; | ||
| break; | ||
| } | ||
| } | ||
| return ret; | ||
| } | ||
| int kippatch_apply_set(u8 *kipdata, u64 kipdata_len, kippatchset_t *patchset, char **filter) { | ||
| for (kippatch_t *p = patchset->patches; p && p->name; ++p) { | ||
| int found = 0; | ||
| @@ -70,18 +93,14 @@ int kippatch_apply_set(u8 *kipdata, u64 kipdata_len, kippatchset_t *patchset, ch | ||
| break; | ||
| } | ||
| } | ||
| if (!strcmp(p->name, "nogc")){ | ||
| if(!fopen("/ReiNX/nogc", "rb")) { | ||
| fclose(); | ||
| continue; | ||
| } | ||
| } | ||
| if (filter && !found) continue; | ||
| int r = kippatch_apply(kipdata, kipdata_len, p); | ||
| if (r) return r; | ||
| } | ||
| if(!strncmp("FS", patchset->kip_name, 2)) | ||
| nca_patch(kipdata, kipdata_len); | ||
| return 0; | ||
| } | ||
| @@ -89,13 +89,13 @@ static kipdiff_t fs_diffs_401_nocmac[6] = { | ||
| static kipdiff_t fs_diffs_401_nogc[3] = { | ||
| { 0xA3458, 4, "\x14\x40\x80\x72", "\x14\x80\x80\x72" }, | ||
| { 0xAAC98, 8, "\x80\x02\xA0\x52\x40\x40\x91\x72", "\xE0\x03\x1F\x2A\x1F\x20\x03\xD5" }, | ||
| { 0xAAB44, 8, "\xF4\x4F\xBE\xA9\xFD\x7B\x01\xA9", "\xE0\x03\x1F\x2A\xC0\x03\x5F\xD6" }, | ||
| { 0, 0, NULL, NULL }, | ||
| }; | ||
| static kipdiff_t fs_diffs_410_nogc[3] = { | ||
| { 0xA34BC, 4, "\x14\x40\x80\x72", "\x14\x80\x80\x72" }, | ||
| { 0xAACFC, 8, "\x80\x02\xA0\x52\x40\x40\x91\x72", "\xE0\x03\x1F\x2A\x1F\x20\x03\xD5" }, | ||
| { 0xAABA8, 8, "\xF4\x4F\xBE\xA9\xFD\x7B\x01\xA9", "\xE0\x03\x1F\x2A\xC0\x03\x5F\xD6" }, | ||
| { 0, 0, NULL, NULL }, | ||
| }; | ||
| @@ -118,7 +118,7 @@ static kipdiff_t fs_diffs_500_nocmac[8] = { | ||
| static kipdiff_t fs_diffs_500_nogc[3] = { | ||
| { 0xCF3C4, 4, "\x14\x40\x80\x52", "\x14\x80\x80\x52" }, | ||
| { 0xD74FC, 8, "\x40\x40\x91\x52\x80\x02\xA0\x72", "\xE0\x03\x1F\x2A\x1F\x20\x03\xD5" }, | ||
| { 0xD73A0, 8, "\xF4\x4F\xBE\xA9\xFD\x7B\x01\xA9", "\xE0\x03\x1F\x2A\xC0\x03\x5F\xD6" }, | ||
| { 0, 0, NULL, NULL }, | ||
| }; | ||
| @@ -141,7 +141,7 @@ static kipdiff_t fs_diffs_510_nocmac[8] = { | ||
| static kipdiff_t fs_diffs_510_nogc[3] = { | ||
| { 0xCF794, 4, "\x14\x40\x80\x52", "\x14\x80\x80\x52" }, | ||
| { 0xD78CC, 8, "\x40\x40\x91\x52\x80\x02\xA0\x72", "\xE0\x03\x1F\x2A\x1F\x20\x03\xD5" }, | ||
| { 0xD7770, 8, "\xF4\x4F\xBE\xA9\xFD\x7B\x01\xA9", "\xE0\x03\x1F\x2A\xC0\x03\x5F\xD6" }, | ||
| { 0, 0, NULL, NULL }, | ||
| }; | ||
| @@ -1,3 +1,19 @@ | ||
| /* | ||
| * Copyright (c) 2018 naehrwert, CTCaer, Reisyukaku | ||
| * | ||
| * This program is free software; you can redistribute it and/or modify it | ||
| * under the terms and conditions of the GNU General Public License, | ||
| * version 2, as published by the Free Software Foundation. | ||
| * | ||
| * This program is distributed in the hope it will be useful, but WITHOUT | ||
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| * more details. | ||
| * | ||
| * You should have received a copy of the GNU General Public License | ||
| * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
| */ | ||
| #pragma once | ||
| #include "hwinit.h" | ||
| #include "hwinit/arm64.h" | ||