|
|
1.1 ! root 1: #ifndef lint ! 2: static char *rcsid = "$Header: fex3.c,v 1.15 85/03/13 17:18:29 sklower Exp $"; ! 3: #endif ! 4: /* -[Sat Apr 9 17:03:02 1983 by layer]- ! 5: * fex3.c $Locker: $ ! 6: * nlambda functions ! 7: * ! 8: * (c) copyright 1982, Regents of the University of California ! 9: */ ! 10: ! 11: ! 12: #include "global.h" ! 13: extern char *gstab(); ! 14: static int pagsiz, pagrnd; ! 15: ! 16: ! 17: /* ! 18: *Ndumplisp -- create executable version of current state of this lisp. ! 19: */ ! 20: #ifndef os_vms ! 21: #include "aout.h" ! 22: ! 23: lispval ! 24: Ndumplisp() ! 25: { ! 26: register struct exec *workp; ! 27: register lispval argptr, temp; ! 28: register char *fname; ! 29: extern int reborn; ! 30: struct exec work, old; ! 31: extern int dmpmode,usehole; ! 32: extern char etext[], *curhbeg; ! 33: int descrip, des2, ax,mode; ! 34: extern int holesize; ! 35: char tbuf[BUFSIZ]; ! 36: long count, lseek(); ! 37: ! 38: ! 39: pageseql(); ! 40: pagsiz = Igtpgsz(); ! 41: pagrnd = pagsiz - 1; ! 42: ! 43: /* dump mode is kept in decimal (which looks like octal in dmpmode) ! 44: and is changeable via (sstatus dumpmode n) where n is 413 or 410 ! 45: base 10 ! 46: */ ! 47: if(dmpmode == 413) mode = 0413; ! 48: else if(dmpmode == 407) mode = 0407; ! 49: else mode = 0410; ! 50: ! 51: workp = &work; ! 52: workp->a_magic = mode; ! 53: #ifdef os_masscomp ! 54: workp->a_stamp = 1; ! 55: #endif ! 56: ! 57: if(holesize) { /* was ifdef HOLE */ ! 58: curhbeg = (char *) (1 + (pagrnd | ((int)curhbeg)-1)); ! 59: workp->a_text = (unsigned long)curhbeg - (unsigned long)OFFSET; ! 60: workp->a_data = (unsigned) sbrk(0) - workp->a_text - OFFSET; ! 61: } else { ! 62: if(mode==0407) ! 63: workp->a_text = ((int)etext) - OFFSET; ! 64: else ! 65: workp->a_text = 1 + ((((int)etext)-1-OFFSET) | pagrnd); ! 66: workp->a_data = (int) sbrk(0) - ((int)curhbeg); ! 67: } ! 68: workp->a_bss = 0; ! 69: workp->a_syms = 0; ! 70: workp->a_entry = (unsigned) gstart(); ! 71: workp->a_trsize = 0; ! 72: workp->a_drsize = 0; ! 73: ! 74: fname = "savedlisp"; /*set defaults*/ ! 75: reborn = (int) CNIL; ! 76: argptr = lbot->val; ! 77: if (argptr != nil) { ! 78: temp = argptr->d.car; ! 79: if((TYPE(temp))==ATOM) ! 80: fname = temp->a.pname; ! 81: } ! 82: des2 = open(gstab(),0); ! 83: if(des2 >= 0) { ! 84: if(read(des2,(char *)&old,sizeof(old))>=0) ! 85: work.a_syms = old.a_syms; ! 86: } ! 87: descrip=creat(fname,0777); /*doit!*/ ! 88: if(-1==write(descrip,(char *)workp,sizeof(work))) ! 89: { ! 90: close(descrip); ! 91: error("Dumplisp header failed",FALSE); ! 92: } ! 93: if(mode == 0413) lseek(descrip,(long)pagsiz,0); ! 94: if( -1==write(descrip,(char *)nil,(int)workp->a_text) ) ! 95: { ! 96: close(descrip); ! 97: error("Dumplisp text failed",FALSE); ! 98: } ! 99: if( -1==write(descrip,(char *)curhbeg,(int)workp->a_data) ) ! 100: { ! 101: close(descrip); ! 102: error("Dumplisp data failed",FALSE); ! 103: } ! 104: if(des2>0 && work.a_syms) { ! 105: count = old.a_text + old.a_data + (old.a_magic == 0413 ? pagsiz ! 106: : sizeof(old)); ! 107: if(-1==lseek(des2,count,0)) ! 108: error("Could not seek to stab",FALSE); ! 109: for(count = old.a_syms;count > 0; count -=BUFSIZ) { ! 110: ax = read(des2,tbuf,(int)(count < BUFSIZ ? count : BUFSIZ)); ! 111: if(ax==0) { ! 112: printf("Unexpected end of syms",count); ! 113: fflush(stdout); ! 114: break; ! 115: } else if(ax > 0) ! 116: write(descrip,tbuf,ax); ! 117: else ! 118: error("Failure to write dumplisp stab",FALSE); ! 119: } ! 120: #if ! (os_unix_ts | os_unisoft) ! 121: if(-1 == lseek(des2,(long) ! 122: ((old.a_magic == 0413 ? pagsiz : sizeof(old)) ! 123: + old.a_text + old.a_data ! 124: + old.a_trsize + old.a_drsize + old.a_syms), ! 125: 0)) ! 126: error(" Could not seek to string table ",FALSE); ! 127: for( ax = 1 ; ax > 0;) { ! 128: ax = read(des2,tbuf,BUFSIZ); ! 129: if(ax > 0) ! 130: write(descrip,tbuf,ax); ! 131: else if (ax < 0) ! 132: error("Error in string table read ",FALSE); ! 133: } ! 134: #endif ! 135: } ! 136: close(descrip); ! 137: if(des2>0) close(des2); ! 138: reborn = 0; ! 139: ! 140: pagenorm(); ! 141: ! 142: return(nil); ! 143: } ! 144: ! 145: ! 146: /*** VMS version of Ndumplisp ***/ ! 147: #else ! 148: #include "aout.h" ! 149: #undef protect ! 150: #include <vms/vmsexe.h> ! 151: ! 152: lispval ! 153: Ndumplisp() ! 154: { ! 155: register struct exec *workp; ! 156: register lispval argptr, temp; ! 157: char *fname; ! 158: register ISD *Isd; ! 159: register int i; ! 160: extern lispval reborn; ! 161: struct exec work,old; ! 162: extern etext; ! 163: extern int dmpmode,holend,curhbeg,usehole,holesize; ! 164: int extra_cref_page = 0; ! 165: char *start_of_data; ! 166: int descrip, des2, count, ax,mode; ! 167: char buf[5000],stabname[100],tbuf[BUFSIZ]; ! 168: int fp,fp1; ! 169: union { ! 170: char Buffer[512]; ! 171: struct { ! 172: IHD Ihd; ! 173: IHA Iha; ! 174: IHS Ihs; ! 175: IHI Ihi; ! 176: } Header; ! 177: } Buffer; /* VMS Header */ ! 178: ! 179: /* ! 180: * Dumpmode is always 413!! ! 181: */ ! 182: mode = 0413; ! 183: pagsiz = Igtpgsz(); ! 184: pagrnd = pagsiz - 1; ! 185: ! 186: workp = &work; ! 187: workp->a_magic = mode; ! 188: if (holesize) { ! 189: workp->a_text = ! 190: ((unsigned)curhbeg) & (~pagrnd); ! 191: if (((unsigned)curhbeg) & pagrnd) extra_cref_page = 1; ! 192: start_of_data = (char *) ! 193: (((((unsigned) (&holend)) -1) & (~pagrnd)) + pagsiz); ! 194: } else { ! 195: workp->a_text = ! 196: ((((unsigned) (&etext)) -1) & (~pagrnd)) + pagsiz; ! 197: start_of_data = (char *)workp->a_text; ! 198: } ! 199: workp->a_data = ! 200: (unsigned) sbrk(0) - (unsigned)start_of_data; ! 201: workp->a_bss = 0; ! 202: workp->a_syms = 0; ! 203: workp->a_entry = (unsigned) gstart(); ! 204: workp->a_trsize = 0; ! 205: workp->a_drsize = 0; ! 206: ! 207: fname = "savedlisp"; /* set defaults */ ! 208: reborn = CNIL; ! 209: argptr = lbot->val; ! 210: if (argptr != nil) { ! 211: temp = argptr->d.car; ! 212: if((TYPE(temp))==ATOM) ! 213: fname = temp->a.pname; ! 214: } ! 215: /* ! 216: * Open the new executable file ! 217: */ ! 218: strcpy(buf,fname); ! 219: if (index(buf,'.') == 0) strcat(buf,".exe"); ! 220: if ((descrip = creat(buf,0777)) < 0) error("Dumplisp failed",FALSE); ! 221: /* ! 222: * Create the VMS header ! 223: */ ! 224: for(i = 0; i < 512; i++) Buffer.Buffer[i] = 0; /* Clear Header */ ! 225: Buffer.Header.Ihd.size = sizeof(Buffer.Header); ! 226: Buffer.Header.Ihd.activoff = sizeof(IHD); ! 227: Buffer.Header.Ihd.symdbgoff = sizeof(IHD) + sizeof(IHA); ! 228: Buffer.Header.Ihd.imgidoff = sizeof(IHD) + sizeof(IHA) + sizeof(IHS); ! 229: Buffer.Header.Ihd.majorid[0] = '0'; ! 230: Buffer.Header.Ihd.majorid[1] = '2'; ! 231: Buffer.Header.Ihd.minorid[0] = '0'; ! 232: Buffer.Header.Ihd.minorid[1] = '2'; ! 233: Buffer.Header.Ihd.imgtype = IHD_EXECUTABLE; ! 234: Buffer.Header.Ihd.privreqs[0] = -1; ! 235: Buffer.Header.Ihd.privreqs[1] = -1; ! 236: Buffer.Header.Ihd.lnkflags.nopobufs = 1; ! 237: Buffer.Header.Ihd.imgiocnt = 250; ! 238: ! 239: Buffer.Header.Iha.tfradr1 = SYS$IMGSTA; ! 240: Buffer.Header.Iha.tfradr2 = workp->a_entry; ! 241: ! 242: strcpy(Buffer.Header.Ihi.imgnam+1,"SAVEDLISP"); ! 243: Buffer.Header.Ihi.imgnam[0] = 9; ! 244: Buffer.Header.Ihi.imgid[0] = 0; ! 245: Buffer.Header.Ihi.imgid[1] = '0'; ! 246: sys$gettim(Buffer.Header.Ihi.linktime); ! 247: strcpy(Buffer.Header.Ihi.linkid+1," Opus 38"); ! 248: Buffer.Header.Ihi.linkid[0] = 8; ! 249: ! 250: Isd = (ISD *)&Buffer.Buffer[sizeof(Buffer.Header)]; ! 251: /* Text ISD */ ! 252: Isd->size = ISDSIZE_TEXT; ! 253: Isd->pagcnt = workp->a_text >> 9; ! 254: Isd->vpnpfc.vpn = 0; ! 255: Isd->flags.type = ISD_NORMAL; ! 256: Isd->vbn = 3; ! 257: Isd = (ISD *)((char *)Isd + Isd->size); ! 258: /* Hole ISDs (if necessary) */ ! 259: if (usehole) { ! 260: /* Copy on Ref ISD for possible extra text page */ ! 261: if(extra_cref_page) { ! 262: Isd->size = ISDSIZE_TEXT; ! 263: Isd->pagcnt = 1; ! 264: Isd->vpnpfc.vpn = (((unsigned)curhbeg) & (~pagrnd)) >> 9; ! 265: Isd->flags.type = ISD_NORMAL; ! 266: Isd->flags.crf = 1; ! 267: Isd->flags.wrt = 1; ! 268: Isd->vbn = (workp->a_text >> 9) + 3; ! 269: Isd = (ISD *)((char *)Isd + Isd->size); ! 270: } ! 271: /* Demand Zero ISD for rest of Hole */ ! 272: Isd->size = ISDSIZE_DZRO; ! 273: Isd->pagcnt = ! 274: ((((unsigned)&holend) ! 275: - (unsigned)curhbeg) & (~pagrnd)) >> 9; ! 276: Isd->vpnpfc.vpn = ! 277: ((((unsigned)curhbeg) & (~pagrnd)) >> 9) + extra_cref_page; ! 278: Isd->flags.type = ISD_NORMAL; ! 279: Isd->flags.dzro = 1; ! 280: Isd->flags.wrt = 1; ! 281: Isd = (ISD *)((char *)Isd + Isd->size); ! 282: } ! 283: /* Data ISD */ ! 284: Isd->size = ISDSIZE_TEXT; ! 285: Isd->pagcnt = workp->a_data >> 9; ! 286: Isd->vpnpfc.vpn = ((unsigned)start_of_data) >> 9; ! 287: Isd->flags.type = ISD_NORMAL; ! 288: Isd->flags.crf = 1; ! 289: Isd->flags.wrt = 1; ! 290: Isd->vbn = (workp->a_text >> 9) + 3; ! 291: if (holesize) { ! 292: /* ! 293: * Correct the Data ISD ! 294: */ ! 295: Isd->vbn += extra_cref_page; ! 296: } ! 297: Isd = (ISD *)((char *)Isd + Isd->size); ! 298: /* Stack ISD */ ! 299: Isd->size = ISDSIZE_DZRO; ! 300: Isd->pagcnt = ISDSTACK_SIZE; ! 301: Isd->vpnpfc.vpn = ISDSTACK_BASE; ! 302: Isd->flags.type = ISD_USERSTACK; ! 303: Isd->flags.dzro = 1; ! 304: Isd->flags.wrt = 1; ! 305: Isd = (ISD *)((char *)Isd + Isd->size); ! 306: /* End of ISD List */ ! 307: Isd->size = 0; ! 308: Isd = (ISD *)((char *)Isd + 2); ! 309: /* ! 310: * Make the rest of the header -1s ! 311: */ ! 312: for (i = ((char *)Isd - Buffer.Buffer); i < 512; i++) ! 313: Buffer.Buffer[i] = -1; ! 314: /* ! 315: * Write the VMS Header ! 316: */ ! 317: if (write(descrip,Buffer.Buffer,512) == -1) ! 318: error("Dumplisp failed",FALSE); ! 319: #if EUNICE_UNIX_OBJECT_FILE_CFASL ! 320: /* ! 321: * Get the UNIX symbol table file header ! 322: */ ! 323: des2 = open(gstab(),0); ! 324: if (des2 >= 0) { ! 325: old.a_magic = 0; ! 326: if (read(des2,(char *)&old,sizeof(old)) >= 0) { ! 327: if (N_BADMAG(old)) { ! 328: lseek(des2,512,0); /* Try block #1 */ ! 329: read(des2,(char *)&old,sizeof(old)); ! 330: } ! 331: if (!N_BADMAG(old)) work.a_syms = old.a_syms; ! 332: } ! 333: } ! 334: #endif EUNICE_UNIX_OBJECT_FILE_CFASL ! 335: /* ! 336: * Update the UNIX header so that the extra cref page is ! 337: * considered part of data space. ! 338: */ ! 339: if (extra_cref_page) work.a_data += 512; ! 340: /* ! 341: * Write the UNIX header ! 342: */ ! 343: if (write(descrip,&work,sizeof(work)) == -1) ! 344: error("Dumplisp failed",FALSE); ! 345: /* ! 346: * seek to 1024 (end of headers) ! 347: */ ! 348: if (lseek(descrip,1024,0) == -1) ! 349: error("Dumplisp failed",FALSE); ! 350: /* ! 351: * write the world ! 352: */ ! 353: if (write(descrip,0,workp->a_text) == -1) ! 354: error("Dumplisp failed",FALSE); ! 355: if (extra_cref_page) ! 356: if (write(descrip,(((unsigned)curhbeg) & pagrnd), pagsiz) == -1) ! 357: error("Dumplisp failed",FALSE); ! 358: if (write(descrip,start_of_data,workp->a_data) == -1) ! 359: error("Dumplisp failed",FALSE); ! 360: ! 361: #if !EUNICE_UNIX_OBJECT_FILE_CFASL ! 362: /* ! 363: * VMS OBJECT files: We are done with the executable file ! 364: */ ! 365: close(descrip); ! 366: /* ! 367: * Now try to write the symbol table file! ! 368: */ ! 369: strcpy(buf,gstab()); ! 370: ! 371: strcpy(stabname,fname); ! 372: if (index(stabname,'.') == 0) strcat(stabname,".stb"); ! 373: else strcpy(index(stabname,'.'), ".stb"); ! 374: ! 375: /* Use Link/Unlink to rename the symbol table */ ! 376: if (!strncmp(gstab(),"tmp:",4)) ! 377: if (link(buf,stabname) >= 0) ! 378: if (unlink(buf) >= 0) return(nil); ! 379: ! 380: /* Copy the symbol table */ ! 381: if ((fp = open(buf,0)) < 0) ! 382: error("Symbol table file not there\n",FALSE); ! 383: fp1 = creat(stabname,0666,"var"); ! 384: while((i = read(fp,buf,5000)) > 0) ! 385: if (write(fp1,buf,i) == -1) { ! 386: close(fp); close(fp1); ! 387: error("Error writing symbol table\n",FALSE); ! 388: } ! 389: close(fp); close(fp1); ! 390: if (i < 0) error("Error reading symbol table\n",FALSE); ! 391: if (!strncmp(gstab(),"tmp:",4)) unlink(gstab); ! 392: /* ! 393: * Done ! 394: */ ! 395: reborn = 0; ! 396: return(nil); ! 397: #else EUNICE_UNIX_OBJECT_FILE_CFASL ! 398: /* ! 399: * UNIX OBJECT files: append the new symbol table ! 400: */ ! 401: if(des2>0 && work.a_syms) { ! 402: count = old.a_text + old.a_data + (old.a_magic == 0413 ? 1024 ! 403: : sizeof(old)); ! 404: if(-1==lseek(des2,count,0)) ! 405: error("Could not seek to stab",FALSE); ! 406: for(count = old.a_syms;count > 0; count -=BUFSIZ) { ! 407: ax = read(des2,tbuf,(int)(count < BUFSIZ ? count : BUFSIZ)); ! 408: if(ax==0) { ! 409: printf("Unexpected end of syms",count); ! 410: fflush(stdout); ! 411: break; ! 412: } else if(ax > 0) ! 413: write(descrip,tbuf,ax); ! 414: else ! 415: error("Failure to write dumplisp stab",FALSE); ! 416: } ! 417: if(-1 == lseek(des2,(long) ! 418: ((old.a_magic == 0413 ? 1024 : sizeof(old)) ! 419: + old.a_text + old.a_data ! 420: + old.a_trsize + old.a_drsize + old.a_syms), ! 421: 0)) ! 422: error(" Could not seek to string table ",FALSE); ! 423: for( ax = 1 ; ax > 0;) { ! 424: ax = read(des2,tbuf,BUFSIZ); ! 425: if(ax > 0) ! 426: write(descrip,tbuf,ax); ! 427: else if (ax < 0) ! 428: error("Error in string table read ",FALSE); ! 429: } ! 430: } ! 431: close(descrip); ! 432: if(des2>0) close(des2); ! 433: reborn = 0; ! 434: ! 435: return(nil); ! 436: #endif EUNICE_UNIX_OBJECT_FILE_CFASL ! 437: } ! 438: #endif ! 439: #if (os_4_1 | os_4_1a | os_4_1c | os_4_2| os_4_3) ! 440: ! 441: #if (os_4_2 | os_4_3) ! 442: #include <sys/vadvise.h> ! 443: #else ! 444: #include <vadvise.h> ! 445: #endif ! 446: ! 447: pagerand() { vadvise(VA_ANOM); } ! 448: pageseql() { vadvise(VA_SEQL); } ! 449: pagenorm() { vadvise(VA_NORM); } ! 450: #endif ! 451: #if (os_unisoft | os_vms | os_unix_ts | os_masscomp) ! 452: pagerand() { } ! 453: pageseql() { } ! 454: pagenorm() { } ! 455: #endif ! 456: ! 457: /* getaddress -- ! 458: * ! 459: * (getaddress '|_entry1| 'fncname1 '|_entry2| 'fncname2 ...) ! 460: * ! 461: * binds value of symbol |_entry1| to function defition of atom fncname1, etc. ! 462: * ! 463: * returns fnc-binding of fncname1. ! 464: * ! 465: */ ! 466: #if os_unisoft || os_unix_ts ! 467: #define N_name n_name ! 468: #define STASSGN(p,q) strncpy(NTABLE[(p)].n_name,(q),8) ! 469: #else ! 470: #define N_name n_un.n_name ! 471: #define STASSGN(p,q) (NTABLE[p].N_name = (q)) ! 472: #endif ! 473: ! 474: lispval ! 475: Lgetaddress(){ ! 476: register struct argent *mlbot = lbot; ! 477: register lispval work; ! 478: register int numberofargs, i; ! 479: char ostabf[128]; ! 480: struct nlist NTABLE[100]; ! 481: lispval dispget(); ! 482: ! 483: Savestack(4); ! 484: ! 485: if(np-lbot == 2) protect(nil); /* allow 2 args */ ! 486: numberofargs = (np - lbot)/3; ! 487: if(numberofargs * 3 != np-lbot) ! 488: error("getaddress: arguments must come in triples ",FALSE); ! 489: ! 490: for ( i=0; i<numberofargs; i++,mlbot += 3) { ! 491: NTABLE[i].n_value = 0; ! 492: mlbot[0].val = verify(mlbot[0].val,"Incorrect entry specification for binding"); ! 493: STASSGN(i,(char *) mlbot[0].val); ! 494: while(TYPE(mlbot[1].val) != ATOM) ! 495: mlbot[1].val = errorh1(Vermisc, ! 496: "Bad associated atom name for binding", ! 497: nil,TRUE,0,mlbot[1].val); ! 498: mlbot[2].val = dispget(mlbot[2].val,"getaddress: Incorrect discipline specification ",(lispval)Vsubrou->a.pname); ! 499: } ! 500: STASSGN(numberofargs,""); ! 501: strncpy(ostabf,gstab(),128); ! 502: if ( nlist(ostabf,NTABLE) == -1 ) { ! 503: errorh1(Vermisc,"Getaddress: Bad file",nil,FALSE,0,inewstr(ostabf)); ! 504: } else ! 505: for (i=0,mlbot=lbot+1; i<numberofargs; i++,mlbot+=3) { ! 506: if ( NTABLE[i].n_value == 0 ) ! 507: fprintf(stderr,"Undefined symbol: %s\n", ! 508: NTABLE[i].N_name); ! 509: else { ! 510: work= newfunct(); ! 511: work->bcd.start = (lispval (*) ())NTABLE[i].n_value; ! 512: work->bcd.discipline = mlbot[1].val; ! 513: mlbot->val->a.fnbnd = work; ! 514: } ! 515: }; ! 516: Restorestack(); ! 517: return(lbot[1].val->a.fnbnd); ! 518: }; ! 519: ! 520: Igtpgsz() ! 521: { ! 522: #if (os_4_1c | os_4_2 | os_4_3) ! 523: return(getpagesize()); ! 524: #else ! 525: #if (vax_eunice_vms | os_unisoft) ! 526: return(512); ! 527: #else ! 528: #if os_masscomp ! 529: return(4096); ! 530: #else ! 531: return(1024); ! 532: #endif ! 533: #endif ! 534: #endif ! 535: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.