From e3a7118428d75ede9d49016995939ef7fee21efe Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Tue, 21 Mar 2017 15:00:53 +0100 Subject: [PATCH] Add new commands (execute syscall and assembly) --- src/pygecko.c | 37 +++++++++++++++++++++++++++++++++++++ tcpgecko.elf | Bin 138364 -> 138628 bytes 2 files changed, 37 insertions(+) diff --git a/src/pygecko.c b/src/pygecko.c index dec8d56..3f2faab 100644 --- a/src/pygecko.c +++ b/src/pygecko.c @@ -50,6 +50,8 @@ struct pygecko_bss_t { #define COMMAND_RPC 0x70 #define COMMAND_GET_SYMBOL 0x71 #define COMMAND_MEMORY_SEARCH 0x73 +#define COMMAND_SYS_CALL 0x80 +#define COMMAND_EXECUTE_ASSEMBLY 0x81 #define COMMAND_SERVER_VERSION 0x99 #define COMMAND_OS_VERSION 0x9A #define COMMAND_RUN_KERNEL_COPY_SERVICE 0xCD @@ -61,6 +63,7 @@ struct pygecko_bss_t { #define FS_BUFFER_SIZE 0x1000 #define DATA_BUFFER_SIZE 0x5000 #define DISASSEMBLER_BUFFER_SIZE 0x1024 +#define ASSEMBLY_BUFFER_SIZE 0x190 #define SERVER_VERSION "02/25/2017" #define ONLY_ZEROS_READ 0xB0 #define NON_ZEROS_READ 0xBD @@ -240,6 +243,17 @@ static int sendbyte(struct pygecko_bss_t *bss, int sock, unsigned char byte) { return sendwait(bss, sock, buffer, 1); } +void performSystemCall(int value) { + asm( + "li 0, %0\n" + "sc\n" + "blr\n" + : // No output + :"r"(value) // Input + :"0" // Overwritten register + ); +} + void writeScreen(char message[100], int secondsDelay) { // TODO Does nothing then crashes (in games)? OSScreenClearBufferEx(0, 0); @@ -1201,6 +1215,29 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { break; } + case COMMAND_SYS_CALL: { + ret = recvwait(bss, clientfd, buffer, 4); + ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (syscall)") + + int value = ((int *) buffer)[0]; + + // TODO Exception DSI + performSystemCall(value); + + break; + } + case COMMAND_EXECUTE_ASSEMBLY: { + char assemblyBuffer[ASSEMBLY_BUFFER_SIZE] = {0}; + + // Receive the assembly + receiveString(bss, clientfd, assemblyBuffer, ASSEMBLY_BUFFER_SIZE); + + // Execute the assembly TODO Exception ISI + void (*function)() = (void *) assemblyBuffer; + function(); + + break; + } case COMMAND_SERVER_VERSION: { char versionBuffer[50]; strcpy(versionBuffer, SERVER_VERSION); diff --git a/tcpgecko.elf b/tcpgecko.elf index e02effb5e6479bc01719acf5acbc98ed38e237ca..d0b3235c7166f2b2f2313b12764a1a81ec10c593 100644 GIT binary patch delta 27674 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