/** * Intializes all Xinu data structures and devices. * @return OK if everything is initialized successfully */ static int sysinit(void) { int i; struct thrent *thrptr; /* thread control block pointer */ struct memblock *pmblock; /* memory block pointer */ /* Initialize system variables */ /* Count this NULLTHREAD as the first thread in the system. */ thrcount = 1; /* Initialize free memory list */ memheap = roundmb(memheap); platform.maxaddr = truncmb(platform.maxaddr); memlist.next = pmblock = (struct memblock *)memheap; memlist.length = (uint)(platform.maxaddr - memheap); pmblock->next = NULL; pmblock->length = (uint)(platform.maxaddr - memheap); /* Initialize thread table */ for (i = 0; i < NTHREAD; i++) { thrtab[i].state = THRFREE; } /* initialize null thread entry */ thrptr = &thrtab[NULLTHREAD]; thrptr->state = THRCURR; thrptr->prio = 0; strlcpy(thrptr->name, "prnull", TNMLEN); thrptr->stkbase = (void *)&_end; thrptr->stklen = (ulong)memheap - (ulong)&_end; thrptr->stkptr = 0; thrptr->memlist.next = NULL; thrptr->memlist.length = 0; thrcurrent = NULLTHREAD; /* Initialize semaphores */ for (i = 0; i < NSEM; i++) { semtab[i].state = SFREE; semtab[i].queue = queinit(); } /* Initialize monitors */ for (i = 0; i < NMON; i++) { montab[i].state = MFREE; } /* Initialize buffer pools */ for (i = 0; i < NPOOL; i++) { bfptab[i].state = BFPFREE; } /* initialize thread ready list */ readylist = queinit(); #if SB_BUS backplaneInit(NULL); #endif /* SB_BUS */ #if RTCLOCK /* initialize real time clock */ clkinit(); #endif /* RTCLOCK */ #ifdef UHEAP_SIZE /* Initialize user memory manager */ { void *userheap; /* pointer to user memory heap */ userheap = stkget(UHEAP_SIZE); if (SYSERR != (int)userheap) { userheap = (void *)((uint)userheap - UHEAP_SIZE + sizeof(int)); memRegionInit(userheap, UHEAP_SIZE); /* initialize memory protection */ safeInit(); /* initialize kernel page mappings */ safeKmapInit(); } } #endif #if USE_TLB /* initialize TLB */ tlbInit(); /* register system call handler */ exceptionVector[EXC_SYS] = syscall_entry; #endif /* USE_TLB */ #if NMAILBOX /* intialize mailboxes */ mailboxInit(); #endif #if NDEVS for (i = 0; i < NDEVS; i++) { devtab[i].init((device*)&devtab[i]); } #endif #ifdef WITH_USB usbinit(); #endif #if NVRAM nvramInit(); #endif #if NNETIF netInit(); #endif #if GPIO gpioLEDOn(GPIO_LED_CISCOWHT); #endif return OK; }
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); }
void boot(int argc, char *argv[]) { int fd, afd; Method *mp; char *cmd, cmdbuf[64], *iargv[16]; char rootbuf[64]; int islocal, ishybrid; char *rp, *rsp, *rdparts; int iargc, n; char buf[32]; AuthInfo *ai; fmtinstall('r', errfmt); /* * we should inherit the standard fds all referring to /dev/cons, * but we're being paranoid. */ close(0); close(1); close(2); 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); if(getenv("debugboot")) debugboot = 1; #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)); /* * set up usb keyboard & mouse, if any. * starts usbd, which mounts itself on /dev. * starts partfs on first disk, if any, to permit nvram on usb. */ usbinit(Dontpost); /* * 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's there. */ kbmap(); /* don't trigger aoe until the network has been configured */ bind("#æ", "/dev", MAFTER); /* nvram could be here */ bind("#S", "/dev", MAFTER); /* nvram could be here */ /* * read disk partition tables here so that readnvram via factotum * can see them. ideally we would have this information in * environment variables before attaching #S, which would then * parse them and create partitions. */ rdparts = getenv("readparts"); if(rdparts) readparts(); free(rdparts); /* * authentication agent * sets hostowner, creating an auth discontinuity */ if(debugboot) fprint(2, "auth..."); authentication(cpuflag); /* leave existing subprocesses in their own namespace */ rfork(RFNAMEG); /* * restart partfs under the new hostowner id */ usbinit(Post); /* * connect to the root file system */ fd = (*mp->connect)(); if(fd < 0) fatal("can't connect to file server"); if(getenv("srvold9p")) fd = old9p(fd); 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) < 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); swapproc(); cmd = getenv("init"); if(cmd == nil){ sprint(cmdbuf, "/%s/init -%s%s", cputype, cpuflag ? "c" : "t", 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], '/')) iargv[0]++; else iargv[0] = cmd; iargv[iargc] = nil; chmod("/srv/" PARTSRV, 0600); exec(cmd, iargv); fatal(cmd); }
void EcuM_AL_DriverInitTwo(const EcuM_ConfigType* ConfigPtr) { (void)ConfigPtr; //lint --e{715} PC-Lint (715) - ConfigPtr usage depends on configuration of modules // VALIDATE_STATE(ECUM_STATE_STARTUP_TWO); #if defined(USE_ETH) buffer_init(); Eth_Init(); #endif //#undef USE_USB #if defined(USE_USB) // usb_heap_init(); // mailboxInit(); // usb_sem_init(); usbinit(); #endif #if defined(USE_SPI) // Setup SPI Spi_Init(ConfigPtr->SpiConfig); #endif #if defined(USE_EEP) // Setup EEP NO_DRIVER(Eep_Init(ConfigPtr->EepConfig)); #endif #if defined(USE_FLS) // Setup Flash NO_DRIVER(Fls_Init(ConfigPtr->FlashConfig)); #endif #if defined(USE_FEE) // Setup FEE NO_DRIVER(Fee_Init()); #endif #if defined(USE_EA) // Setup EA NO_DRIVER(Ea_Init()); #endif #if defined(USE_NVM) // Setup NVRAM Manager and start the read all job NO_DRIVER(NvM_Init()); NO_DRIVER(NvM_ReadAll()); #endif #if defined(USE_LIN) // Setup Lin driver Lin_Init(ConfigPtr->LinConfig); #endif #if defined(USE_LINIF) // Setup LinIf LinIf_Init(ConfigPtr->LinIfConfig); #endif #if defined(USE_LINSM) // Setup LinSM LinSM_Init(ConfigPtr->LinSMConfig); #endif // Setup CAN tranceiver // TODO #if defined(USE_CAN) // Setup Can driver Can_Init(ConfigPtr->CanConfig); #endif #if defined(USE_CANIF) // Setup CanIf NO_DRIVER(CanIf_Init(ConfigPtr->PostBuildConfig->CanIf_ConfigPtr)); #endif #if defined(USE_CANTP) // Setup CAN TP NO_DRIVER(CanTp_Init(ConfigPtr->PostBuildConfig->CanTp_ConfigPtr)); #endif #if defined(USE_CANSM) NO_DRIVER(CanSM_Init(ConfigPtr->CanSMConfig)); #endif #if defined(USE_J1939TP) // Setup J1939Tp NO_DRIVER(J1939Tp_Init(ConfigPtr->J1939TpConfig)); #endif // Setup LIN // TODO #if defined(USE_PDUR) // Setup PDU Router NO_DRIVER(PduR_Init(ConfigPtr->PostBuildConfig->PduR_ConfigPtr)); #endif #if defined(USE_CANNM) // Setup Can Network Manager NO_DRIVER(CanNm_Init(ConfigPtr->PostBuildConfig->CanNm_ConfigPtr)); #endif #if defined(USE_UDPNM) // Setup Udp Network Manager NO_DRIVER(UdpNm_Init(ConfigPtr->UdpNmConfig)); #endif #if defined(USE_NM) // Setup Network Management Interface NO_DRIVER(Nm_Init()); #endif #if defined(USE_COM) // Setup COM layer NO_DRIVER(Com_Init(ConfigPtr->PostBuildConfig->ComConfigurationPtr)); #endif #if defined(USE_DCM) // Setup DCM NO_DRIVER(Dcm_Init(ConfigPtr->DcmConfig)); #endif #if defined(USE_IOHWAB) // Setup IO hardware abstraction layer IoHwAb_Init(); #endif }