void app_booter_main(void) { void *exeBuffer = (void *) EXECUTABLE_MEM_ADDR; u32 exeEntryPointAddress = 0; entrypoint exeEntryPoint; if (valid_elf_image(exeBuffer) == 1) exeEntryPointAddress = load_elf_image(exeBuffer); else exeEntryPointAddress = load_dol_image(exeBuffer); exeEntryPoint = (entrypoint) exeEntryPointAddress; if (!exeEntryPoint) return; if (SYSTEM_ARGV->argvMagic == ARGV_MAGIC) { void *new_argv = (void *) (exeEntryPointAddress + 8); memcpy(new_argv, SYSTEM_ARGV, sizeof(struct __argv)); sync_before_exec(new_argv, sizeof(struct __argv)); } exeEntryPoint (); }
void vm_create ( struct vm *vm, unsigned long guest_image_start, unsigned long guest_image_size, unsigned long vm_pmem_size ) { struct vmcb *vmcb; /* Allocate a new page for storing VMCB. */ vmcb = alloc_vmcb ( ); vm->vmcb = vmcb; set_control_area ( vm->vmcb ); set_state_save_area ( vm->vmcb ); /* Allocate new pages for physical memory of the guest OS. */ const unsigned long vm_pmem_start = alloc_vm_pmem ( vm_pmem_size ); /* Set Host-level CR3 to use for nested paging. */ vm->h_cr3 = create_vm_pmem_mapping_table ( vm_pmem_start, vm_pmem_size ); vmcb->h_cr3 = vm->h_cr3; /* Copy the OS image to the specified region by interpreting the ELF format. */ vmcb->rip = load_elf_image ( guest_image_start, guest_image_size, vm_pmem_start ); /* Setup multiboot info. */ vm->mbi = init_vm_mbi ( vm_pmem_start ); create_temp_page_table ( vm_pmem_start, vmcb->cr3 ); printf ( "New virtual machine created.\n" ); }
int monte_load_linux_kernel(struct monte_boot_t *boot, const void *buffer, long size) { int err = -1; void *buffer2; long size2; if (gunzip(buffer, size, &buffer2, &size2) != 0) { /* decompression failed - try to load directly */ buffer2 = (void*)buffer; size2 = size; } /* try it as a simple ELF image */ err = load_elf_image(boot, buffer2, size2); if (buffer2 != buffer) free(buffer2); /* free it if necessary */ return err; }
int BootHomebrewFromMem() { loadStub(); if (Set_Stub_Split(0x00010001,"UNEO")<0) Set_Stub_Split(0x00010001,"ULNR"); entrypoint entry; u32 cpu_isr; if (!innetbuffer) { SDCard_deInit(); USBDevice_deInit(); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } struct __argv args; int ret = valid_elf_image(innetbuffer); if (ret == 1) entry = (entrypoint) load_elf_image(innetbuffer); else entry = (entrypoint) load_dol(innetbuffer, &args); free(innetbuffer); if (!entry) { SDCard_deInit(); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } SDCard_deInit(); WPAD_Flush(0); WPAD_Disconnect(0); WPAD_Shutdown(); SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); _CPU_ISR_Disable (cpu_isr); __exception_closeall(); entry(); _CPU_ISR_Restore (cpu_isr); return 0; }
/* ====================================================================== * Interpreter command to boot an arbitrary ELF image from memory. * ====================================================================== */ int do_bootelf (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { unsigned long addr; /* Address of the ELF image */ unsigned long rc; /* Return value from user code */ /* -------------------------------------------------- */ int rcode = 0; if (argc < 2) addr = load_addr; else addr = simple_strtoul (argv[1], NULL, 16); if (!valid_elf_image (addr)) return 1; addr = load_elf_image (addr); printf ("## Starting application at 0x%08lx ...\n", addr); /* * QNX images require the data cache is disabled. * Data cache is already flushed, so just turn it off. */ if (dcache_status ()) dcache_disable (); /* * pass address parameter as argv[0] (aka command name), * and all remaining args */ rc = ((ulong (*)(int, char *[])) addr) (--argc, &argv[1]); if (rc != 0) rcode = 1; printf ("## Application terminated, rc = 0x%lx\n", rc); return rcode; }
int main(int argc, char **argv) { u32 cookie; FILE *exeFile = NULL; void *exeBuffer = (void *)EXECUTABLE_MEM_ADDR; int exeSize = 0; u32 exeEntryPointAddress = 0; entrypoint exeEntryPoint; /* int videomod */ InitVideo(); /* get imagedata */ u8 * imgdata = GetImageData(); /* fadein of image */ for(int i = 0; i < 255; i = i+10) { if(i>255) i = 255; Background_Show(0, 0, 0, imgdata, 0, 1, 1, i); Menu_Render(); } /* check devices */ SDCard_Init(); USBDevice_Init(); char cfgpath[256]; /* Open dol File and check exist */ sprintf(cfgpath, PATH1); exeFile = fopen (cfgpath ,"rb"); if (exeFile==NULL) { sprintf(cfgpath, PATH2); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH3); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH4); exeFile = fopen (cfgpath ,"rb"); } if (PACK2) { if (exeFile==NULL) { sprintf(cfgpath, PATH5); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH6); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH7); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH8); exeFile = fopen (cfgpath ,"rb"); } } if (PACK3) { if (exeFile==NULL) { sprintf(cfgpath, PATH9); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH10); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH11); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH12); exeFile = fopen (cfgpath ,"rb"); } } if (PACK4) { if (exeFile==NULL) { sprintf(cfgpath, PATH13); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH14); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH15); exeFile = fopen (cfgpath ,"rb"); } if (exeFile==NULL) { sprintf(cfgpath, PATH16); exeFile = fopen (cfgpath ,"rb"); } } // if nothing found exiting if (exeFile==NULL) { printf("\n\n\t\tCan't find DOL File...\n"); Menu_Render(); sleep(3); fclose (exeFile); SDCard_deInit(); USBDevice_deInit(); StopGX(); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } fseek (exeFile, 0, SEEK_END); exeSize = ftell(exeFile); fseek (exeFile, 0, SEEK_SET); if(fread (exeBuffer, 1, exeSize, exeFile) != (unsigned int) exeSize) { printf("\n\n\t\tCan't open DOL File...\n"); Menu_Render(); fclose (exeFile); sleep(3); SDCard_deInit(); USBDevice_deInit(); StopGX(); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } fclose (exeFile); /* load entry point */ struct __argv args; bzero(&args, sizeof(args)); args.argvMagic = ARGV_MAGIC; args.length = strlen(cfgpath) + 2; args.commandLine = (char*)malloc(args.length); if (!args.commandLine) SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); strcpy(args.commandLine, cfgpath); args.commandLine[args.length - 1] = '\0'; args.argc = 1; args.argv = &args.commandLine; args.endARGV = args.argv + 1; int ret = valid_elf_image(exeBuffer); if (ret == 1) exeEntryPointAddress = load_elf_image(exeBuffer); else exeEntryPointAddress = load_dol_image(exeBuffer, &args); /* fadeout of image */ for(int i = 255; i > 1; i = i-7) { if(i < 0) i = 0; Background_Show(0, 0, 0, imgdata, 0, 1, 1, i); Menu_Render(); } SDCard_deInit(); USBDevice_deInit(); StopGX(); if (exeEntryPointAddress == 0) { printf("EntryPointAddress failed...\n"); Menu_Render(); sleep(3); fclose (exeFile); SDCard_deInit(); USBDevice_deInit(); StopGX(); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0);; } exeEntryPoint = (entrypoint) exeEntryPointAddress; /* cleaning up and load dol */ SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); _CPU_ISR_Disable (cookie); __exception_closeall (); exeEntryPoint (); _CPU_ISR_Restore (cookie); return 0; }
int BootHomebrew(char * path) { loadStub(); if (Set_Stub_Split(0x00010001,"UNEO")<0) Set_Stub_Split(0x00010001,"ULNR"); void *buffer = NULL; u32 filesize = 0; entrypoint entry; u32 cpu_isr; FILE * file = fopen(path, "rb"); if (!file) SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); fseek (file, 0, SEEK_END); filesize = ftell(file); rewind(file); buffer = malloc(filesize); if (fread (buffer, 1, filesize, file) != filesize) { fclose (file); free(buffer); SDCard_deInit(); USBDevice_deInit(); SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } fclose (file); struct __argv args; bzero(&args, sizeof(args)); args.argvMagic = ARGV_MAGIC; args.length = strlen(path) + 2; args.commandLine = (char*)malloc(args.length); if (!args.commandLine) SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); strcpy(args.commandLine, path); args.commandLine[args.length - 1] = '\0'; args.argc = 1; args.argv = &args.commandLine; args.endARGV = args.argv + 1; int ret = valid_elf_image(buffer); if (ret == 1) entry = (entrypoint) load_elf_image(buffer); else entry = (entrypoint) load_dol(buffer, &args); free(buffer); SDCard_deInit(); USBDevice_deInit(); if (!entry) { SYS_ResetSystem(SYS_RETURNTOMENU, 0, 0); } WPAD_Flush(0); WPAD_Disconnect(0); WPAD_Shutdown(); SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); _CPU_ISR_Disable (cpu_isr); __exception_closeall(); entry(); _CPU_ISR_Restore (cpu_isr); return 0; }
void do_load(int argc, char *argv[]) { int res, num_options; int i, err; bool verbose, raw; bool base_addr_set, mode_str_set; char *mode_str; #ifdef CYGPKG_REDBOOT_NETWORKING struct sockaddr_in host; bool hostname_set, port_set; unsigned int port; // int because it's an OPTION_ARG_TYPE_NUM, // but will be cast to short char *hostname; #endif #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH bool flash_addr_set = false; #endif bool decompress = false; int chan = -1; #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1 bool chan_set; #endif unsigned long base = 0; unsigned long end = 0; char type[4]; char *filename = 0; struct option_info opts[9]; connection_info_t info; getc_io_funcs_t *io = NULL; struct load_io_entry *io_tab; #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS bool spillover_ok = false; #endif #ifdef CYGPKG_REDBOOT_NETWORKING memset((char *)&host, 0, sizeof(host)); host.sin_len = sizeof(host); host.sin_family = AF_INET; host.sin_addr = my_bootp_info.bp_siaddr; host.sin_port = 0; #endif init_opts(&opts[0], 'v', false, OPTION_ARG_TYPE_FLG, (void *)&verbose, 0, "verbose"); init_opts(&opts[1], 'r', false, OPTION_ARG_TYPE_FLG, (void *)&raw, 0, "load raw data"); init_opts(&opts[2], 'b', true, OPTION_ARG_TYPE_NUM, (void *)&base, (bool *)&base_addr_set, "load address"); init_opts(&opts[3], 'm', true, OPTION_ARG_TYPE_STR, (void *)&mode_str, (bool *)&mode_str_set, "download mode (TFTP, xyzMODEM, or disk)"); num_options = 4; #if CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS > 1 init_opts(&opts[num_options], 'c', true, OPTION_ARG_TYPE_NUM, (void *)&chan, (bool *)&chan_set, "I/O channel"); num_options++; #endif #ifdef CYGPKG_REDBOOT_NETWORKING init_opts(&opts[num_options], 'h', true, OPTION_ARG_TYPE_STR, (void *)&hostname, (bool *)&hostname_set, "host name or IP address"); num_options++; init_opts(&opts[num_options], 'p', true, OPTION_ARG_TYPE_NUM, (void *)&port, (bool *)&port_set, "TCP port"); num_options++; #endif #ifdef CYGBLD_BUILD_REDBOOT_WITH_ZLIB init_opts(&opts[num_options], 'd', false, OPTION_ARG_TYPE_FLG, (void *)&decompress, 0, "decompress"); num_options++; #endif #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH init_opts(&opts[num_options], 'f', true, OPTION_ARG_TYPE_NUM, (void *)&base, (bool *)&flash_addr_set, "flash address"); num_options++; #endif CYG_ASSERT(num_options <= NUM_ELEMS(opts), "Too many options"); if (!scan_opts(argc, argv, 1, opts, num_options, (void *)&filename, OPTION_ARG_TYPE_STR, "file name")) { return; } #ifdef CYGPKG_REDBOOT_NETWORKING if (hostname_set) { ip_route_t rt; if (!_gethostbyname(hostname, (in_addr_t *)&host)) { err_printf("Invalid host: %s\n", hostname); return; } /* check that the host can be accessed */ if (__arp_lookup((ip_addr_t *)&host.sin_addr, &rt) < 0) { err_printf("Unable to reach host %s (%s)\n", hostname, inet_ntoa((in_addr_t *)&host)); return; } } if (port_set) host.sin_port = port; #endif if (chan >= CYGNUM_HAL_VIRTUAL_VECTOR_NUM_CHANNELS) { err_printf("Invalid I/O channel: %d\n", chan); return; } if (mode_str_set) { for (io_tab = __RedBoot_LOAD_TAB__; io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { if (strncasecmp(&mode_str[0], io_tab->name, strlen(&mode_str[0])) == 0) { io = io_tab->funcs; break; } } if (!io) { diag_printf("Invalid 'mode': %s. Valid modes are:", mode_str); for (io_tab = __RedBoot_LOAD_TAB__; io_tab != &__RedBoot_LOAD_TAB_END__; io_tab++) { diag_printf(" %s", io_tab->name); } err_printf("\n"); } if (!io) { return; } verbose &= io_tab->can_verbose; if (io_tab->need_filename && !filename) { diag_printf("File name required\n"); err_printf("usage: load %s\n", usage); return; } } else { char *which = ""; io_tab = (struct load_io_entry *)NULL; // Default #ifdef CYGPKG_REDBOOT_NETWORKING #ifdef CYGSEM_REDBOOT_NET_TFTP_DOWNLOAD which = "TFTP"; io = &tftp_io; #elif defined(CYGSEM_REDBOOT_NET_HTTP_DOWNLOAD) which = "HTTP"; io = &http_io; #endif #endif #if 0 //def CYGPKG_REDBOOT_FILEIO // Make file I/O default if mounted if (fileio_mounted) { which = "file"; io = &fileio_io; } #endif if (!io) { #ifdef CYGBLD_BUILD_REDBOOT_WITH_XYZMODEM which = "Xmodem"; io = &xyzModem_io; verbose = false; #else err_printf("No default protocol!\n"); return; #endif } diag_printf("Using default protocol (%s)\n", which); } #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH if (flash_addr_set && flash_verify_addr((unsigned char *)base)) { if (!verify_action("Specified address (%p) is not believed to be in FLASH", (void*)base)) return; spillover_ok = true; } #endif if (base_addr_set && !valid_address((unsigned char *)base)) { if (!verify_action("Specified address (%p) is not believed to be in RAM", (void*)base)) return; spillover_ok = true; } #endif if (raw && !(base_addr_set #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH || flash_addr_set #endif )) { err_printf("Raw load requires a memory address\n"); return; } info.filename = filename; info.chan = chan; info.mode = io_tab ? io_tab->mode : 0; #ifdef CYGPKG_REDBOOT_NETWORKING info.server = &host; #endif res = redboot_getc_init(&info, io, verbose, decompress); if (res < 0) { return; } #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH flash_load_start(); #endif // Stream open, process the data if (raw) { unsigned char *mp = (unsigned char *)base; err = 0; while ((res = redboot_getc()) >= 0) { #ifdef CYGSEM_REDBOOT_VALIDATE_USER_RAM_LOADS #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH if (flash_addr_set && flash_verify_addr(mp) && !spillover_ok) { // Only if there is no need to stop the download // before printing output can we ask confirmation // questions. redboot_getc_terminate(true); err_printf("*** Abort! RAW data spills over limit of FLASH at %p\n",(void*)mp); err = -1; break; } #endif if (base_addr_set && !valid_address(mp) && !spillover_ok) { // Only if there is no need to stop the download // before printing output can we ask confirmation // questions. redboot_getc_terminate(true); err_printf("*** Abort! RAW data spills over limit of user RAM at %p\n",(void*)mp); err = -1; break; } #endif #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH if (flash_addr_set) { flash_load_write(mp, res); mp++; res++; } else #endif *mp++ = res; } end = (unsigned long) mp; // Save load base/top load_address = base; load_address_end = end; entry_address = base; // best guess redboot_getc_terminate(false); if (0 == err) diag_printf("Raw file loaded %p-%p, assumed entry at %p\n", (void *)base, (void *)(end - 1), (void*)base); } else { // Read initial header - to determine file [image] type for (i = 0; i < sizeof(type); i++) { if ((res = redboot_getc()) < 0) { err = getc_info.err; break; } type[i] = res; } if (res >= 0) { redboot_getc_rewind(); // Restore header to stream // Treat data as some sort of executable image if (strncmp(&type[1], "ELF", 3) == 0) { end = load_elf_image(redboot_getc, base); } else if ((type[0] == 'S') && ((type[1] >= '0') && (type[1] <= '9'))) { end = load_srec_image(redboot_getc, base); } else { redboot_getc_terminate(true); err_printf("Unrecognized image type: 0x%lx\n", *(unsigned long *)type); } } } #ifdef CYGBLD_REDBOOT_LOAD_INTO_FLASH flash_load_finish(); #endif redboot_getc_close(); // Clean up return; }
int main(void) { // slot LED write32(0xcd8000c0, 0x20); dsp_reset(); exception_init(); // Install trampoline at 80001800; some payloads like to jump // there to restart. Sometimes this can even work. //memcpy(trampoline_buffer, reboot_trampoline, sizeof(reboot_trampoline)); // Clear interrupt mask. write32(0x0c003004, 0); // Unlock EXI. write32(0x0d00643c, 0); video_init(); usbgecko_init(); printf("savezelda\n%s\n", version); printf("\n"); printf("Copyright 2008,2009 Segher Boessenkool\n"); printf("Copyright 2008 Haxx Enterprises\n"); printf("Copyright 2008 Hector Martin (\"marcan\")\n"); printf("Copyright 2003,2004 Felix Domke\n"); printf("\n"); printf("This code is licensed to you under the terms of the\n"); printf("GNU GPL, version 2; see the file COPYING\n"); printf("\n"); printf("Font and graphics by Freddy Leitner\n"); printf("\n"); printf("\n"); printf("Cleaning up environment... "); reset_ios(); printf("OK.\n"); int err; restart: err = try_sd_load(); if (err) { err = try_usbgecko_load(); if (err) { printf("No code found to load, hanging.\n"); for (;;) ; } } if (valid_elf_image(code_buffer)) { printf("Valid ELF image detected.\n"); void (*entry)() = load_elf_image(code_buffer); entry(); printf("Program returned to loader, reloading.\n"); } else printf("No valid ELF image detected, retrying.\n"); goto restart; }
int BootHomebrew() { char* abuf; size_t asize; if(homebrewsize == 0) return -1; entrypoint entry; u32 cpu_isr; arg_init(); if (wiiload_args) { abuf = temp_arg; asize = strlen(abuf); while (asize != 0) { xprintf("argument = %s\n",abuf); arg_add(abuf); abuf+=asize; abuf+=1; asize = strlen(abuf); } } else { arg_add(filepath.c_str()); // argv[0] = filepath while(parser(Settings.forwarder_arg, "<arg>", "</arg>") != "") { arg_add(parser(Settings.forwarder_arg, "<arg>", "</arg>").c_str()); Settings.forwarder_arg.erase(0, Settings.forwarder_arg.find("</arg>") +1); } } if ( valid_elf_image(homebrewbuffer) == 1 ) entry = (entrypoint) load_elf_image(homebrewbuffer); else entry = (entrypoint) load_dol(homebrewbuffer, &args); if (!entry) return -1; //ExitApp(); //we can't use check_uneek_fs //as we already shut down the uneek_fs system //so it will always return false if (in_neek == false) { xprintf("Booting Homebrew"); if(wiiload) { xprintf(" via wiiload\n"); if(Options.wiiload_ahb == 2) { xprintf("with HW_AHBPROT\n"); Patch_ahbprot(); } if(Options.wiiload_ahb != 0) { xprintf("with IOS reload\n"); IOS_ReloadIOS(Options.wiiload_ios); } else xprintf("without reloading IOS\n"); } else { xprintf(" from storage device\n"); if(Settings.force_reload == "HW_AHBPROT") { xprintf("with HW_AHBPROT\n"); Patch_ahbprot(); } if(Settings.force_reload != "NORELOAD") { xprintf("with IOS reload\n"); IOS_ReloadIOS(SelectedIOS()); } else xprintf("without IOS reload\n"); } } wiiload_args = 0; /*this will also be called when wiiloading an application will need to check if it's expected behavour? */ /* if(!wiiload_args) { if(SelectedIOS() != IOS_GetVersion() || Settings.force_reload != "") { //keep ahbprot rights in new ios Patch_ahbprot(); IOS_ReloadIOS(SelectedIOS()); } } wiiload_args = 0; */ SYS_ResetSystem(SYS_SHUTDOWN, 0, 0); _CPU_ISR_Disable (cpu_isr); __exception_closeall(); entry(); _CPU_ISR_Restore (cpu_isr); return 0; }
/* ====================================================================== * Interpreter command to boot VxWorks from a memory image. The image can * be either an ELF image or a raw binary. Will attempt to setup the * bootline and other parameters correctly. * ====================================================================== */ int do_bootvx (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { unsigned long addr; /* Address of image */ unsigned long bootaddr; /* Address to put the bootline */ char *bootline; /* Text of the bootline */ char *tmp; /* Temporary char pointer */ #if defined(CONFIG_4xx) || defined(CONFIG_IOP480) char build_buf[80]; /* Buffer for building the bootline */ #endif /* -------------------------------------------------- */ /* * Check the loadaddr variable. * If we don't know where the image is then we're done. */ if (argc < 2) addr = load_addr; else addr = simple_strtoul (argv[1], NULL, 16); #if (CONFIG_COMMANDS & CFG_CMD_NET) /* Check to see if we need to tftp the image ourselves before starting */ if ((argc == 2) && (strcmp (argv[1], "tftp") == 0)) { if (NetLoop (TFTP) <= 0) return 1; printf ("Automatic boot of VxWorks image at address 0x%08lx ... \n", addr); } #endif /* This should equate * to NV_RAM_ADRS + NV_BOOT_OFFSET + NV_ENET_OFFSET * from the VxWorks BSP header files. * This will vary from board to board */ #if defined(CONFIG_WALNUT) tmp = (char *) CFG_NVRAM_BASE_ADDR + 0x500; memcpy ((char *) tmp, (char *) &gd->bd->bi_enetaddr[3], 3); #elif defined(CFG_VXWORKS_MAC_PTR) tmp = (char *) CFG_VXWORKS_MAC_PTR; memcpy ((char *) tmp, (char *) &gd->bd->bi_enetaddr[0], 6); #else puts ("## Ethernet MAC address not copied to NV RAM\n"); #endif /* * Use bootaddr to find the location in memory that VxWorks * will look for the bootline string. The default value for * PowerPC is LOCAL_MEM_LOCAL_ADRS + BOOT_LINE_OFFSET which * defaults to 0x4200 */ if ((tmp = getenv ("bootaddr")) == NULL) bootaddr = 0x4200; else bootaddr = simple_strtoul (tmp, NULL, 16); /* * Check to see if the bootline is defined in the 'bootargs' * parameter. If it is not defined, we may be able to * construct the info */ if ((bootline = getenv ("bootargs")) != NULL) { memcpy ((void *) bootaddr, bootline, MAX(strlen(bootline), 255)); flush_cache (bootaddr, MAX(strlen(bootline), 255)); } else { #if defined(CONFIG_4xx) sprintf (build_buf, "ibmEmac(0,0)"); if ((tmp = getenv ("hostname")) != NULL) { sprintf (&build_buf[strlen (build_buf - 1)], "host:%s ", tmp); } else { sprintf (&build_buf[strlen (build_buf - 1)], ": "); } if ((tmp = getenv ("ipaddr")) != NULL) { sprintf (&build_buf[strlen (build_buf - 1)], "e=%s ", tmp); } memcpy ((void *)bootaddr, build_buf, MAX(strlen(build_buf), 255)); flush_cache (bootaddr, MAX(strlen(build_buf), 255)); #elif defined(CONFIG_IOP480) sprintf (build_buf, "dc(0,0)"); if ((tmp = getenv ("hostname")) != NULL) { sprintf (&build_buf[strlen (build_buf - 1)], "host:%s ", tmp); } else { sprintf (&build_buf[strlen (build_buf - 1)], ": "); } if ((tmp = getenv ("ipaddr")) != NULL) { sprintf (&build_buf[strlen (build_buf - 1)], "e=%s ", tmp); } memcpy ((void *) bootaddr, build_buf, MAX(strlen(build_buf), 255)); flush_cache (bootaddr, MAX(strlen(build_buf), 255)); #else /* * I'm not sure what the device should be for other * PPC flavors, the hostname and ipaddr should be ok * to just copy */ puts ("No bootargs defined\n"); return 1; #endif } /* * If the data at the load address is an elf image, then * treat it like an elf image. Otherwise, assume that it is a * binary image */ if (valid_elf_image (addr)) { addr = load_elf_image (addr); } else { puts ("## Not an ELF image, assuming binary\n"); /* leave addr as load_addr */ } printf ("## Using bootline (@ 0x%lx): %s\n", bootaddr, (char *) bootaddr); printf ("## Starting vxWorks at 0x%08lx ...\n", addr); ((void (*)(void)) addr) (); puts ("## vxWorks terminated\n"); return 1; }
//--------------------------------------------------------------------------------- int main(int argc, char **argv) { //--------------------------------------------------------------------------------- #ifdef DEBUG init_video_and_wpad(); printf("::: Configurable USB Loader - Forwarder Universal [SD/USB] by Narolez :::\n\n"); #endif // create a buffer for the elf/dol content void* myBuffer; // read elf/dol from given path: FILE* inputFile; // try loading from SD inputFile = tryOpenDolFromSD(); // dol file on SD not found if(inputFile == NULL) { // try loading from USB inputFile = tryOpenDolFromUSB(); } // dol file on SD or USB not found if(inputFile == NULL) { init_video_and_wpad(); printf("\nError: Couldn't open file!\n"); printf("Press any button to reboot Wii...\n"); press_button_to_reboot(); } #ifdef DEBUG printf("\n[+] Loading %s to buffer ... ", filename); #endif int pos = ftell(inputFile); fseek(inputFile, 0, SEEK_END); int size = ftell(inputFile); fseek(inputFile, pos, SEEK_SET); //return to previous position myBuffer = malloc(size); fread( myBuffer, 1, size, inputFile); fclose(inputFile); #ifdef DEBUG printf("OK!\n"); #endif release_storage(); #ifdef DEBUG printf("\n[+] Running ... "); #endif //Check if valid elf file: s32 res; res = valid_elf_image(myBuffer); if(res == 1) { //elf ok! -> Load entry point of elf file: void (*ep)(); ep = (void(*)())load_elf_image(myBuffer); // code from geckoloader u32 level; __IOS_ShutdownSubsystems (); //printf("IOS_ShutdownSubsystems() done\n"); _CPU_ISR_Disable (level); //printf("_CPU_ISR_Disable() done\n"); __exception_closeall (); //printf("__exception_closeall() done. Jumping to ep now...\n"); ep(); _CPU_ISR_Restore (level); } else { //Elf not valid, load dol: //Stuff for arguments struct __argv argv; bzero(&argv, sizeof(argv)); argv.argvMagic = ARGV_MAGIC; argv.length = strlen(filename) + 2; argv.commandLine = malloc(argv.length); if (!argv.commandLine) { init_video_and_wpad(); printf("Error creating arguments, could not allocate memory for commandLine\n"); printf("Press any button to reboot Wii...\n"); press_button_to_reboot(); } strcpy(argv.commandLine, filename); argv.commandLine[argv.length - 1] = '\x00'; argv.argc = 1; argv.argv = &argv.commandLine; argv.endARGV = argv.argv + 1; run_dol(myBuffer, &argv); } #ifdef DEBUG printf("HAVE FUN!"); #endif return 0; }