--- xinu/sys/create.c 2018/04/24 17:39:04 1.1 +++ xinu/sys/create.c 2018/04/24 17:40:07 1.1.1.2 @@ -3,6 +3,7 @@ #include #include #include +#include #include /*------------------------------------------------------------------------ @@ -11,63 +12,59 @@ */ SYSCALL create(procaddr,ssize,priority,name,nargs,args) int *procaddr; /* procedure address */ - int ssize; /* stack size in bytes */ - int priority; /* process priority > 0 */ + int ssize; /* stack size in words */ + int priority; /* process priority >= 0 */ char *name; /* name (for debugging) */ int nargs; /* number of args that follow */ - int args; /* arguments (treated like an */ + WORD args; /* arguments (treated like an */ /* array in the code) */ { int pid; /* stores new process id */ struct pentry *pptr; /* pointer to proc. table entry */ int i; - int *a; /* points to list of args */ - int *saddr; /* stack address */ - int INITRET(); /* process return point */ - PStype ps; /* saved processor status */ + WORD *a; /* points to list of args */ + WORD *saddr; /* stack address */ + int INITRET(); - disable(ps); + disable(); ssize = (int) roundew(ssize); - if ( ssizepstate = PRSUSP; - for (i=0 ; ipname[i]=name[i])!=0 ; i++) + for (i=0 ; ipname[i]=name[i])!=0 ; i++) ; pptr->pprio = priority; - pptr->pbase = (int)saddr; + pptr->pbase = (WORD) saddr; pptr->pstklen = ssize; + pptr->plimit = pptr->pbase - ssize + sizeof (WORD); + /* Bottom of stack */ pptr->psem = 0; - pptr->phasmsg = FALSE; - pptr->plimit = (int) ((unsigned)saddr - ssize + sizeof(int)); - *saddr-- = MAGIC; pptr->pargs = nargs; - for (i=0 ; iphasps = 0; + pptr->phasmsg = 0; + for (i=0 ; ipregs[i]=INITREG; - /* move PC past entry mask */ - pptr->pregs[PCINDX] = pptr->paddr = (int)procaddr + sizeof(short); - pptr->pregs[PSINDX] = INITPS; - pptr->pregs[P0BRINDX] = pptr->pregs[P1BRINDX] = INITBR; - pptr->pregs[P0LRINDX] = INITLR; - pptr->pnxtkin = BADPID; - /* simulate stack of CALLG w/o */ - /* any registers saved (mask==0)*/ + pptr->pregs[PC] = pptr->paddr = (WORD)procaddr; + pptr->pregs[PS] = INITPS; a = (&args) + (nargs-1); /* point to last argument */ - for ( ; nargs > 0 ; nargs--) /* machine dependent; copy args */ - *saddr-- = *a--; /* onto created process' stack */ - *saddr = (int)INITRET+sizeof(short);/* push return address */ - /* ret to INITRET, past entry mask*/ - pptr->pregs[APINDX]= (int)saddr;/* AP points to location on */ - /* stack of 1st arg, -4 bytes */ - for (i=0; ipregs[SPINDX] = pptr->pregs[FPINDX] = (int)saddr; - restore(ps); + for ( ; nargs > 0 ; nargs--) { /* machine dependent; copy args */ + *saddr-- = *a--; + } + /* onto created process' stack */ + *saddr = (WORD)INITRET; /* push on return address */ +#ifdef lsi11 + pptr->pregs[SP] = (WORD)saddr; +#else + pptr->pregs[USP] = (WORD)saddr; + pptr->pregs[SSP] = (WORD)saddr; +#endif + restore(); return(pid); }