/* Legacy16DispatchOprom */ static void handle_csm_0005(struct bregs *regs) { EFI_DISPATCH_OPROM_TABLE *table = MAKE_FLATPTR(regs->es, regs->bx); struct rom_header *rom; u16 bdf; if (!CONFIG_OPTIONROMS) { regs->ax = 1; return; } dprintf(3, "Legacy16DispatchOprom rom %p\n", table); dprintf(3, "OpromSegment %04x\n", table->OpromSegment); dprintf(3, "RuntimeSegment %04x\n", table->RuntimeSegment); dprintf(3, "PnPInstallationCheck %04x:%04x\n", table->PnPInstallationCheckSegment, table->PnPInstallationCheckOffset); dprintf(3, "RuntimeSegment %04x\n", table->RuntimeSegment); rom = MAKE_FLATPTR(table->OpromSegment, 0); bdf = pci_bus_devfn_to_bdf(table->PciBus, table->PciDeviceFunction); rom_reserve(rom->size * 512); // XX PnP seg/ofs should never be other than default callrom(rom, bdf); rom_confirm(rom->size * 512); regs->bx = 0; // FIXME regs->ax = 0; }
/* * Prepare boot information and jump directly to the kernel. */ static void jump_to_kernel(u_long *marks, char *kernel, char *args, void *ofw, int boothowto) { int l, machine_tag; long newargs[4]; void *ssym, *esym; vaddr_t bootinfo; struct btinfo_symtab bi_sym; struct btinfo_kernend bi_kend; struct btinfo_boothowto bi_howto; char *cp; char bootline[PROM_MAX_PATH * 2]; /* Compose kernel boot line. */ strncpy(bootline, kernel, sizeof(bootline)); cp = bootline + strlen(bootline); if (*args) { *cp++ = ' '; strncpy(bootline, args, sizeof(bootline) - (cp - bootline)); } *cp = 0; args = bootline; /* Record symbol information in the bootinfo. */ bootinfo = bi_init(marks[MARK_END]); bi_sym.nsym = marks[MARK_NSYM]; bi_sym.ssym = marks[MARK_SYM]; bi_sym.esym = marks[MARK_END]; bi_add(&bi_sym, BTINFO_SYMTAB, sizeof(bi_sym)); bi_kend.addr= bootinfo + BOOTINFO_SIZE; bi_add(&bi_kend, BTINFO_KERNEND, sizeof(bi_kend)); bi_howto.boothowto = boothowto; bi_add(&bi_howto, BTINFO_BOOTHOWTO, sizeof(bi_howto)); if (bootinfo_pass_bootdev) { struct { struct btinfo_common common; char name[256]; } info; strcpy(info.name, bootdev); bi_add(&info, BTINFO_BOOTDEV, strlen(bootdev) +sizeof(struct btinfo_bootdev)); } sparc64_finalize_tlb(marks[MARK_DATA]); sparc64_bi_add(); ssym = (void*)(long)marks[MARK_SYM]; esym = (void*)(long)marks[MARK_END]; DPRINTF(("jump_to_kernel(): ssym = %p, esym = %p\n", ssym, esym)); /* Adjust ksyms pointers, if needed. */ if (COMPAT_BOOT(marks) || compatmode) { ksyms_copyout(&ssym, &esym); } freeall(); /* * When we come in args consists of a pointer to the boot * string. We need to fix it so it takes into account * other params such as romp. */ /* * Stash pointer to end of symbol table after the argument * strings. */ l = strlen(args) + 1; memcpy(args + l, &esym, sizeof(esym)); l += sizeof(esym); /* * Tell the kernel we're an OpenFirmware system. */ machine_tag = SPARC_MACHINE_OPENFIRMWARE; memcpy(args + l, &machine_tag, sizeof(machine_tag)); l += sizeof(machine_tag); /* * Since we don't need the boot string (we can get it from /chosen) * we won't pass it in. Just pass in esym and magic # */ newargs[0] = SPARC_MACHINE_OPENFIRMWARE; newargs[1] = (long)esym; newargs[2] = (long)ssym; newargs[3] = (long)(void*)bootinfo; args = (char *)newargs; l = sizeof(newargs); /* if -D is set then pause in the PROM. */ if (debug > 1) callrom(); /* * Jump directly to the kernel. Solaris kernel and Sun PROM * flash updates expect ROMP vector in %o0, so we do. Format * of other parameters and their order reflect OF_chain() * symantics since this is what older NetBSD kernels rely on. * (see sparc64/include/bootinfo.h for specification). */ DPRINTF(("jump_to_kernel(%lx, %lx, %lx, %lx, %lx) @ %p\n", (long)ofw, (long)args, (long)l, (long)ofw, (long)ofw, (void*)marks[MARK_ENTRY])); (*(entry_t)marks[MARK_ENTRY])((long)ofw, (long)args, (long)l, (long)ofw, (long)ofw); printf("Returned from kernel entry point!\n"); }
void do_cmd(char *buf, char *ebuf) { switch (*buf) { case '\0': return; case 'a': if (rev_arp()) { printf("My ip address is: %d.%d.%d.%d\n", myip[0], myip[1], myip[2], myip[3]); printf("Server ip address is: %d.%d.%d.%d\n", servip[0], servip[1], servip[2], servip[3]); } else { printf("Failed.\n"); } return; case 'e': printf("exiting to ROM\n"); callrom(); return; case 'f': if (do_get_file() == 1) { printf("Download Failed\n"); } else { printf("Download was a success!\n"); } return; case 'b': le_init(); if (rev_arp()) { printf("My ip address is: %d.%d.%d.%d\n", myip[0], myip[1], myip[2], myip[3]); printf("Server ip address is: %d.%d.%d.%d\n", servip[0], servip[1], servip[2], servip[3]); } else { printf("REVARP: Failed.\n"); return; } if (do_get_file() == 1) { printf("Download Failed\n"); return; } else { printf("Download was a success!\n"); } /*FALLTHROUGH*/ case 'g': printf("Start @ 0x%x ... \n", LOAD_ADDR); go(LOAD_ADDR, buf+1, ebuf); return; case 'h': case '?': printf("valid commands\n"); printf("a - send a RARP\n"); printf("b - boot the system\n"); printf("e - exit to ROM\n"); printf("f - ftp the boot file\n"); printf("g - execute the boot file\n"); printf("h - help\n"); printf("i - init LANCE enet chip\n"); return; case 'i': le_init(); return; default: printf("sboot: %s: Unknown command\n", buf); } }