Improve usb serial logging behaviour when rebooting iosu

This commit is contained in:
Maschell 2022-07-25 15:27:46 +02:00
parent 47641326a5
commit 91b20af377
3 changed files with 34 additions and 16 deletions

View File

@ -102,11 +102,6 @@ void instant_patches_setup(void) {
// give us bsp::ee:read permission for PPC // give us bsp::ee:read permission for PPC
*(volatile u32 *) (0xe6044db0 - 0xe6042000 + 0x13d02000) = 0x000001F0; *(volatile u32 *) (0xe6044db0 - 0xe6042000 + 0x13d02000) = 0x000001F0;
// Patch MCP debugmode check for syslog
*(volatile u32 *) (0x050290d8 - 0x05000000 + 0x081C0000) = 0x20004770;
// Patch TEST to allow syslog
*(volatile u32 *) (0xe4007828 - 0xe4000000 + 0x13A40000) = 0xe3a00000;
// patch default title id to system menu // patch default title id to system menu
*(volatile u32 *) mcp_data_phys(0x050B817C) = *(volatile u32 *) 0x0017FFF0; *(volatile u32 *) mcp_data_phys(0x050B817C) = *(volatile u32 *) 0x0017FFF0;
*(volatile u32 *) mcp_data_phys(0x050B8180) = *(volatile u32 *) 0x0017FFF4; *(volatile u32 *) mcp_data_phys(0x050B8180) = *(volatile u32 *) 0x0017FFF4;

View File

@ -56,8 +56,11 @@ ThreadContext_t **currentThreadContext = (ThreadContext_t **) 0x08173ba0;
uint32_t *domainAccessPermissions = (uint32_t *) 0x081a4000; uint32_t *domainAccessPermissions = (uint32_t *) 0x081a4000;
int kernel_syscall_0x81(u32 command, u32 arg1, u32 arg2, u32 arg3) { int kernel_syscall_0x81(u32 command, u32 arg1, u32 arg2, u32 arg3) {
int result = 0; void (*invalidate_icache)() = (void (*)()) 0x0812DCF0;
int level = disable_interrupts(); void (*invalidate_dcache)(unsigned int, unsigned int) = (void (*)()) 0x08120164;
void (*flush_dcache)(unsigned int, unsigned int) = (void (*)()) 0x08120160;
int result = 0;
int level = disable_interrupts();
set_domain_register(domainAccessPermissions[0]); // 0 = KERNEL set_domain_register(domainAccessPermissions[0]); // 0 = KERNEL
switch (command) { switch (command) {
@ -67,10 +70,14 @@ int kernel_syscall_0x81(u32 command, u32 arg1, u32 arg2, u32 arg3) {
} }
case KERNEL_WRITE32: { case KERNEL_WRITE32: {
*(volatile u32 *) arg1 = arg2; *(volatile u32 *) arg1 = arg2;
flush_dcache(arg1, 4);
invalidate_icache();
break; break;
} }
case KERNEL_MEMCPY: { case KERNEL_MEMCPY: {
kernel_memcpy((void *) arg1, (void *) arg2, arg3); kernel_memcpy((void *) arg1, (void *) arg2, arg3);
flush_dcache(arg1, arg3);
invalidate_icache();
break; break;
} }
case KERNEL_READ_OTP: { case KERNEL_READ_OTP: {
@ -127,19 +134,22 @@ void kernel_run_patches(u32 ios_elf_start) {
section_write_word(ios_elf_start, 0xe22b2a78, 0x00000000); section_write_word(ios_elf_start, 0xe22b2a78, 0x00000000);
section_write_word(ios_elf_start, 0xe204fb68, 0xe3a00000); section_write_word(ios_elf_start, 0xe204fb68, 0xe3a00000);
// patch MCP syslog debug mode check // Keep usb for reboot logging if we already do usb logging
section_write_word(ios_elf_start, 0x050290d8, 0x20004770); if (*((volatile uint32_t *) (0x050290dc - 0x05000000 + 0x081C0000)) == 0x42424242) {
// patch TEST debug mode check
//section_write_word(ios_elf_start, 0xe4016a78, 0xe3a00000);
section_write_word(ios_elf_start, 0xe4007828, 0xe3a00000);
// Write magic word to disable custom IPC // patch MCP syslog debug mode check
section_write_word(ios_elf_start, 0x050290dc, 0x42424242); section_write_word(ios_elf_start, 0x050290d8, 0x20004770);
// Write magic word to disable custom USB logging IPC
section_write_word(ios_elf_start, 0x050290dc, 0x42424242);
}
// give us bsp::ee:read permission for PPC // give us bsp::ee:read permission for PPC
section_write_word(ios_elf_start, 0xe6044db0, 0x000001F0); section_write_word(ios_elf_start, 0xe6044db0, 0x000001F0);
// patch TEST debug mode check
//section_write_word(ios_elf_start, 0xe4016a78, 0xe3a00000);
section_write_word(ios_elf_start, 0xe4007828, 0xe3a00000);
// Patch FS to syslog everything // Patch FS to syslog everything
section_write_word(ios_elf_start, 0x107F5720, ARM_B(0x107F5720, 0x107F0C84)); section_write_word(ios_elf_start, 0x107F5720, ARM_B(0x107F5720, 0x107F0C84));

View File

@ -17,7 +17,9 @@
*/ */
#include "../../common/ipc_defs.h" #include "../../common/ipc_defs.h"
#include "../../common/kernel_commands.h"
#include "fsa.h" #include "fsa.h"
#include "imports.h"
#include "ipc_types.h" #include "ipc_types.h"
#include "logger.h" #include "logger.h"
#include "svc.h" #include "svc.h"
@ -299,10 +301,21 @@ int _MCP_ioctl100_patch(ipcmessage *msg) {
} }
} }
case IPC_CUSTOM_START_USB_LOGGING: { case IPC_CUSTOM_START_USB_LOGGING: {
if (usbLoggingEnabled || *((uint32_t *) 0x050290dc) == 0x42424242) { if (*((uint32_t *) 0x050290dc) == 0x42424242) {
// Skip syslog after a reload // Skip syslog after a reload
break; break;
} }
// set the flag to not run this twice.
svcCustomKernelCommand(KERNEL_WRITE32, 0x050290dc, 0x42424242);
// Patch MCP debugmode check for usb syslog
svcCustomKernelCommand(KERNEL_WRITE32, 0x050290d8, 0x20004770);
// Patch TEST to allow usb syslog
svcCustomKernelCommand(KERNEL_WRITE32, 0xe4007828, 0xe3a00000);
usleep(1000 * 10);
int handle = svcOpen("/dev/testproc1", 0); int handle = svcOpen("/dev/testproc1", 0);
if (handle > 0) { if (handle > 0) {
svcResume(handle); svcResume(handle);