From 1d03b15fce4a279825ef52b17fba5b3e4d35d6dd Mon Sep 17 00:00:00 2001 From: dhewg Date: Mon, 13 Apr 2009 20:22:32 +0200 Subject: [PATCH] cleanup --- elf.h | 1 + gecko.c | 34 ++++---------- main.c | 124 -------------------------------------------------- powerpc_elf.c | 7 +-- 4 files changed, 15 insertions(+), 151 deletions(-) diff --git a/elf.h b/elf.h index 116fe20..2000959 100644 --- a/elf.h +++ b/elf.h @@ -63,3 +63,4 @@ typedef struct { #define PT_PHDR 6 #endif + diff --git a/gecko.c b/gecko.c index a2af77c..67b7d71 100644 --- a/gecko.c +++ b/gecko.c @@ -33,18 +33,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA static u8 gecko_console_enabled = 0; -// These two don't really seem to be needed -// Maybe only for boot buffer or some PPC stuff -static inline void _gecko_get(void) -{ - //set32(HW_EXICTRL, 1); -} - -static inline void _gecko_release(void) -{ - //clear32(HW_EXICTRL, 1); -} - static u32 _gecko_command(u32 command) { u32 i; @@ -110,26 +98,24 @@ static int gecko_isalive(void) return 0; } -#if 0 static void gecko_flush(void) { - char tmp; + u8 tmp; while(_gecko_recvbyte(&tmp)); } +#if 0 static int gecko_recvbuffer(void *buffer, u32 size) { u32 left = size; char *ptr = (char*)buffer; - _gecko_get(); while(left>0) { if(!_gecko_recvbyte(ptr)) break; ptr++; left--; } - _gecko_release(); return (size - left); } #endif @@ -139,14 +125,12 @@ static int gecko_sendbuffer(const void *buffer, u32 size) u32 left = size; char *ptr = (char*)buffer; - _gecko_get(); while(left>0) { if(!_gecko_sendbyte(*ptr)) break; ptr++; left--; } - _gecko_release(); return (size - left); } @@ -156,7 +140,6 @@ static int gecko_recvbuffer_safe(void *buffer, u32 size) u32 left = size; char *ptr = (char*)buffer; - _gecko_get(); while(left>0) { if(_gecko_checkrecv()) { if(!_gecko_recvbyte(ptr)) @@ -165,7 +148,6 @@ static int gecko_recvbuffer_safe(void *buffer, u32 size) left--; } } - _gecko_release(); return (size - left); } @@ -177,7 +159,6 @@ static int gecko_sendbuffer_safe(const void *buffer, u32 size) if((read32(HW_EXICTRL) & EXICTRL_ENABLE_EXI) == 0) return left; - _gecko_get(); while(left>0) { if(_gecko_checksend()) { if(!_gecko_sendbyte(*ptr)) @@ -186,7 +167,6 @@ static int gecko_sendbuffer_safe(const void *buffer, u32 size) left--; } } - _gecko_release(); return (size - left); } #endif @@ -203,6 +183,7 @@ void gecko_init(void) if (!gecko_isalive()) return; + gecko_flush(); gecko_console_enabled = 1; } @@ -309,7 +290,9 @@ void gecko_timer(void) { _gecko_state = GECKO_STATE_RECEIVE_BUFFER; _gecko_receive_left = _gecko_receive_len; + // sorry pal, that memory is mine now powerpc_hang(); + gecko_printf("MINI/GECKO: PPC halted, receiving data...\n"); } return; @@ -329,7 +312,7 @@ void gecko_timer(void) { return; default: - gecko_printf("GECKOTIMER: statelolwtf?\n"); + gecko_printf("MINI/GECKO: internal error\n"); return; } @@ -337,7 +320,8 @@ void gecko_timer(void) { switch (_gecko_cmd) { case 0x43524150: if (powerpc_boot_mem((u8 *) 0x10100000, _gecko_receive_len)) - gecko_printf("GECKOTIMER: elflolwtf?\n"); + gecko_printf("MINI/GECKO: the received binary is not a valid " + "PPC ELF. Broadway is dead now.\n"); break; case 0x5a4f4d47: @@ -347,6 +331,8 @@ void gecko_timer(void) { } cleanup: + gecko_flush(); + irq_set_alarm(20, 0); _gecko_cmd = 0; diff --git a/main.c b/main.c index 6269271..941253f 100644 --- a/main.c +++ b/main.c @@ -27,7 +27,6 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "sdhcvar.h" #include "string.h" #include "memory.h" -#include "elf.h" #include "gecko.h" #include "ff.h" #include "panic.h" @@ -39,133 +38,10 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #include "nand.h" #include "boot2.h" -typedef struct { - u32 hdrsize; - u32 loadersize; - u32 elfsize; - u32 argument; -} ioshdr; - -u32 match[] = { - 0xF7FFFFB8, - 0xBC024708, - 1, - 2, -}; - -static inline void mem1_poke(u8 *dst, u8 bv) -{ - u32 *p = (u32*)(((u32)dst) & ~3); - u32 val = *p; - - switch(((u32)dst) & 3) { - case 0: - val = (val & 0x00FFFFFF) | bv << 24; - break; - case 1: - val = (val & 0xFF00FFFF) | bv << 16; - break; - case 2: - val = (val & 0xFFFF00FF) | bv << 8; - break; - case 3: - val = (val & 0xFFFFFF00) | bv; - break; - } - - *p = val; -} - -void *memcpy_mem1(void *dst, const void *src, size_t n) -{ - unsigned char *p; - const unsigned char *q; - - for (p = dst, q = src; n; n--) { - mem1_poke(p++, *q++); - } - - return dst; -} - -static void patch_mem(u8 *offset, u32 size, u64 titleID) -{ - while(size>sizeof(match)) { - if(!memcmp(offset, match, sizeof(match))) { - gecko_printf("--> Patching @ %p\n", offset+8); - gecko_printf("--> To TitleID %08x%08x\n", (u32)(titleID>>32), (u32)titleID); - memcpy_mem1(offset+8, &titleID, sizeof(u64)); - return; - } - offset++; - size -= 1; - } -} - -void boot2_patchelf(u8 *elf, u64 titleID) { - gecko_printf("Patching boot2 ELF...\n"); - - if(memcmp("\x7F" "ELF\x01\x02\x01\x61\x01",elf,9)) { - gecko_printf("Invalid ELF header! 0x%02x 0x%02x 0x%02x 0x%02x\n",elf[0], elf[1], elf[2], elf[3]); - return; - } - - Elf32_Ehdr *ehdr = (Elf32_Ehdr*)elf; - if(ehdr->e_phoff == 0) { - gecko_printf("ELF has no program headers!\n"); - return; - } - int count = ehdr->e_phnum; - Elf32_Phdr *phdr = (Elf32_Phdr*)(elf + ehdr->e_phoff); - gecko_printf("PHDRS at %p\n",phdr); - while(count--) - { - if(phdr->p_type != PT_LOAD) { - gecko_printf("Skipping PHDR of type %d\n",phdr->p_type); - } else { - void *src = elf + phdr->p_offset; - gecko_printf("PATCH %p -> %p/%p [0x%x]\n",src, phdr->p_paddr, phdr->p_vaddr, phdr->p_filesz); - if(phdr->p_vaddr == (void*)0x20100000) { - gecko_printf("-> Found ES code PHDR\n"); - patch_mem(src, phdr->p_filesz, titleID); - } - } - phdr++; - } - gecko_printf("Done!\n"); -} - #define PPC_BOOT_FILE "/system/ppcboot.elf" FATFS fatfs; -void *patch_boot2(void *base, u64 titleID) -{ - - ioshdr *hdr = (ioshdr*)base; - ioshdr *parhdr = (ioshdr*)hdr->argument; - u8 *elf; - - gecko_printf("Patching BOOT2 for leet hax\n"); - gecko_printf("Parent BOOT2 header (@%p):\n",parhdr); - gecko_printf(" Header size: %08x\n", parhdr->hdrsize); - gecko_printf(" Loader size: %08x\n", parhdr->loadersize); - gecko_printf(" ELF size: %08x\n", parhdr->elfsize); - gecko_printf(" Argument: %08x\n", parhdr->argument); - - elf = (u8*) parhdr; - elf += parhdr->hdrsize + parhdr->loadersize; - gecko_printf("ELF at %p\n",elf); - - boot2_patchelf(elf, titleID); - - parhdr->argument = 0x42; - - gecko_printf("Vector: %p\n", (void*)(((u32)parhdr) + parhdr->hdrsize)); - - return (void*)(((u32)parhdr) + parhdr->hdrsize); -} - u32 _main(void *base) { FRESULT fres; diff --git a/powerpc_elf.c b/powerpc_elf.c index b83f9a6..bb0d593 100644 --- a/powerpc_elf.c +++ b/powerpc_elf.c @@ -35,13 +35,13 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA static Elf32_Ehdr elfhdr; static Elf32_Phdr phdrs[PHDR_MAX]; -static FIL fd; int powerpc_boot_file(const char *path) { u32 read; + FIL fd; FRESULT fres; - gecko_printf("%s: %08x\n", __FUNCTION__, read32(HW_TIMER)); + fres = f_open(&fd, path, FA_READ); if(fres != FR_OK) return -fres; @@ -133,7 +133,7 @@ int powerpc_boot_mem(const u8 *addr, u32 len) if (ehdr->e_phnum > PHDR_MAX) { gecko_printf("ELF has too many (%d) program headers!\n", - elfhdr.e_phnum); + ehdr->e_phnum); return -102; } @@ -169,3 +169,4 @@ int powerpc_boot_mem(const u8 *addr, u32 len) return 0; } +