static int32_t irqmapwrite(Chan* c, void *buf, int32_t n, int64_t offset) { int acpiirq(uint32_t tbdf, int irq); int t, b, d, f, irq; int *p[] = {&t, &b, &d, &f, &irq}; Cmdbuf *cb; cb = parsecmd(buf, n); if (cb->nf < nelem(p)) error("iprqmapwrite t b d f irq"); for(int i = 0; i < nelem(p); i++) *p[i] = strtoul(cb->f[i], 0, 0); acpiirq(MKBUS(t, b, d, f), irq); return -1; }
void boot(int argc, char *argv[]) { int fd, afd, srvt; Method *mp; char *cmd, cmdbuf[64], *iargv[16]; char rootbuf[64]; int islocal, ishybrid; char *rp, *rsp; int iargc, n; char buf[32]; AuthInfo *ai; fmtinstall('r', errfmt); bind("#c", "/dev", MBEFORE); open("/dev/cons", OREAD); open("/dev/cons", OWRITE); open("/dev/cons", OWRITE); /* * init will reinitialize its namespace. * #ec gets us plan9.ini settings (*var variables). */ bind("#ec", "/env", MREPL); bind("#e", "/env", MBEFORE|MCREATE); bind("#s", "/srv", MREPL|MCREATE); bind("#p", "/proc", MREPL|MCREATE); print("\nHello, I am Harvey :-)\n\n"); #ifdef DEBUG print("argc=%d\n", argc); for(fd = 0; fd < argc; fd++) print("%#p %s ", argv[fd], argv[fd]); print("\n"); #endif //DEBUG ARGBEGIN{ case 'k': kflag = 1; break; case 'm': mflag = 1; break; case 'f': fflag = 1; break; }ARGEND readfile("#e/cputype", cputype, sizeof(cputype)); readfile("#e/service", service, sizeof(service)); /* Do the initial ACPI interrupt setup work. * If we don't do this we may not get needed * interfaces. */ if (getenv("acpiirq")) acpiirq(); /* * set up usb keyboard, mouse and disk, if any. */ usbinit(); print("usbinit done\n"); /* * pick a method and initialize it */ if(method[0].name == nil) fatal("no boot methods"); mp = rootserver(argc ? *argv : 0); (*mp->config)(mp); islocal = strcmp(mp->name, "local") == 0; ishybrid = strcmp(mp->name, "hybrid") == 0; /* * load keymap if it is there. */ kbmap(); /* * authentication agent */ authentication(cpuflag); print("connect..."); /* * connect to the root file system */ fd = (*mp->connect)(); if(fd < 0) fatal("can't connect to file server"); if(!islocal && !ishybrid){ if(cfs) fd = (*cfs)(fd); } print("version..."); buf[0] = '\0'; n = fversion(fd, 0, buf, sizeof buf); if(n < 0) fatal("can't init 9P"); srvcreate("boot", fd); /* * create the name space, mount the root fs */ if(bind("/", "/", MREPL) < 0) fatal("bind /"); rp = getenv("rootspec"); if(rp == nil) rp = ""; afd = fauth(fd, rp); if(afd >= 0){ ai = auth_proxy(afd, auth_getkey, "proto=p9any role=client"); if(ai == nil) print("authentication failed (%r), trying mount anyways\n"); } if(mount(fd, afd, "/root", MREPL|MCREATE, rp, 'M') < 0) fatal("mount /"); rsp = rp; rp = getenv("rootdir"); if(rp == nil) rp = rootdir; if(bind(rp, "/", MAFTER|MCREATE) < 0){ if(strncmp(rp, "/root", 5) == 0){ fprint(2, "boot: couldn't bind $rootdir=%s to root: %r\n", rp); fatal("second bind /"); } snprint(rootbuf, sizeof rootbuf, "/root/%s", rp); rp = rootbuf; if(bind(rp, "/", MAFTER|MCREATE) < 0){ fprint(2, "boot: couldn't bind $rootdir=%s to root: %r\n", rp); if(strcmp(rootbuf, "/root//plan9") == 0){ fprint(2, "**** warning: remove rootdir=/plan9 entry from plan9.ini\n"); rp = "/root"; if(bind(rp, "/", MAFTER|MCREATE) < 0) fatal("second bind /"); }else fatal("second bind /"); } } close(fd); setenv("rootdir", rp); settime(islocal, afd, rsp); if(afd > 0) close(afd); cmd = getenv("init"); srvt = strcmp(service, "terminal"); if(cmd == nil){ if(!srvt) { sprint(cmdbuf, "/%s/bin/init -%s%s", cputype, "t", mflag ? "m" : ""); cmd = cmdbuf; } else { sprint(cmdbuf, "/%s/bin/init -%s%s", cputype, "c", mflag ? "m" : ""); cmd = cmdbuf; } } iargc = tokenize(cmd, iargv, nelem(iargv)-1); cmd = iargv[0]; /* make iargv[0] basename(iargv[0]) */ if((iargv[0] = strrchr(iargv[0], '/')) != nil) iargv[0]++; else iargv[0] = cmd; iargv[iargc] = nil; exec(cmd, iargv); fatal(cmd); }