diff --git a/bootloader/hos/pkg2.c b/bootloader/hos/pkg2.c index e741672..91f24eb 100644 --- a/bootloader/hos/pkg2.c +++ b/bootloader/hos/pkg2.c @@ -62,8 +62,20 @@ extern gfx_con_t gfx_con; #define ID_RCV_OFF_600 0x29B6C #define OUTPUT_DEBUG_OFF_100 0x2AD64 +#define OUTPUT_DEBUG_OFF_200 0x02FB8 +#define OUTPUT_DEBUG_OFF_300 0x03840 +#define OUTPUT_DEBUG_OFF_302 0x03840 +#define OUTPUT_DEBUG_OFF_400 0x0381C +#define OUTPUT_DEBUG_OFF_500 0x00DE0 +#define OUTPUT_DEBUG_OFF_600 0x00DE0 #define PRINTK_OFF_100 0x3BB4 +#define PRINTK_OFF_200 0x4178 +#define PRINTK_OFF_300 0x4A00 +#define PRINTK_OFF_302 0x4A00 +#define PRINTK_OFF_400 0x474C +#define PRINTK_OFF_500 0x1DD4 +#define PRINTK_OFF_600 0x1F44 static u32 PRC_ID_SND_100[] = { @@ -95,6 +107,13 @@ static u32 PRC_ID_RCV_200[] = 0xA9BF2FEA, 0x2A0F03EA, 0xD37EF54A, 0xF9405FEB, 0xF86A696A, 0xF9407BEB, 0x92FFFFE9, 0x8A090148, 0xD2FFFFE9, 0x8A09014A, 0xD2FFFFC9, 0xEB09015F, 0x54000040, 0xF9413168, 0xA8C12FEA }; +#define FREE_CODE_OFF_3RD_200 (FREE_CODE_OFF_2ND_200 + sizeof(PRC_ID_RCV_200) + 4) +static u32 DEBUG_OUTPUT_TRAMPOLINE_200[] = +{ + 0x252E2A73, 0x00000000, // "%.*s" + 0xE20300AA, 0xA0FFFF58, 0xFD7BBFA9, _BL(FREE_CODE_OFF_3RD_200 + 5 * 4, PRINTK_OFF_200), 0x000080D2, + 0xFD7BC1A8, 0xC0035FD6 +}; static u32 PRC_ID_SND_300[] = { @@ -107,6 +126,13 @@ static u32 PRC_ID_RCV_300[] = 0xA9BF2FEA, 0x2A0F03EA, 0xD37EF54A, 0xF9405FEB, 0xF86A696A, 0xF9407BEB, 0x92FFFFE9, 0x8A090148, 0xD2FFFFE9, 0x8A09014A, 0xD2FFFFC9, 0xEB09015F, 0x54000040, 0xF9415568, 0xA8C12FEA }; +#define FREE_CODE_OFF_3RD_300 (FREE_CODE_OFF_2ND_300 + sizeof(PRC_ID_RCV_300) + 4) +static u32 DEBUG_OUTPUT_TRAMPOLINE_300[] = +{ + 0x252E2A73, 0x00000000, // "%.*s" + 0xE20300AA, 0xA0FFFF58, 0xFD7BBFA9, _BL(FREE_CODE_OFF_3RD_300 + 5 * 4, PRINTK_OFF_300), 0x000080D2, + 0xFD7BC1A8, 0xC0035FD6 +}; static u32 PRC_ID_SND_302[] = { @@ -119,6 +145,13 @@ static u32 PRC_ID_RCV_302[] = 0xA9BF2FEA, 0x2A0F03EA, 0xD37EF54A, 0xF9405FEB, 0xF86A696A, 0xF9407BEB, 0x92FFFFE9, 0x8A090148, 0xD2FFFFE9, 0x8A09014A, 0xD2FFFFC9, 0xEB09015F, 0x54000040, 0xF9415568, 0xA8C12FEA }; +#define FREE_CODE_OFF_3RD_302 (FREE_CODE_OFF_2ND_302 + sizeof(PRC_ID_RCV_302) + 4) +static u32 DEBUG_OUTPUT_TRAMPOLINE_302[] = +{ + 0x252E2A73, 0x00000000, // "%.*s" + 0xE20300AA, 0xA0FFFF58, 0xFD7BBFA9, _BL(FREE_CODE_OFF_3RD_302 + 5 * 4, PRINTK_OFF_302), 0x000080D2, + 0xFD7BC1A8, 0xC0035FD6 +}; static u32 PRC_ID_SND_400[] = { @@ -131,6 +164,13 @@ static u32 PRC_ID_RCV_400[] = 0xF9403BED, 0x2A0E03EA, 0xD37EF54A, 0xF86A69AA, 0x92FFFFE9, 0x8A090148, 0xD2FFFFE9, 0x8A09014A, 0xD2FFFFC9, 0xEB09015F, 0x54000040, 0xF9415B28, 0xD503201F }; +#define FREE_CODE_OFF_3RD_400 (FREE_CODE_OFF_2ND_400 + sizeof(PRC_ID_RCV_400) + 4) +static u32 DEBUG_OUTPUT_TRAMPOLINE_400[] = +{ + 0x252E2A73, 0x00000000, // "%.*s" + 0xE20300AA, 0xA0FFFF58, 0xFD7BBFA9, _BL(FREE_CODE_OFF_3RD_400 + 5 * 4, PRINTK_OFF_400), 0x000080D2, + 0xFD7BC1A8, 0xC0035FD6 +}; static u32 PRC_ID_SND_500[] = { @@ -143,6 +183,13 @@ static u32 PRC_ID_RCV_500[] = 0xF9403BED, 0x2A1503EA, 0xD37EF54A, 0xF86A69AA, 0x92FFFFE9, 0x8A090148, 0xD2FFFFE9, 0x8A09014A, 0xD2FFFFC9, 0xEB09015F, 0x54000040, 0xF9415B08, 0xF9406FEA }; +#define FREE_CODE_OFF_3RD_500 (FREE_CODE_OFF_2ND_500 + sizeof(PRC_ID_RCV_500) + 4) +static u32 DEBUG_OUTPUT_TRAMPOLINE_500[] = +{ + 0x252E2A73, 0x00000000, // "%.*s" + 0xE20300AA, 0xA0FFFF58, 0xFD7BBFA9, _BL(FREE_CODE_OFF_3RD_500 + 5 * 4, PRINTK_OFF_500), 0x000080D2, + 0xFD7BC1A8, 0xC0035FD6 +}; static u32 PRC_ID_SND_600[] = { @@ -157,6 +204,13 @@ static u32 PRC_ID_RCV_600[] = 0x8A09014A, 0xD2FFFFC9, 0xEB09015F, 0x54000100, 0xA9BF27E8, 0xF9400308, 0xF9401D08, 0xAA1803E0, 0xD63F0100, 0xA8C127E8, 0xAA0003E8, 0xA8C12FEA, 0xAA0803E0 }; +#define FREE_CODE_OFF_3RD_600 (FREE_CODE_OFF_2ND_600 + sizeof(PRC_ID_RCV_600) + 4) +static u32 DEBUG_OUTPUT_TRAMPOLINE_600[] = +{ + 0x252E2A73, 0x00000000, // "%.*s" + 0xE20300AA, 0xA0FFFF58, 0xFD7BBFA9, _BL(FREE_CODE_OFF_3RD_600 + 5 * 4, PRINTK_OFF_600), 0x000080D2, + 0xFD7BC1A8, 0xC0035FD6 +}; // Include kernel patches here, so we can utilize pkg1 id KERNEL_PATCHSET_DEF(_kernel_1_patchset, @@ -178,6 +232,8 @@ KERNEL_PATCHSET_DEF(_kernel_1_patchset, KERNEL_PATCHSET_DEF(_kernel_2_patchset, { SVC_VERIFY_DS, 0x54834, _NOP(), NULL }, // Disable SVC verifications { DEBUG_MODE_EN, 0x6086C, _MOVZX(8, 1, 0), NULL }, // Enable Debug Patch + { DEBUG_OUTPUT_GEN, OUTPUT_DEBUG_OFF_200, _B(OUTPUT_DEBUG_OFF_200, FREE_CODE_OFF_3RD_200), NULL }, // Branch to the printk trampoline + { DEBUG_OUTPUT_ARR, FREE_CODE_OFF_3RD_200, sizeof(DEBUG_OUTPUT_TRAMPOLINE_200) >> 2, DEBUG_OUTPUT_TRAMPOLINE_200 }, // Call printk with the right arguments. // Atmosphère kernel patches. { ATM_GEN_PATCH, ID_SND_OFF_200, _B(ID_SND_OFF_200, FREE_CODE_OFF_1ST_200), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_200, sizeof(PRC_ID_SND_200) >> 2, PRC_ID_SND_200}, // Send process id code. @@ -192,6 +248,8 @@ KERNEL_PATCHSET_DEF(_kernel_2_patchset, KERNEL_PATCHSET_DEF(_kernel_3_patchset, { SVC_VERIFY_DS, 0x3BD24, _NOP(), NULL }, // Disable SVC verifications { DEBUG_MODE_EN, 0x483FC, _MOVZX(8, 1, 0), NULL }, // Enable Debug Patch + { DEBUG_OUTPUT_GEN, OUTPUT_DEBUG_OFF_300, _B(OUTPUT_DEBUG_OFF_300, FREE_CODE_OFF_3RD_300), NULL }, // Branch to the printk trampoline + { DEBUG_OUTPUT_ARR, FREE_CODE_OFF_3RD_300, sizeof(DEBUG_OUTPUT_TRAMPOLINE_300) >> 2, DEBUG_OUTPUT_TRAMPOLINE_300 }, // Call printk with the right arguments. // Atmosphère kernel patches. { ATM_GEN_PATCH, ID_SND_OFF_300, _B(ID_SND_OFF_300, FREE_CODE_OFF_1ST_300), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_300, sizeof(PRC_ID_SND_300) >> 2, PRC_ID_SND_300}, // Send process id code. @@ -206,6 +264,8 @@ KERNEL_PATCHSET_DEF(_kernel_3_patchset, KERNEL_PATCHSET_DEF(_kernel_302_patchset, { SVC_VERIFY_DS, 0x3BD24, _NOP(), NULL }, // Disable SVC verifications { DEBUG_MODE_EN, 0x48414, _MOVZX(8, 1, 0), NULL }, // Enable Debug Patch + { DEBUG_OUTPUT_GEN, OUTPUT_DEBUG_OFF_302, _B(OUTPUT_DEBUG_OFF_302, FREE_CODE_OFF_3RD_302), NULL }, // Branch to the printk trampoline + { DEBUG_OUTPUT_ARR, FREE_CODE_OFF_3RD_302, sizeof(DEBUG_OUTPUT_TRAMPOLINE_302) >> 2, DEBUG_OUTPUT_TRAMPOLINE_302 }, // Call printk with the right arguments. // Atmosphère kernel patches. { ATM_GEN_PATCH, ID_SND_OFF_302, _B(ID_SND_OFF_302, FREE_CODE_OFF_1ST_302), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_302, sizeof(PRC_ID_SND_302) >> 2, PRC_ID_SND_302}, // Send process id code. @@ -220,6 +280,8 @@ KERNEL_PATCHSET_DEF(_kernel_302_patchset, KERNEL_PATCHSET_DEF(_kernel_4_patchset, { SVC_VERIFY_DS, 0x41EB4, _NOP(), NULL }, // Disable SVC verifications { DEBUG_MODE_EN, 0x4EBFC, _MOVZX(8, 1, 0), NULL }, // Enable Debug Patch + { DEBUG_OUTPUT_GEN, OUTPUT_DEBUG_OFF_400, _B(OUTPUT_DEBUG_OFF_400, FREE_CODE_OFF_3RD_400), NULL }, // Branch to the printk trampoline + { DEBUG_OUTPUT_ARR, FREE_CODE_OFF_3RD_400, sizeof(DEBUG_OUTPUT_TRAMPOLINE_400) >> 2, DEBUG_OUTPUT_TRAMPOLINE_400 }, // Call printk with the right arguments. // Atmosphère kernel patches. { ATM_GEN_PATCH, ID_SND_OFF_400, _B(ID_SND_OFF_400, FREE_CODE_OFF_1ST_400), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_400, sizeof(PRC_ID_SND_400) >> 2, PRC_ID_SND_400}, // Send process id code. @@ -234,6 +296,8 @@ KERNEL_PATCHSET_DEF(_kernel_4_patchset, KERNEL_PATCHSET_DEF(_kernel_5_patchset, { SVC_VERIFY_DS, 0x45E6C, _NOP(), NULL }, // Disable SVC verifications { DEBUG_MODE_EN, 0x5513C, _MOVZX(8, 1, 0), NULL }, // Enable Debug Patch + { DEBUG_OUTPUT_GEN, OUTPUT_DEBUG_OFF_500, _B(OUTPUT_DEBUG_OFF_500, FREE_CODE_OFF_3RD_500), NULL }, // Branch to the printk trampoline + { DEBUG_OUTPUT_ARR, FREE_CODE_OFF_3RD_500, sizeof(DEBUG_OUTPUT_TRAMPOLINE_500) >> 2, DEBUG_OUTPUT_TRAMPOLINE_500 }, // Call printk with the right arguments. // Atmosphère kernel patches. { ATM_GEN_PATCH, ID_SND_OFF_500, _B(ID_SND_OFF_500, FREE_CODE_OFF_1ST_500), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_500, sizeof(PRC_ID_SND_500) >> 2, PRC_ID_SND_500}, // Send process id code. @@ -248,6 +312,8 @@ KERNEL_PATCHSET_DEF(_kernel_5_patchset, KERNEL_PATCHSET_DEF(_kernel_6_patchset, { SVC_VERIFY_DS, 0x47EA0, _NOP(), NULL }, // Disable SVC verifications { DEBUG_MODE_EN, 0x57548, _MOVZX(8, 1, 0), NULL }, // Enable Debug Patch + { DEBUG_OUTPUT_GEN, OUTPUT_DEBUG_OFF_600, _B(OUTPUT_DEBUG_OFF_600, FREE_CODE_OFF_3RD_600), NULL }, // Branch to the printk trampoline + { DEBUG_OUTPUT_ARR, FREE_CODE_OFF_3RD_600, sizeof(DEBUG_OUTPUT_TRAMPOLINE_600) >> 2, DEBUG_OUTPUT_TRAMPOLINE_600 }, // Call printk with the right arguments. // Atmosphère kernel patches. { ATM_GEN_PATCH, ID_SND_OFF_600, _B(ID_SND_OFF_600, FREE_CODE_OFF_1ST_600), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_600, sizeof(PRC_ID_SND_600) >> 2, PRC_ID_SND_600}, // Send process id code.