diff --git a/bootloader/hos/hos.c b/bootloader/hos/hos.c index 3009ccf..226fc03 100644 --- a/bootloader/hos/hos.c +++ b/bootloader/hos/hos.c @@ -479,9 +479,11 @@ int hos_launch(ini_sec_t *cfg) { if ((ctxt.svcperm && kernel_patchset[i].id == SVC_VERIFY_DS) || (ctxt.debugmode && kernel_patchset[i].id == DEBUG_MODE_EN && !(ctxt.atmosphere && ctxt.secmon)) - || (ctxt.atmosphere && kernel_patchset[i].id == ATM_GEN_PATCH)) + || (ctxt.atmosphere && kernel_patchset[i].id == ATM_GEN_PATCH) + || (ctxt.debugmode && kernel_patchset[i].id == DEBUG_OUTPUT_GEN)) *(vu32 *)(ctxt.kernel + kernel_patchset[i].off) = kernel_patchset[i].val; - else if (ctxt.atmosphere && kernel_patchset[i].id == ATM_ARR_PATCH) + else if ((ctxt.atmosphere && kernel_patchset[i].id == ATM_ARR_PATCH) + || ctxt.debugmode && kernel_patchset[i].id == DEBUG_OUTPUT_ARR) { temp = (u32 *)kernel_patchset[i].ptr; for (u32 j = 0; j < kernel_patchset[i].val; j++) diff --git a/bootloader/hos/pkg2.c b/bootloader/hos/pkg2.c index fdf4647..e9830a4 100644 --- a/bootloader/hos/pkg2.c +++ b/bootloader/hos/pkg2.c @@ -61,6 +61,8 @@ extern gfx_con_t gfx_con; #define ID_RCV_OFF_500 0x28DAC #define ID_RCV_OFF_600 0x29B6C +#define OUTPUT_DEBUG_OFF_100 0x2AD64 + static u32 PRC_ID_SND_100[] = { 0xA9BF2FEA, 0x2A0E03EB, 0xD37EF56B, 0xF86B6B8B, 0x92FFFFE9, 0x8A090168, 0xD2FFFFE9, 0x8A09016B, @@ -72,6 +74,12 @@ static u32 PRC_ID_RCV_100[] = 0xA9BF2FEA, 0x2A1C03EA, 0xD37EF54A, 0xF86A69AA, 0x92FFFFE9, 0x8A090148, 0xD2FFFFE9, 0x8A09014A, 0xD2FFFFC9, 0xEB09015F, 0x54000040, 0xF9412968, 0xA8C12FEA }; +#define FREE_CODE_OFF_3RD_100 (FREE_CODE_OFF_2ND_100 + sizeof(PRC_ID_RCV_100) + 4) +static u32 DEBUG_OUTPUT_TRAMPOLINE_100[] = +{ + 0xE20300AA, 0xE0FFFFD2, 0xE0FFDFF2, 0x80F8B7F2, 0x802F8BF2, 0xFD7BBFA9, 0x86F0FE97, 0x000080D2, + 0xFD7BC1A8, 0xC0035FD6 +}; static u32 PRC_ID_SND_200[] = { @@ -151,6 +159,8 @@ static u32 PRC_ID_RCV_600[] = KERNEL_PATCHSET_DEF(_kernel_1_patchset, { SVC_VERIFY_DS, 0x3764C, _NOP(), NULL }, // Disable SVC verifications { DEBUG_MODE_EN, 0x44074, _MOVZX(8, 1, 0), NULL }, // Enable Debug Patch + { DEBUG_OUTPUT_GEN, OUTPUT_DEBUG_OFF_100, _B(OUTPUT_DEBUG_OFF_100, FREE_CODE_OFF_3RD_100), NULL }, // Branch to the printk trampoline + { DEBUG_OUTPUT_ARR, FREE_CODE_OFF_3RD_100, sizeof(DEBUG_OUTPUT_TRAMPOLINE_100) >> 2, DEBUG_OUTPUT_TRAMPOLINE_100 }, // Call printk with the right arguments. // Atmosphère kernel patches. { ATM_GEN_PATCH, ID_SND_OFF_100, _B(ID_SND_OFF_100, FREE_CODE_OFF_1ST_100), NULL}, // Send process id branch. { ATM_ARR_PATCH, FREE_CODE_OFF_1ST_100, sizeof(PRC_ID_SND_100) >> 2, PRC_ID_SND_100}, // Send process id code. diff --git a/bootloader/hos/pkg2.h b/bootloader/hos/pkg2.h index 92d90bf..202569e 100644 --- a/bootloader/hos/pkg2.h +++ b/bootloader/hos/pkg2.h @@ -50,6 +50,8 @@ enum ATM_GEN_PATCH, // >4 bytes patches. Value is a pointer of a u32 array. ATM_ARR_PATCH, + DEBUG_OUTPUT_GEN, + DEBUG_OUTPUT_ARR, }; typedef struct _pkg2_hdr_t