From a77d0713b2473deadf57be4b98189fb2ed4ecfdb Mon Sep 17 00:00:00 2001 From: BullyWiiPlaza Date: Wed, 29 Mar 2017 16:50:33 +0200 Subject: [PATCH] Fix execute assembly command --- src/pygecko.c | 54 ++++++++++++++++++++++++++++++++++++-------------- tcpgecko.elf | Bin 138628 -> 138596 bytes 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/src/pygecko.c b/src/pygecko.c index 3f2faab..04db437 100644 --- a/src/pygecko.c +++ b/src/pygecko.c @@ -50,7 +50,7 @@ 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_SYSTEM_CALL 0x80 #define COMMAND_EXECUTE_ASSEMBLY 0x81 #define COMMAND_SERVER_VERSION 0x99 #define COMMAND_OS_VERSION 0x9A @@ -63,7 +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 WRITE_SCREEN_MESSAGE_BUFFER_SIZE 100 #define SERVER_VERSION "02/25/2017" #define ONLY_ZEROS_READ 0xB0 #define NON_ZEROS_READ 0xBD @@ -131,6 +131,24 @@ strm, int flush )); +/*struct breakpoint { + u32 address; + u32 instruction; +}; + +// 10 general breakpoints + 2 step breakpoints +breakpoint breakpoints[12]; + +breakpoint *getBreakpoint(u32 address, int size) { + breakpoint *breakpointsList = breakpoints; + for (int breakpointIndex = 0; breakpointIndex < size; breakpointIndex++) { + if (breakpointsList[breakpointIndex].address == address) { + return &breakpointsList[breakpointIndex]; + } + } + return 0; +}*/ + unsigned char *memcpy_buffer[DATA_BUFFER_SIZE]; void pygecko_memcpy(unsigned char *destinationBuffer, unsigned char *sourceBuffer, unsigned int length) { @@ -243,7 +261,8 @@ static int sendbyte(struct pygecko_bss_t *bss, int sock, unsigned char byte) { return sendwait(bss, sock, buffer, 1); } -void performSystemCall(int value) { +/*void performSystemCall(int value) { + // TODO Exception DSI? asm( "li 0, %0\n" "sc\n" @@ -252,7 +271,7 @@ void performSystemCall(int value) { :"r"(value) // Input :"0" // Overwritten register ); -} +}*/ void writeScreen(char message[100], int secondsDelay) { // TODO Does nothing then crashes (in games)? @@ -1054,11 +1073,11 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { break; } case COMMAND_WRITE_SCREEN: { - char message[100]; + char message[WRITE_SCREEN_MESSAGE_BUFFER_SIZE]; ret = recvwait(bss, clientfd, buffer, 4); ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (write screen seconds)") int seconds = ((int *) buffer)[0]; - receiveString(bss, clientfd, message, 100); + receiveString(bss, clientfd, message, WRITE_SCREEN_MESSAGE_BUFFER_SIZE); writeScreen(message, seconds); break; @@ -1215,27 +1234,32 @@ static int rungecko(struct pygecko_bss_t *bss, int clientfd) { break; } - case COMMAND_SYS_CALL: { + /*case COMMAND_SYSTEM_CALL: { ret = recvwait(bss, clientfd, buffer, 4); - ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (syscall)") + ASSERT_FUNCTION_SUCCEEDED(ret, "recvwait (system call)") 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); + receiveString(bss, clientfd, (char *) buffer, DATA_BUFFER_SIZE); - // Execute the assembly TODO Exception ISI - void (*function)() = (void *) assemblyBuffer; + // Write the assembly to an executable code region + int destinationAddress = 0x10000000 - DATA_BUFFER_SIZE; + pygecko_memcpy((unsigned char *) destinationAddress, buffer, DATA_BUFFER_SIZE); + + // Execute the assembly from there + void (*function)() = (void (*)()) destinationAddress; function(); + // Clear the memory contents again + memset((void *) buffer, 0, DATA_BUFFER_SIZE); + pygecko_memcpy((unsigned char *) destinationAddress, buffer, DATA_BUFFER_SIZE); + break; } case COMMAND_SERVER_VERSION: { diff --git a/tcpgecko.elf b/tcpgecko.elf index d0b3235c7166f2b2f2313b12764a1a81ec10c593..56839a3d4af213653e4acf5854067a27f7a0e999 100644 GIT binary patch delta 24275 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 delta 24749 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