From 05492f5f489ecccf05375ac67f68cb7c241a2ebd Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Sun, 16 Apr 2017 19:33:35 +0200 Subject: [PATCH] Implement pausing/resuming directly on the server --- src/dynamic_libs/fs_functions.h | 2 +- src/entry.c | 2 +- src/fs/fs_utils.c | 2 +- src/fs/sd_fat_devoptab.c | 4 +- src/kernel/syscalls.c | 10 +-- src/main.c | 13 +--- src/main.h | 2 +- src/patcher/fs_logger.c | 4 +- src/pygecko.c | 110 ++++++++++++++++++++++++++------ src/pygecko.h | 2 +- src/system/exception_handler.c | 4 +- src/system/memory.c | 4 +- src/utils/logger.c | 90 ++++++++++++-------------- src/utils/logger.h | 79 +++-------------------- src/utils/net.c | 6 +- tcpgecko.elf | Bin 139124 -> 140172 bytes 16 files changed, 163 insertions(+), 171 deletions(-) diff --git a/src/dynamic_libs/fs_functions.h b/src/dynamic_libs/fs_functions.h index 6d67123..3b77111 100644 --- a/src/dynamic_libs/fs_functions.h +++ b/src/dynamic_libs/fs_functions.h @@ -28,7 +28,7 @@ extern "C" { #endif -#include "common/fs_defs.h" +#include "../common/fs_defs.h" void InitFSFunctionPointers(void); diff --git a/src/entry.c b/src/entry.c index 69a48f8..ca51c83 100644 --- a/src/entry.c +++ b/src/entry.c @@ -16,7 +16,7 @@ int __entry_menu(int argc, char **argv) { InitSocketFunctionPointers(); InitGX2FunctionPointers(); - start_pygecko(); + startTCPGecko(); return EXIT_RELAUNCH_ON_LOAD; } diff --git a/src/fs/fs_utils.c b/src/fs/fs_utils.c index 1f4d57b..ef8885e 100644 --- a/src/fs/fs_utils.c +++ b/src/fs/fs_utils.c @@ -4,7 +4,7 @@ #include #include #include "common/fs_defs.h" -#include "dynamic_libs/fs_functions.h" +#include "../dynamic_libs/fs_functions.h" int MountFS(void *pClient, void *pCmd, char **mount_path) diff --git a/src/fs/sd_fat_devoptab.c b/src/fs/sd_fat_devoptab.c index f5b278b..c458ad2 100644 --- a/src/fs/sd_fat_devoptab.c +++ b/src/fs/sd_fat_devoptab.c @@ -29,8 +29,8 @@ #include #include #include -#include "dynamic_libs/fs_functions.h" -#include "dynamic_libs/os_functions.h" +#include "../dynamic_libs/fs_functions.h" +#include "../dynamic_libs/os_functions.h" #include "fs_utils.h" #define FS_ALIGNMENT 0x40 diff --git a/src/kernel/syscalls.c b/src/kernel/syscalls.c index aaca44f..474238f 100644 --- a/src/kernel/syscalls.c +++ b/src/kernel/syscalls.c @@ -1,8 +1,8 @@ -#include "common/os_defs.h" -#include "common/kernel_defs.h" -#include "common/common.h" -#include "dynamic_libs/os_functions.h" -#include "utils/utils.h" +#include "../common/os_defs.h" +#include "../common/kernel_defs.h" +#include "../common/common.h" +#include "../dynamic_libs/os_functions.h" +#include "../utils/utils.h" #include "syscalls.h" extern void my_PrepareTitle_hook(void); diff --git a/src/main.c b/src/main.c index 2feaa2c..3f56f92 100644 --- a/src/main.c +++ b/src/main.c @@ -15,12 +15,11 @@ #include "fs/sd_fat_devoptab.h" #include "kernel/kernel_functions.h" #include "system/memory.h" -#include "utils/logger.h" #include "utils/utils.h" #include "common/common.h" #include "main.h" -int CCHandler; +int codeHandlerInstalled; void startMiiMaker() { char buf_vol_odd[20]; @@ -45,12 +44,6 @@ int Menu_Main(void) { InitVPadFunctionPointers(); InitSysFunctionPointers(); - const char ip_address[100] = "192.168.178.49"; - log_init(ip_address); - log_deinit(); - log_init(ip_address); - log_printf("Started %s\n", cosAppXmlInfoStruct.rpx_name); - if (strcasecmp("men.rpx", cosAppXmlInfoStruct.rpx_name) == 0) { return EXIT_RELAUNCH_ON_LOAD; } else if (strlen(cosAppXmlInfoStruct.rpx_name) > 0 && @@ -194,7 +187,7 @@ int Menu_Main(void) { m_DCInvalidateRange((u32) physicalCodeHandlerAddress, codeHandlerSize); unmount_sd_fat("sd"); - CCHandler = 1; + codeHandlerInstalled = 1; launchMethod = 2; break; @@ -212,8 +205,6 @@ int Menu_Main(void) { MEM1_free(screenBuffer); screenBuffer = NULL; - log_deinit(); - memoryRelease(); if (launchMethod == 0) { diff --git a/src/main.h b/src/main.h index 1b444ac..f74b6bd 100644 --- a/src/main.h +++ b/src/main.h @@ -12,7 +12,7 @@ extern "C" { //! C wrapper for our C++ functions int Menu_Main(void); -extern int CCHandler; +extern int codeHandlerInstalled; #ifdef __cplusplus } diff --git a/src/patcher/fs_logger.c b/src/patcher/fs_logger.c index 514f299..163ddf5 100644 --- a/src/patcher/fs_logger.c +++ b/src/patcher/fs_logger.c @@ -1,7 +1,7 @@ #include #include "common/common.h" -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/socket_functions.h" +#include "../dynamic_libs/os_functions.h" +#include "../dynamic_libs/socket_functions.h" #include "function_hooks.h" #include "fs_logger.h" #include "utils/utils.h" diff --git a/src/pygecko.c b/src/pygecko.c index f3ae424..3b8c4cc 100644 --- a/src/pygecko.c +++ b/src/pygecko.c @@ -14,6 +14,7 @@ #include "dynamic_libs/fs_functions.h" #include "common/fs_defs.h" #include "system/exception_handler.h" +#include "utils/logger.h" void *client; void *commandBlock; @@ -53,6 +54,9 @@ struct pygecko_bss_t { #define COMMAND_MEMORY_SEARCH 0x73 // #define COMMAND_SYSTEM_CALL 0x80 #define COMMAND_EXECUTE_ASSEMBLY 0x81 +#define COMMAND_PAUSE_CONSOLE 0x82 +#define COMMAND_RESUME_CONSOLE 0x83 +#define COMMAND_IS_CONSOLE_PAUSED 0x84 #define COMMAND_SERVER_VERSION 0x99 #define COMMAND_OS_VERSION 0x9A #define COMMAND_RUN_KERNEL_COPY_SERVICE 0xCD @@ -152,7 +156,8 @@ unsigned char *memcpy_buffer[DATA_BUFFER_SIZE]; void pygecko_memcpy(unsigned char *destinationBuffer, unsigned char *sourceBuffer, unsigned int length) { memcpy(memcpy_buffer, sourceBuffer, length); - SC0x25_KernelCopyData((unsigned int) OSEffectiveToPhysical(destinationBuffer), (unsigned int) &memcpy_buffer, length); + SC0x25_KernelCopyData((unsigned int) OSEffectiveToPhysical(destinationBuffer), (unsigned int) &memcpy_buffer, + length); DCFlushRange(destinationBuffer, (u32) length); } @@ -199,6 +204,48 @@ void startKernelCopyService() { OSResumeThread(thread); } +int (*AVMGetDRCScanMode)(int); + +unsigned long getConsoleStatePatchAddress() { + if (AVMGetDRCScanMode) { + log_print("Already acquired!\n"); + } else { + // Acquire the RPL and function + log_print("Acquiring...\n"); + unsigned int avm_handle; + OSDynLoad_Acquire("avm.rpl", (u32 * ) & avm_handle); + ASSERT_ALLOCATED(avm_handle, "avm.rpl") + OSDynLoad_FindExport((u32) avm_handle, 0, "AVMGetDRCScanMode", &AVMGetDRCScanMode); + ASSERT_ALLOCATED(AVMGetDRCScanMode, "AVMGetDRCScanMode") + log_print("Acquired!\n"); + } + + return (unsigned long) (AVMGetDRCScanMode + 0x44); +} + +typedef enum { + PAUSED = 0x38000001, RUNNING = 0x38000000 +} ConsoleState; + +void writeConsoleState(ConsoleState state) { + // Get the value to write + int patchValue = state; + log_printf("Patch value: %x\n", patchValue); + + // Write the value + unsigned int patchAddress = getConsoleStatePatchAddress(); + log_printf("Patch address: %x\n", patchAddress); + pygecko_memcpy((unsigned char *) patchAddress, (unsigned char *) &patchValue, 4); +} + +bool isConsolePaused() { + unsigned int patchAddress = getConsoleStatePatchAddress(); + log_printf("Patch address: %x\n", patchAddress); + int value = *(unsigned int *) patchAddress; + + return value == PAUSED; +} + /*Validates the address range (last address inclusive) but is SLOW on bigger ranges */ static int validateAddressRange(int starting_address, int ending_address) { return __OSValidateAddressSpaceRange(1, (void *) starting_address, ending_address - starting_address + 1); @@ -252,7 +299,7 @@ static int sendwait(struct pygecko_bss_t *bss, int sock, const void *buffer, int return ret; } -static int sendbyte(struct pygecko_bss_t *bss, int sock, unsigned char byte) { +static int sendByte(struct pygecko_bss_t *bss, int sock, unsigned char byte) { unsigned char buffer[1]; buffer[0] = byte; @@ -405,7 +452,7 @@ int kernelMemoryCompare(const void *sourceBuffer, return kern_read(sourceBuffer) - kern_read(destinationBuffer); } -static int rungecko(struct pygecko_bss_t *bss, int clientfd) { +static int listenForCommands(struct pygecko_bss_t *bss, int clientfd) { int ret; // Hold the command and the data @@ -480,7 +527,7 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { if (rangeIterationIndex == length) { // No need to send all zero bytes for performance - ret = sendbyte(bss, clientfd, ONLY_ZEROS_READ); + ret = sendByte(bss, clientfd, ONLY_ZEROS_READ); CHECK_ERROR(ret < 0) } else { // TODO Compression of ptr, sending of status, compressed size and data, length: 1 + 4 + len(data) @@ -527,7 +574,7 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { if (rangeIterationIndex == length) { // No need to send all zero bytes for performance - ret = sendbyte(bss, clientfd, ONLY_ZEROS_READ); + ret = sendByte(bss, clientfd, ONLY_ZEROS_READ); CHECK_ERROR(ret < 0) } else { // TODO Compression of ptr, sending of status, compressed size and data, length: 1 + 4 + len(data) @@ -564,7 +611,7 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { int isAddressRangeValid = validateAddressRange(startingAddress, endingAddress); - sendbyte(bss, clientfd, (unsigned char) isAddressRangeValid); + sendByte(bss, clientfd, (unsigned char) isAddressRangeValid); break; } /*case COMMAND_DISASSEMBLE_RANGE: { @@ -1126,7 +1173,7 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { break; } case COMMAND_SERVER_STATUS: { - ret = sendbyte(bss, clientfd, 1); + ret = sendByte(bss, clientfd, 1); CHECK_ERROR(ret < 0) break; } @@ -1259,6 +1306,24 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { break; } + case COMMAND_PAUSE_CONSOLE: { + writeConsoleState(PAUSED); + + break; + } + case COMMAND_RESUME_CONSOLE: { + writeConsoleState(RUNNING); + + break; + } + case COMMAND_IS_CONSOLE_PAUSED: { + bool paused = isConsolePaused(); + log_printf("Paused: %d\n", paused); + ret = sendByte(bss, clientfd, (unsigned char) paused); + ASSERT_FUNCTION_SUCCEEDED(ret, "sendByte (sending paused console status)") + + break; + } case COMMAND_SERVER_VERSION: { char versionBuffer[50]; strcpy(versionBuffer, SERVER_VERSION); @@ -1299,7 +1364,7 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { return 0; } -static int start(int argc, void *argv) { +static int runTCPGeckoServer(int argc, void *argv) { int sockfd = -1, clientfd = -1, ret = 0, len; struct sockaddr_in addr; struct pygecko_bss_t *bss = argv; @@ -1307,7 +1372,10 @@ static int start(int argc, void *argv) { setup_os_exceptions(); socket_lib_init(); - while (1) { + log_init("192.168.2.103"); + log_print("TCP Gecko Installer\n"); + + while (true) { addr.sin_family = AF_INET; addr.sin_port = 7331; addr.sin_addr.s_addr = 0; @@ -1321,11 +1389,11 @@ static int start(int argc, void *argv) { ret = listen(sockfd, 20); CHECK_ERROR(ret < 0) - while (1) { + while (true) { len = 16; clientfd = accept(sockfd, (void *) &addr, &len); CHECK_ERROR(clientfd == -1) - ret = rungecko(bss, clientfd); + ret = listenForCommands(bss, clientfd); CHECK_ERROR(ret < 0) socketclose(clientfd); clientfd = -1; @@ -1345,7 +1413,8 @@ static int start(int argc, void *argv) { return 0; } -static int CCThread(int argc, void *argv) { +static int startTCPGeckoThread(int argc, void *argv) { + // Run the TCP Gecko Installer server struct pygecko_bss_t *bss; bss = memalign(0x40, sizeof(struct pygecko_bss_t)); @@ -1353,25 +1422,28 @@ static int CCThread(int argc, void *argv) { return 0; memset(bss, 0, sizeof(struct pygecko_bss_t)); - if (OSCreateThread(&bss->thread, start, 1, bss, (u32) bss->stack + sizeof(bss->stack), sizeof(bss->stack), 0, + if (OSCreateThread(&bss->thread, runTCPGeckoServer, 1, bss, (u32) bss->stack + sizeof(bss->stack), + sizeof(bss->stack), 0, 0xc) == 1) { OSResumeThread(&bss->thread); } else { free(bss); } - if (CCHandler == 1) { - void (*entrypoint)() = (void *) CODE_HANDLER_INSTALL_ADDRESS; + // Execute the code handler if it is installed + if (codeHandlerInstalled) { + void (*codeHandlerFunction)() = (void (*)()) CODE_HANDLER_INSTALL_ADDRESS; - while (1) { + while (true) { usleep(9000); - entrypoint(); + codeHandlerFunction(); } } + return 0; } -void start_pygecko() { +void startTCPGecko() { // Force the debugger to be initialized by default // writeInt((unsigned int) (OSIsDebuggerInitialized + 0x1C), 0x38000001); // li r3, 1 @@ -1381,7 +1453,7 @@ void start_pygecko() { void *thread = memalign(0x40, 0x1000); ASSERT_ALLOCATED(thread, "TCP Gecko thread") - int status = OSCreateThread(thread, CCThread, 1, + int status = OSCreateThread(thread, startTCPGeckoThread, 1, NULL, (u32) stack + sizeof(stack), sizeof(stack), 0, OS_THREAD_ATTR_AFFINITY_CORE1 | OS_THREAD_ATTR_PINNED_AFFINITY | OS_THREAD_ATTR_DETACH); diff --git a/src/pygecko.h b/src/pygecko.h index b4e6c55..1945fdd 100644 --- a/src/pygecko.h +++ b/src/pygecko.h @@ -10,7 +10,7 @@ extern "C" { #endif //! C wrapper for our C++ functions -void start_pygecko(void); +void startTCPGecko(void); #ifdef __cplusplus } diff --git a/src/system/exception_handler.c b/src/system/exception_handler.c index 7dbd6d6..d5b63b2 100644 --- a/src/system/exception_handler.c +++ b/src/system/exception_handler.c @@ -1,6 +1,6 @@ #include -#include "dynamic_libs/os_functions.h" -#include "utils/logger.h" +#include "../dynamic_libs/os_functions.h" +#include "../utils/logger.h" #include "exception_handler.h" #define OS_EXCEPTION_MODE_GLOBAL_ALL_CORES 4 diff --git a/src/system/memory.c b/src/system/memory.c index e560cc7..52dc327 100644 --- a/src/system/memory.c +++ b/src/system/memory.c @@ -16,8 +16,8 @@ ****************************************************************************/ #include #include -#include "dynamic_libs/os_functions.h" -#include "common/common.h" +#include "../dynamic_libs/os_functions.h" +#include "../common/common.h" #include "memory.h" #define MEMORY_ARENA_1 0 diff --git a/src/utils/logger.c b/src/utils/logger.c index 49ab1ef..b962cd4 100644 --- a/src/utils/logger.c +++ b/src/utils/logger.c @@ -2,18 +2,15 @@ #include #include #include -#include -#include "common/common.h" -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/socket_functions.h" +#include "../dynamic_libs/os_functions.h" +#include "../dynamic_libs/socket_functions.h" #include "logger.h" -static int log_socket = 0; +#ifdef DEBUG_LOGGER +static int log_socket = -1; static volatile int log_lock = 0; - -void log_init(const char * ipString) -{ +void log_init(const char *ipString) { log_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (log_socket < 0) return; @@ -24,65 +21,60 @@ void log_init(const char * ipString) connect_addr.sin_port = 4405; inet_aton(ipString, &connect_addr.sin_addr); - if(connect(log_socket, (struct sockaddr*)&connect_addr, sizeof(connect_addr)) < 0) - { - socketclose(log_socket); - log_socket = -1; + if (connect(log_socket, (struct sockaddr *) &connect_addr, sizeof(connect_addr)) < 0) { + socketclose(log_socket); + log_socket = -1; } } -void log_deinit(void) -{ - if(log_socket > 0) - { - socketclose(log_socket); - log_socket = -1; - } +void log_deinit(void) { + if (log_socket >= 0) { + socketclose(log_socket); + log_socket = -1; + } } -void log_print(const char *str) -{ - // socket is always 0 initially as it is in the BSS - if(log_socket <= 0) { - return; - } +void log_print(const char *str) { + // socket is always 0 initially as it is in the BSS + if (log_socket < 0) { + return; + } - while(log_lock) - usleep(1000); - log_lock = 1; + while (log_lock) + usleep(1000); + log_lock = 1; - int len = strlen(str); - int ret; - while (len > 0) { - int block = len < 1400 ? len : 1400; // take max 1400 bytes per UDP packet - ret = send(log_socket, str, block, 0); - if(ret < 0) - break; + int len = strlen(str); + int ret; + while (len > 0) { + int block = len < 1400 ? len : 1400; // take max 1400 bytes per UDP packet + ret = send(log_socket, str, block, 0); + if (ret < 0) + break; - len -= ret; - str += ret; - } + len -= ret; + str += ret; + } - log_lock = 0; + log_lock = 0; } -void log_printf(const char *format, ...) -{ - if(log_socket <= 0) { - return; - } +void log_printf(const char *format, ...) { + if (log_socket < 0) { + return; + } - char * tmp = NULL; + char *tmp = NULL; va_list va; va_start(va, format); - if((vasprintf(&tmp, format, va) >= 0) && tmp) - { - log_print(tmp); + if ((vasprintf(&tmp, format, va) >= 0) && tmp) { + log_print(tmp); } va_end(va); - if(tmp) + if (tmp) free(tmp); } +#endif \ No newline at end of file diff --git a/src/utils/logger.h b/src/utils/logger.h index 32fab70..dd7cc71 100644 --- a/src/utils/logger.h +++ b/src/utils/logger.h @@ -5,85 +5,22 @@ extern "C" { #endif -/* Communication bytes with the server */ -// Com -#define BYTE_NORMAL 0xff -#define BYTE_SPECIAL 0xfe -#define BYTE_OK 0xfd -#define BYTE_PING 0xfc -#define BYTE_LOG_STR 0xfb -#define BYTE_DISCONNECT 0xfa - -// SD -#define BYTE_MOUNT_SD 0xe0 -#define BYTE_MOUNT_SD_OK 0xe1 -#define BYTE_MOUNT_SD_BAD 0xe2 - -// Replacement -#define BYTE_STAT 0x00 -#define BYTE_STAT_ASYNC 0x01 -#define BYTE_OPEN_FILE 0x02 -#define BYTE_OPEN_FILE_ASYNC 0x03 -#define BYTE_OPEN_DIR 0x04 -#define BYTE_OPEN_DIR_ASYNC 0x05 -#define BYTE_CHANGE_DIR 0x06 -#define BYTE_CHANGE_DIR_ASYNC 0x07 -#define BYTE_MAKE_DIR 0x08 -#define BYTE_MAKE_DIR_ASYNC 0x09 -#define BYTE_RENAME 0x0A -#define BYTE_RENAME_ASYNC 0x0B -#define BYTE_REMOVE 0x0C -#define BYTE_REMOVE_ASYNC 0x0D - -// Log -#define BYTE_CLOSE_FILE 0x40 -#define BYTE_CLOSE_FILE_ASYNC 0x41 -#define BYTE_CLOSE_DIR 0x42 -#define BYTE_CLOSE_DIR_ASYNC 0x43 -#define BYTE_FLUSH_FILE 0x44 -#define BYTE_GET_ERROR_CODE_FOR_VIEWER 0x45 -#define BYTE_GET_LAST_ERROR 0x46 -#define BYTE_GET_MOUNT_SOURCE 0x47 -#define BYTE_GET_MOUNT_SOURCE_NEXT 0x48 -#define BYTE_GET_POS_FILE 0x49 -#define BYTE_SET_POS_FILE 0x4A -#define BYTE_GET_STAT_FILE 0x4B -#define BYTE_EOF 0x4C -#define BYTE_READ_FILE 0x4D -#define BYTE_READ_FILE_ASYNC 0x4E -#define BYTE_READ_FILE_WITH_POS 0x4F -#define BYTE_READ_DIR 0x50 -#define BYTE_READ_DIR_ASYNC 0x51 -#define BYTE_GET_CWD 0x52 -#define BYTE_SET_STATE_CHG_NOTIF 0x53 -#define BYTE_TRUNCATE_FILE 0x54 -#define BYTE_WRITE_FILE 0x55 -#define BYTE_WRITE_FILE_WITH_POS 0x56 - -#define BYTE_SAVE_INIT 0x57 -#define BYTE_SAVE_SHUTDOWN 0x58 -#define BYTE_SAVE_INIT_SAVE_DIR 0x59 -#define BYTE_SAVE_FLUSH_QUOTA 0x5A -#define BYTE_SAVE_OPEN_DIR 0x5B -#define BYTE_SAVE_REMOVE 0x5C - -#define BYTE_CREATE_THREAD 0x60 - -#define LOADIINE_LOGGER_IP "192.168.178.3" - -int logger_connect(int *socket); -void logger_disconnect(int socket); -void log_string(int sock, const char* str, char byte); -void log_byte(int sock, char byte); +#define DEBUG_LOGGER 1 +#ifdef DEBUG_LOGGER void log_init(const char * ip); void log_deinit(void); void log_print(const char *str); void log_printf(const char *format, ...); +#else +#define log_init(x) +#define log_deinit() +#define log_print(x) +#define log_printf(x, ...) +#endif #ifdef __cplusplus } #endif #endif - diff --git a/src/utils/net.c b/src/utils/net.c index 800fdc6..a1b259e 100644 --- a/src/utils/net.c +++ b/src/utils/net.c @@ -1,8 +1,8 @@ #include #include -#include "common/common.h" -#include "dynamic_libs/os_functions.h" -#include "dynamic_libs/socket_functions.h" +#include "../common/common.h" +#include "../dynamic_libs/os_functions.h" +#include "../dynamic_libs/socket_functions.h" #include "net.h" static volatile int iLock = 0; diff --git a/tcpgecko.elf b/tcpgecko.elf index 2c4040add59d9fee48790dd41c0e3c22b0d96fdc..45f2f99ef43d56ab6b16522d37b83a463f8e3f7a 100644 GIT binary patch delta 31844 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