|
|
1.1 root 1: /* initialize.c - nulluser, sysinit */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <proc.h>
6: #include <sem.h>
7: #include <mem.h>
8: #include <tty.h>
9: #include <q.h>
10: #include <io.h>
11: #include <disk.h>
12: #include <network.h>
13: #include <sleep.h>
14: #include <iospace.h>
15: #include <qbus.h>
16: #include <mach.h>
17:
18: extern int main(); /* address of user's main prog */
19:
20: /* Declarations of major kernel variables */
21:
22: struct pentry proctab[NPROC]; /* process table */
23: int nextproc; /* next process slot to use in create */
24: struct sentry semaph[NSEM]; /* semaphore table */
25: int nextsem; /* next semaphore slot to use in screate*/
26: struct qent q[NQENT]; /* q table (see queue.c) */
27: int nextqueue; /* next slot in q structure to use */
28: int *maxaddr; /* max memory address (set by sizmem) */
29: int machinesid; /* machine system identification */
30: #ifdef NDEVS
31: struct intmap intmap[NDEVS]; /* interrupt dispatch table */
32: #endif
33: struct mblock memlist; /* list of free memory blocks */
34: #ifdef Ntty
35: struct tty tty[Ntty]; /* SLU buffers and mode control */
36: #endif
37:
38: /* active system status */
39:
40: int numproc; /* number of live user processes */
41: int currpid; /* id of currently running process */
42: int reboot = 0; /* non-zero after first boot */
43:
44: int rdyhead,rdytail; /* head/tail of ready list (q indexes) */
45: char *sysid;
46: char vers[] = VERSION; /* Xinu version printed at startup */
47: long iospace; /* Address of I/O space on this VAX */
48:
49: /************************************************************************/
50: /*** NOTE: ***/
51: /*** ***/
52: /*** This is where the system begins after the C environment has ***/
53: /*** been established. Interrupts are initially DISABLED, and ***/
54: /*** must eventually be enabled explicitly. This routine turns ***/
55: /*** itself into the null process after initialization. Because ***/
56: /*** the null process must always remain ready to run, it cannot ***/
57: /*** execute code that might cause it to be suspended, wait for a ***/
58: /*** semaphore, or put to sleep, or exit. In particular, it must ***/
59: /*** not do I/O unless it uses kprintf for polled output. ***/
60: /*** ***/
61: /************************************************************************/
62:
63: /*------------------------------------------------------------------------
64: * nulluser -- initialize system and become the null process (id==0)
65: *------------------------------------------------------------------------
66: */
67: nulluser() /* babysit CPU when no one home */
68: {
69: int userpid;
70:
71: if (isUVAXI) {
72: sysid = UISYSTEM;
73: iospace = IOUVAXI;
74: } else if (isUVAXII) {
75: sysid = UIISYSTEM;
76: iospace = IOUVAXII;
77: } else {
78: sysid = SYSTEM;
79: iospace = IOVAX;
80: }
81: kprintf("\n\n%s Xinu Version %s", sysid, vers);
82: if (reboot++ < 1)
83: kprintf("\n");
84: else
85: kprintf(" (reboot %d)\n", reboot);
86: sysinit(); /* initialize all of Xinu */
87: kprintf("%u real mem\n",(unsigned)maxaddr+(unsigned)sizeof(int));
88: kprintf("%u avail mem\n",
89: (unsigned)maxaddr-(unsigned)(&end)+(unsigned)sizeof(int));
90: kprintf("clock %sabled\n\n", clkruns==1?"en":"dis");
91: enable(); /* enable interrupts */
92:
93: /* create a process to execute the user's main program */
94:
95: userpid = create(main,INITSTK,INITPRIO,INITNAME,INITARGS);
96:
97: #ifdef NETDAEMON
98: /* start the network input daemon process */
99: resume(
100: create(NETIN, NETISTK, NETIPRI, NETINAM, NETIARGC, userpid)
101: );
102: #else
103: resume( userpid );
104: #endif
105:
106: while (TRUE) { /* run forever without actually */
107: pause(); /* executing instructions */
108: }
109: }
110:
111: /*------------------------------------------------------------------------
112: * sysinit -- initialize all Xinu data structures and devices
113: *------------------------------------------------------------------------
114: */
115: LOCAL sysinit()
116: {
117: int i;
118: struct pentry *pptr;
119: struct sentry *sptr;
120: struct mblock *mptr;
121:
122: numproc = 0; /* initialize system variables */
123: nextproc = NPROC-1;
124: nextsem = NSEM-1;
125: nextqueue= NPROC; /* q[0..NPROC-1] are processes */
126:
127: memlist.mnext = mptr = /* initialize free memory list */
128: (struct mblock *) roundew(&end);
129: mptr->mnext = (struct mblock *)NULL;
130: mptr->mlen = (unsigned) truncew ( (unsigned)maxaddr -
131: (int)roundew(NULLSTK) - (unsigned)&end + sizeof(int) );
132:
133: for (i=0 ; i<NPROC ; i++) /* initialize process table */
134: proctab[i].pstate = PRFREE;
135:
136: pptr = &proctab[NULLPROC]; /* initialize null process entry */
137: pptr->pstate = PRCURR;
138: strcpy(pptr->pname, "prnull");
139: pptr->plimit = (int)maxaddr - (int)roundew(NULLSTK) + sizeof(int);
140: pptr->pbase = (int)maxaddr;
141: pptr->pstklen = (int)roundew(NULLSTK);
142: *( (int *)pptr->pbase ) = MAGIC;
143: pptr->paddr = (int)nulluser;
144: pptr->pargs = 0;
145: pptr->pprio = 0;
146: currpid = NULLPROC;
147: /* pptr->pregs was previously initialized (by startup) */
148: for (i=0 ; i<NSEM ; i++) { /* initialize semaphores */
149: (sptr = &semaph[i])->sstate = SFREE;
150: sptr->sqtail = 1 + (sptr->sqhead = newqueue());
151: }
152:
153: rdytail = 1 + (rdyhead=newqueue());/* initialize ready list */
154:
155: #ifdef MEMMARK
156: _mkinit(); /* initialize memory marking */
157: #endif
158: #ifdef RTCLOCK
159: clkinit(); /* initialize r.t.clock */
160: #endif
161: #ifdef Ndsk
162: dskdbp= mkpool(DBUFSIZ,NDBUFF); /* initialize disk buffers */
163: dskrbp= mkpool(DREQSIZ,NDREQ);
164: #endif
165: if (isUVAXII) {
166: qmapinit(); /* init. qbus map regs. */
167: *(short *)QMCPMBX = QMHALT; /* on halt, really halt */
168: }
169: for ( i=0 ; i<NDEVS ; i++ ) { /* initialize devices */
170: devtab[i].dvcsr = iospace | (IOADDRM&devtab[i].dvcsr);
171: init(i);
172: }
173: return(OK);
174: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.