|
|
1.1 ! root 1: /* machdep.c */ ! 2: typedef unsigned char u_char; ! 3: typedef unsigned short u_short; ! 4: typedef unsigned int u_int; ! 5: typedef unsigned long u_long; ! 6: typedef struct _physadr { int r[1]; } *physadr; ! 7: typedef int daddr_t; ! 8: typedef char * caddr_t; ! 9: typedef u_short ino_t; ! 10: typedef int swblk_t; ! 11: typedef int size_t; ! 12: typedef int time_t; ! 13: typedef int label_t[14]; ! 14: typedef short dev_t; ! 15: typedef int off_t; ! 16: typedef long portid_t; ! 17: typedef struct fd_set { int fds_bits[1]; } fd_set; ! 18: int hz; ! 19: int timezone; ! 20: int dstflag; ! 21: char canonb[256 ]; ! 22: extern char version[]; ! 23: int lbolt; ! 24: time_t time; ! 25: time_t bootime; ! 26: long trannum; ! 27: int hand; ! 28: int nblkdev; ! 29: int nchrdev; ! 30: int nstream; ! 31: int nswdev; ! 32: int mpid; ! 33: char runin; ! 34: char runout; ! 35: int runrun; ! 36: char kmapwnt; ! 37: char curpri; ! 38: int maxmem; ! 39: int physmem; ! 40: int nswap; ! 41: int updlock; ! 42: daddr_t rablock; ! 43: extern int intstack[]; ! 44: dev_t rootdev; ! 45: dev_t dumpdev; ! 46: long dumplo; ! 47: dev_t swapdev; ! 48: dev_t argdev; ! 49: dev_t pipedev; ! 50: extern int icode[]; ! 51: extern int szicode; ! 52: dev_t getmdev(); ! 53: daddr_t bmap(); ! 54: caddr_t calloc(); ! 55: unsigned max(); ! 56: unsigned min(); ! 57: int memall(); ! 58: int uchar(), schar(); ! 59: int vmemall(); ! 60: char *wmemall(); ! 61: swblk_t vtod(); ! 62: extern struct sysent ! 63: { ! 64: int sy_narg; ! 65: int (*sy_call)(); ! 66: } sysent[]; ! 67: extern char vmmap[]; ! 68: int umbabeg,umbaend; ! 69: int noproc; ! 70: extern int catcher[256]; ! 71: char *panicstr; ! 72: int wantin; ! 73: int boothowto; ! 74: struct direct ! 75: { ! 76: ino_t d_ino; ! 77: char d_name[14 ]; ! 78: }; ! 79: struct pcb ! 80: { ! 81: int pcb_ksp; ! 82: int pcb_esp; ! 83: int pcb_ssp; ! 84: int pcb_usp; ! 85: int pcb_r0; ! 86: int pcb_r1; ! 87: int pcb_r2; ! 88: int pcb_r3; ! 89: int pcb_r4; ! 90: int pcb_r5; ! 91: int pcb_r6; ! 92: int pcb_r7; ! 93: int pcb_r8; ! 94: int pcb_r9; ! 95: int pcb_r10; ! 96: int pcb_r11; ! 97: int pcb_r12; ! 98: int pcb_r13; ! 99: int pcb_pc; ! 100: int pcb_psl; ! 101: struct pte *pcb_p0br; ! 102: int pcb_p0lr; ! 103: struct pte *pcb_p1br; ! 104: int pcb_p1lr; ! 105: int pcb_szpt; ! 106: int pcb_cmap2; ! 107: int *pcb_sswap; ! 108: int pcb_sigc[3]; ! 109: }; ! 110: struct dmap ! 111: { ! 112: swblk_t dm_size; ! 113: swblk_t dm_alloc; ! 114: swblk_t dm_map[ 32 ]; ! 115: }; ! 116: struct dmap zdmap; ! 117: struct dblock ! 118: { ! 119: swblk_t db_base; ! 120: swblk_t db_size; ! 121: }; ! 122: struct vtimes { ! 123: int vm_utime; ! 124: int vm_stime; ! 125: ! 126: unsigned vm_idsrss; ! 127: unsigned vm_ixrss; ! 128: int vm_maxrss; ! 129: int vm_majflt; ! 130: int vm_minflt; ! 131: int vm_nswap; ! 132: int vm_inblk; ! 133: int vm_oublk; ! 134: }; ! 135: struct vtimes zvms; ! 136: ! 137: ! 138: struct user ! 139: { ! 140: struct pcb u_pcb; ! 141: int u_arg[5]; ! 142: label_t u_qsav; ! 143: char u_segflg; ! 144: char u_error; ! 145: short u_uid; ! 146: short u_gid; ! 147: short u_ruid; ! 148: short u_rgid; ! 149: struct proc *u_procp; ! 150: int *u_ap; ! 151: union { ! 152: struct { ! 153: int R_val1; ! 154: int R_val2; ! 155: } u_rv; ! 156: off_t r_off; ! 157: time_t r_time; ! 158: } u_r; ! 159: caddr_t u_base; ! 160: unsigned int u_count; ! 161: off_t u_offset; ! 162: struct inode *u_cdir; ! 163: struct inode *u_rdir; ! 164: char u_dbuf[14 ]; ! 165: caddr_t u_dirp; ! 166: struct direct u_dent; ! 167: struct inode *u_pdir; ! 168: struct file *u_ofile[20 ]; ! 169: char u_pofile[20 ]; ! 170: label_t u_ssav; ! 171: int (*u_signal[32])(); ! 172: int u_code; ! 173: int *u_ar0; ! 174: struct uprof { ! 175: short *pr_base; ! 176: unsigned pr_size; ! 177: unsigned pr_off; ! 178: unsigned pr_scale; ! 179: } u_prof; ! 180: char u_eosys; ! 181: char u_sep; ! 182: dev_t u_ttydev; ! 183: ino_t u_ttyino; ! 184: union { ! 185: struct { ! 186: int Ux_mag; ! 187: unsigned Ux_tsize; ! 188: unsigned Ux_dsize; ! 189: unsigned Ux_bsize; ! 190: unsigned Ux_ssize; ! 191: unsigned Ux_entloc; ! 192: unsigned Ux_unused; ! 193: unsigned Ux_relflg; ! 194: } Ux_A; ! 195: char ux_shell[32]; ! 196: } u_exdata; ! 197: char u_comm[14 ]; ! 198: time_t u_start; ! 199: char u_acflag; ! 200: short u_fpflag; ! 201: short u_cmask; ! 202: size_t u_tsize; ! 203: size_t u_dsize; ! 204: size_t u_ssize; ! 205: struct vtimes u_vm; ! 206: struct vtimes u_cvm; ! 207: struct dmap u_dmap; ! 208: struct dmap u_smap; ! 209: struct dmap u_cdmap, u_csmap; ! 210: time_t u_outime; ! 211: size_t u_odsize, u_ossize; ! 212: size_t u_vrpages[20 ]; ! 213: int u_limit[8]; ! 214: int u_stack[1]; ! 215: ! 216: }; ! 217: extern struct user u; ! 218: extern struct user swaputl; ! 219: extern struct user forkutl; ! 220: extern struct user xswaputl; ! 221: extern struct user xswap2utl; ! 222: extern struct user pushutl; ! 223: extern struct user vfutl; ! 224: extern struct user prusrutl; ! 225: struct map { ! 226: struct mapent *m_limit; ! 227: char *m_name; ! 228: }; ! 229: struct mapent ! 230: { ! 231: int m_size; ! 232: int m_addr; ! 233: }; ! 234: struct map *swapmap; ! 235: int nswapmap; ! 236: struct map *argmap; ! 237: struct map *kernelmap; ! 238: ! 239: struct pte ! 240: { ! 241: unsigned int pg_pfnum:21, ! 242: :2, ! 243: pg_vreadm:1, ! 244: pg_swapm:1, ! 245: pg_fod:1, ! 246: pg_m:1, ! 247: pg_prot:4, ! 248: pg_v:1; ! 249: }; ! 250: struct hpte ! 251: { ! 252: unsigned int pg_pfnum:21, ! 253: :2, ! 254: pg_high:9; ! 255: }; ! 256: struct fpte ! 257: { ! 258: unsigned int pg_blkno:20, ! 259: pg_fileno:5, ! 260: pg_fod:1, ! 261: :1, ! 262: pg_prot:4, ! 263: pg_v:1; ! 264: }; ! 265: struct pte *vtopte(); ! 266: extern struct pte Sysmap[]; ! 267: extern struct pte Usrptmap[]; ! 268: extern struct pte usrpt[]; ! 269: extern struct pte Swapmap[]; ! 270: extern struct pte Forkmap[]; ! 271: extern struct pte Xswapmap[]; ! 272: extern struct pte Xswap2map[]; ! 273: extern struct pte Pushmap[]; ! 274: extern struct pte Vfmap[]; ! 275: extern struct pte mmap[]; ! 276: extern struct pte msgbufmap[]; ! 277: extern struct pte camap[]; ! 278: extern struct pte Nexmap[][16]; ! 279: extern struct pte Prusrmap[]; ! 280: ! 281: ! 282: int klseql; ! 283: int klsdist; ! 284: int klin; ! 285: int kltxt; ! 286: int klout; ! 287: struct vmmeter ! 288: { ! 289: unsigned v_swtch; ! 290: unsigned v_trap; ! 291: unsigned v_syscall; ! 292: unsigned v_intr; ! 293: unsigned v_pdma; ! 294: unsigned v_pswpin; ! 295: unsigned v_pswpout; ! 296: unsigned v_pgin; ! 297: unsigned v_pgout; ! 298: unsigned v_pgpgin; ! 299: unsigned v_pgpgout; ! 300: unsigned v_intrans; ! 301: unsigned v_pgrec; ! 302: unsigned v_xsfrec; ! 303: unsigned v_xifrec; ! 304: unsigned v_exfod; ! 305: unsigned v_zfod; ! 306: unsigned v_vrfod; ! 307: unsigned v_nexfod; ! 308: unsigned v_nzfod; ! 309: unsigned v_nvrfod; ! 310: unsigned v_pgfrec; ! 311: unsigned v_faults; ! 312: unsigned v_scan; ! 313: unsigned v_rev; ! 314: unsigned v_seqfree; ! 315: unsigned v_dfree; ! 316: unsigned v_swpin; ! 317: unsigned v_swpout; ! 318: }; ! 319: struct vmmeter cnt, rate, sum; ! 320: struct vmtotal ! 321: { ! 322: short t_rq; ! 323: short t_dw; ! 324: short t_pw; ! 325: short t_sl; ! 326: short t_sw; ! 327: int t_vm; ! 328: int t_avm; ! 329: short t_rm; ! 330: short t_arm; ! 331: int t_vmtxt; ! 332: int t_avmtxt; ! 333: short t_rmtxt; ! 334: short t_armtxt; ! 335: short t_free; ! 336: }; ! 337: struct vmtotal total; ! 338: int freemem; ! 339: int avefree; ! 340: int avefree30; ! 341: int deficit; ! 342: int nscan; ! 343: int multprog; ! 344: int desscan; ! 345: int maxpgio; ! 346: int maxslp; ! 347: int lotsfree; ! 348: int minfree; ! 349: int desfree; ! 350: int saferss; ! 351: struct forkstat ! 352: { ! 353: int cntfork; ! 354: int cntvfork; ! 355: int sizfork; ! 356: int sizvfork; ! 357: }; ! 358: struct forkstat forkstat; ! 359: struct swptstat ! 360: { ! 361: int pteasy; ! 362: int ptexpand; ! 363: int ptshrink; ! 364: int ptpack; ! 365: }; ! 366: struct swptstat swptstat; ! 367: struct proc ! 368: { ! 369: struct proc *p_link; ! 370: struct proc *p_rlink; ! 371: struct pte *p_addr; ! 372: char p_usrpri; ! 373: char p_pri; ! 374: char p_cpu; ! 375: char p_stat; ! 376: char p_time; ! 377: char p_nice; ! 378: char p_slptime; ! 379: char p_cursig; ! 380: long p_sig; ! 381: long p_siga0; ! 382: long p_siga1; ! 383: int p_flag; ! 384: short p_uid; ! 385: short p_pgrp; ! 386: short p_pid; ! 387: short p_ppid; ! 388: short p_poip; ! 389: short p_szpt; ! 390: size_t p_tsize; ! 391: size_t p_dsize; ! 392: size_t p_ssize; ! 393: size_t p_rssize; ! 394: size_t p_maxrss; ! 395: size_t p_swrss; ! 396: swblk_t p_swaddr; ! 397: caddr_t p_wchan; ! 398: struct text *p_textp; ! 399: u_short p_clktim; ! 400: u_short p_tsleep; ! 401: struct pte *p_p0br; ! 402: struct proc *p_xlink; ! 403: short p_cpticks; ! 404: float p_pctcpu; ! 405: short p_ndx; ! 406: short p_idhash; ! 407: struct proc *p_pptr; ! 408: struct inode *p_trace; ! 409: }; ! 410: short pidhash[ 63]; ! 411: struct proc *pfind(); ! 412: struct proc *proc, *procNPROC; ! 413: int nproc; ! 414: struct prochd { ! 415: struct proc *ph_link; ! 416: struct proc *ph_rlink; ! 417: } qs[32 ]; ! 418: int whichqs; ! 419: struct xproc ! 420: { ! 421: struct proc *xp_link; ! 422: struct proc *xp_rlink; ! 423: struct pte *xp_addr; ! 424: char xp_usrpri; ! 425: char xp_pri; ! 426: char xp_cpu; ! 427: char xp_stat; ! 428: char xp_time; ! 429: char xp_nice; ! 430: char xp_slptime; ! 431: char p_cursig; ! 432: int xp_sig; ! 433: int xp_siga0; ! 434: int xp_siga1; ! 435: int xp_flag; ! 436: short xp_uid; ! 437: short xp_pgrp; ! 438: short xp_pid; ! 439: short xp_ppid; ! 440: short xp_xstat; ! 441: struct vtimes xp_vm; ! 442: }; ! 443: struct bufhd ! 444: { ! 445: long b_flags; ! 446: struct buf *b_forw, *b_back; ! 447: }; ! 448: struct buf ! 449: { ! 450: long b_flags; ! 451: struct buf *b_forw, *b_back; ! 452: struct buf *av_forw, *av_back; ! 453: long b_bcount; ! 454: short b_error; ! 455: dev_t b_dev; ! 456: union { ! 457: caddr_t b_addr; ! 458: int *b_words; ! 459: struct filsys *b_filsys; ! 460: struct dinode *b_dino; ! 461: daddr_t *b_daddr; ! 462: } b_un; ! 463: daddr_t b_blkno; ! 464: long b_resid; ! 465: struct proc *b_proc; ! 466: }; ! 467: struct buf *buf; ! 468: char *buffers; ! 469: int nbuf; ! 470: struct buf *swbuf; ! 471: int nswbuf; ! 472: short *swsize; ! 473: int *swpf; ! 474: struct buf bfreelist[ 3 ]; ! 475: struct buf bswlist; ! 476: struct buf *bclnlist; ! 477: struct buf *alloc(); ! 478: struct buf *baddr(); ! 479: struct buf *getblk(); ! 480: struct buf *geteblk(); ! 481: struct buf *bread(); ! 482: struct buf *breada(); ! 483: unsigned minphys(); ! 484: struct uba_hd { ! 485: struct uba_regs *uh_uba; ! 486: struct uba_regs *uh_physuba; ! 487: int (**uh_vec)(); ! 488: struct uba_device *uh_actf; ! 489: struct uba_device *uh_actl; ! 490: short uh_mrwant; ! 491: short uh_bdpwant; ! 492: int uh_bdpfree; ! 493: int uh_hangcnt; ! 494: int uh_zvcnt; ! 495: int uh_errcnt; ! 496: int uh_lastiv; ! 497: short uh_users; ! 498: short uh_xclu; ! 499: struct map *uh_map; ! 500: }; ! 501: struct uba_ctlr { ! 502: struct uba_driver *um_driver; ! 503: short um_ctlr; ! 504: short um_ubanum; ! 505: short um_alive; ! 506: int (**um_intr)(); ! 507: caddr_t um_addr; ! 508: struct uba_hd *um_hd; ! 509: int um_cmd; ! 510: int um_ubinfo; ! 511: struct buf um_tab; ! 512: }; ! 513: struct uba_device { ! 514: struct uba_driver *ui_driver; ! 515: short ui_unit; ! 516: short ui_ctlr; ! 517: short ui_ubanum; ! 518: short ui_slave; ! 519: int (**ui_intr)(); ! 520: caddr_t ui_addr; ! 521: short ui_dk; ! 522: int ui_flags; ! 523: short ui_alive; ! 524: short ui_type; ! 525: caddr_t ui_physaddr; ! 526: struct uba_device *ui_forw; ! 527: struct uba_ctlr *ui_mi; ! 528: struct uba_hd *ui_hd; ! 529: }; ! 530: struct uba_driver { ! 531: int (*ud_probe)(); ! 532: int (*ud_slave)(); ! 533: int (*ud_attach)(); ! 534: int (*ud_dgo)(); ! 535: u_short *ud_addr; ! 536: char *ud_dname; ! 537: struct uba_device **ud_dinfo; ! 538: char *ud_mname; ! 539: struct uba_ctlr **ud_minfo; ! 540: short ud_xclu; ! 541: }; ! 542: int numuba; ! 543: extern struct uba_hd uba_hd[]; ! 544: extern struct uba_ctlr ubminit[]; ! 545: extern struct uba_device ubdinit[]; ! 546: extern struct pte UMEMmap[][16]; ! 547: extern char umem[][16* 512]; ! 548: extern int (*UNIvec[])(); ! 549: struct uba_regs ! 550: { ! 551: int uba_cnfgr; ! 552: int uba_cr; ! 553: int uba_sr; ! 554: int uba_dcr; ! 555: int uba_fmer; ! 556: int uba_fubar; ! 557: int pad1[2]; ! 558: int uba_brsvr[4]; ! 559: int uba_brrvr[4]; ! 560: int uba_dpr[16]; ! 561: int pad2[480]; ! 562: struct pte uba_map[496]; ! 563: int pad3[16]; ! 564: }; ! 565: ! 566: ! 567: struct bdevsw ! 568: { ! 569: int (*d_open)(); ! 570: int (*d_close)(); ! 571: int (*d_strategy)(); ! 572: int (*d_dump)(); ! 573: int d_flags; ! 574: }; ! 575: extern struct bdevsw bdevsw[]; ! 576: extern struct cdevsw ! 577: { ! 578: int (*d_open)(); ! 579: int (*d_close)(); ! 580: int (*d_read)(); ! 581: int (*d_write)(); ! 582: int (*d_ioctl)(); ! 583: int (*d_reset)(); ! 584: struct streamtab *qinfo; ! 585: }; ! 586: extern struct cdevsw cdevsw[]; ! 587: struct fstypsw { ! 588: int (*t_put)(); ! 589: struct inode *(*t_get)(); ! 590: int (*t_free)(); ! 591: int (*t_updat)(); ! 592: int (*t_read)(); ! 593: int (*t_write)(); ! 594: int (*t_trunc)(); ! 595: int (*t_stat)(); ! 596: int (*t_nami)(); ! 597: int (*t_mount)(); ! 598: int (*t_ioctl)(); ! 599: }; ! 600: extern struct fstypsw fstypsw[]; ! 601: extern nfstyp; ! 602: extern struct streamtab { ! 603: struct qinit *rdinit; ! 604: struct qinit *wrinit; ! 605: } *streamtab[]; ! 606: struct swdevt ! 607: { ! 608: dev_t sw_dev; ! 609: int sw_freed; ! 610: }; ! 611: extern struct swdevt swdevt[]; ! 612: struct mcr { ! 613: int mc_reg[3]; ! 614: }; ! 615: int nmcr; ! 616: struct mcr *mcraddr[ 1]; ! 617: union cpusid { ! 618: int cpusid; ! 619: struct cpuany { ! 620: u_int :24, ! 621: cp_type:8; ! 622: } cpuany; ! 623: struct cpu780 { ! 624: u_int cp_sno:12, ! 625: cp_plant:3, ! 626: cp_eco:9, ! 627: cp_type:8; ! 628: } cpu780; ! 629: struct cpu750 { ! 630: u_int cp_hrev:8, ! 631: cp_urev:8, ! 632: :8, ! 633: cp_type:8; ! 634: } cpu750; ! 635: ! 636: }; ! 637: struct percpu { ! 638: short pc_cputype; ! 639: short pc_nnexus; ! 640: struct nexus *pc_nexbase; ! 641: caddr_t *pc_umaddr; ! 642: short pc_nubabdp; ! 643: short pc_haveubasr; ! 644: short *pc_nextype; ! 645: }; ! 646: int cpu; ! 647: extern struct percpu percpu[]; ! 648: struct inode ! 649: { ! 650: short i_flag; ! 651: u_char i_count; ! 652: char i_fstyp; ! 653: dev_t i_dev; ! 654: long i_number; ! 655: unsigned short i_mode; ! 656: short i_nlink; ! 657: short i_uid; ! 658: short i_gid; ! 659: off_t i_size; ! 660: struct stdata *i_sptr; ! 661: union { ! 662: struct { ! 663: daddr_t I_addr[13]; ! 664: daddr_t I_lastr; ! 665: } i_f; ! 666: struct { ! 667: daddr_t I_rdev; ! 668: long I_key; ! 669: } i_d; ! 670: struct { ! 671: long I_tag; ! 672: struct inode *I_cip; ! 673: } i_a; ! 674: struct { ! 675: struct proc *I_proc; ! 676: int I_sigmask; ! 677: } i_p; ! 678: } i_un; ! 679: short i_hlink; ! 680: }; ! 681: struct inode *inode, *inodeNINODE; ! 682: int ninode; ! 683: struct inode *rootdir; ! 684: struct inode *ialloc(); ! 685: struct inode *ifind(); ! 686: struct inode *iget(); ! 687: struct inode *owner(); ! 688: struct inode *maknode(); ! 689: struct inode *namei(); ! 690: struct argnamei { ! 691: short flag; ! 692: ino_t ino; ! 693: dev_t idev; ! 694: short mode; ! 695: }; ! 696: struct nx { ! 697: struct inode *dp; ! 698: char *cp; ! 699: struct buf *nbp; ! 700: int nlink; ! 701: }; ! 702: struct file ! 703: { ! 704: short f_flag; ! 705: short f_count; ! 706: struct inode *f_inode; ! 707: off_t f_offset; ! 708: }; ! 709: struct file *file, *fileNFILE; ! 710: int nfile; ! 711: struct file *getf(); ! 712: struct file *falloc(); ! 713: struct text ! 714: { ! 715: swblk_t x_daddr[12 ]; ! 716: swblk_t x_ptdaddr; ! 717: size_t x_size; ! 718: struct proc *x_caddr; ! 719: struct inode *x_iptr; ! 720: short x_rssize; ! 721: short x_swrss; ! 722: char x_count; ! 723: char x_ccount; ! 724: char x_flag; ! 725: char x_slptime; ! 726: short x_poip; ! 727: }; ! 728: struct text *text, *textNTEXT; ! 729: int ntext; ! 730: struct callout { ! 731: int c_time; ! 732: caddr_t c_arg; ! 733: int (*c_func)(); ! 734: struct callout *c_next; ! 735: }; ! 736: struct callout *callfree, *callout, calltodo; ! 737: int ncallout; ! 738: struct cmap ! 739: { ! 740: unsigned int c_next:13, ! 741: c_prev:13, ! 742: c_lock:1, ! 743: c_want:1, ! 744: c_page:16, ! 745: c_hlink:13, ! 746: c_intrans:1, ! 747: c_free:1, ! 748: c_gone:1, ! 749: c_type:2, ! 750: c_blkno:20, ! 751: c_ndx:10, ! 752: c_mdev:6; ! 753: }; ! 754: struct cmap *cmap; ! 755: struct cmap *ecmap; ! 756: int ncmap; ! 757: struct cmap *mfind(); ! 758: int firstfree, maxfree; ! 759: int ecmx; ! 760: short cmhash[512 ]; ! 761: struct frame { ! 762: int fr_handler; ! 763: u_int fr_psw:16, ! 764: fr_mask:12, ! 765: :1, ! 766: fr_s:1, ! 767: fr_spa:2; ! 768: int fr_savap; ! 769: int fr_savfp; ! 770: int fr_savpc; ! 771: }; ! 772: struct rpb { ! 773: struct rpb *rp_selfref; ! 774: int (*rp_dumprout)(); ! 775: long rp_checksum; ! 776: long rp_flag; ! 777: }; ! 778: extern struct rpb rpb; ! 779: int icode[] = ! 780: { ! 781: 0x9f19af9f, ! 782: 0x02dd09af, ! 783: 0xbc5c5ed0, ! 784: 0x2ffe110b, ! 785: 0x2f637465, ! 786: 0x74696e69, ! 787: 0x00000000, ! 788: 0x00000014, ! 789: 0x00000000, ! 790: }; ! 791: int szicode = sizeof(icode); ! 792: ! 793: int nbuf = 0; ! 794: int nswbuf = 0; ! 795: startup(firstaddr) ! 796: int firstaddr; ! 797: { ! 798: register int unixsize; ! 799: register unsigned i; ! 800: register struct pte *pte; ! 801: register caddr_t v; ! 802: ! 803: maxmem -= 2; ! 804: pte = msgbufmap; ! 805: for (i = 0; i < 2; i++) ! 806: *(int *)pte++ = 0x80000000 | 0x10000000 | (maxmem + i); ! 807: mtpr(0x39 , 1); ! 808: ! 809: printf(version); ! 810: ! 811: ! 812: if (nbuf == 0) { ! 813: nbuf = (32 * physmem) / ((((unsigned)(1024*1024)+511)>>9)); ! 814: if (nbuf < 32) ! 815: nbuf = 32; ! 816: } ! 817: if (nswbuf == 0) { ! 818: nswbuf = (nbuf / 2) &~ 1; ! 819: if (nswbuf > 256) ! 820: nswbuf = 256; ! 821: } ! 822: printf("real mem = %d nbuf = %d nswbuf = %d\n", ((maxmem)<<9), ! 823: nbuf, nswbuf); ! 824: ! 825: v = (caddr_t)(0x80000000 | (firstaddr * 512)); ! 826: (buffers) = ( char *)(v); (v) = (caddr_t)((buffers)+( 4096*nbuf)); ! 827: (buf) = ( struct buf *)(v); (v) = (caddr_t)((buf)+( nbuf)); ! 828: (swbuf) = ( struct buf *)(v); (v) = (caddr_t)((swbuf)+( nswbuf)); ! 829: (swsize) = ( short *)(v); (v) = (caddr_t)((swsize)+( nswbuf)); ! 830: (swpf) = ( int *)(v); (v) = (caddr_t)((swpf)+( nswbuf)); ! 831: (inode) = ( struct inode *)(v); (v) = (caddr_t)(( inodeNINODE) = ((inode)+( ninode))); ! 832: (file) = ( struct file *)(v); (v) = (caddr_t)(( fileNFILE) = ((file)+( nfile))); ! 833: (proc) = ( struct proc *)(v); (v) = (caddr_t)(( procNPROC) = ((proc)+( nproc))); ! 834: (text) = ( struct text *)(v); (v) = (caddr_t)(( textNTEXT) = ((text)+( ntext))); ! 835: (callout) = ( struct callout *)(v); (v) = (caddr_t)((callout)+( ncallout)); ! 836: (swapmap) = ( struct map *)(v); (v) = (caddr_t)((swapmap)+( nswapmap = nproc * 2)); ! 837: (argmap) = ( struct map *)(v); (v) = (caddr_t)((argmap)+( 16)); ! 838: (kernelmap) = ( struct map *)(v); (v) = (caddr_t)((kernelmap)+( nproc)); ! 839: ! 840: ncmap = (physmem* 512 - ((int)v &~ 0x80000000)) / ! 841: ( 512*2 + sizeof (struct cmap)); ! 842: (cmap) = ( struct cmap *)(v); (v) = (caddr_t)(( ecmap) = ((cmap)+( ncmap))); ! 843: if ((((int)(ecmap+1))&~0x80000000) > (32* ( 512/(sizeof (struct pte))))* 512) ! 844: panic("sys pt too small"); ! 845: ! 846: unixsize = ((((unsigned)((int)(ecmap+1) &~ 0x80000000)+511)>>9)); ! 847: if (unixsize >= physmem - 8*8 ) ! 848: panic("no memory"); ! 849: pte = &Sysmap[firstaddr]; ! 850: for (i = firstaddr; i < unixsize; i++) { ! 851: *(int *)(&Sysmap[i]) = 0x80000000 | 0x10000000 | i; ! 852: clearseg(i); ! 853: } ! 854: mtpr(0x39 , 1); ! 855: ! 856: callfree = callout; ! 857: for (i = 1; i < ncallout; i++) ! 858: callout[i-1].c_next = &callout[i]; ! 859: ! 860: meminit(unixsize, maxmem); ! 861: maxmem = freemem; ! 862: printf("avail mem = %d\n", ((maxmem)<<9)); ! 863: rminit(kernelmap, (8* ( 512/(sizeof (struct pte)))), 1, "usrpt", nproc); ! 864: ! 865: configure(); ! 866: ! 867: tocons(0xf03 ); ! 868: tocons(0xf04 ); ! 869: } ! 870: sysphys() ! 871: { ! 872: if(!suser()) ! 873: return; ! 874: u.u_error = 22; ! 875: } ! 876: clkinit(base) ! 877: time_t base; ! 878: { ! 879: register unsigned todr = mfpr(0x1b ); ! 880: long deltat; ! 881: int year = 1970; ! 882: if (base < 5* ((unsigned)(365* ((unsigned)(24*60*60)) )) ) { ! 883: printf("WARNING: preposterous time in file system"); ! 884: time = 6* ((unsigned)(365* ((unsigned)(24*60*60)) )) + 186* ((unsigned)(24*60*60)) + ((unsigned)(24*60*60)) /2; ! 885: clkset(); ! 886: goto check; ! 887: } ! 888: ! 889: if (todr < ((unsigned)(1<<28))) { ! 890: printf("WARNING: todr too small"); ! 891: time = base; ! 892: ! 893: clkset(); ! 894: goto check; ! 895: } ! 896: ! 897: for (time = (todr-((unsigned)(1<<28)))/100; time < base- ((unsigned)(365* ((unsigned)(24*60*60)) )) /2; time += ((unsigned)(365* ((unsigned)(24*60*60)) )) ) { ! 898: if ( ((year)%4==0) ) ! 899: time += ((unsigned)(24*60*60)) ; ! 900: year++; ! 901: } ! 902: ! 903: deltat = time - base; ! 904: if (deltat < 0) ! 905: deltat = -deltat; ! 906: if (deltat < 2* ((unsigned)(24*60*60)) ) ! 907: return; ! 908: printf("WARNING: clock %s %d days", ! 909: time < base ? "lost" : "gained", deltat / ((unsigned)(24*60*60)) ); ! 910: check: ! 911: printf(" -- CHECK AND RESET THE DATE!\n"); ! 912: } ! 913: clkset() ! 914: { ! 915: int year = 1970; ! 916: unsigned secyr; ! 917: unsigned yrtime = time; ! 918: ! 919: for (;;) { ! 920: secyr = ((unsigned)(365* ((unsigned)(24*60*60)) )) ; ! 921: if ( ((year)%4==0) ) ! 922: secyr += ((unsigned)(24*60*60)) ; ! 923: if (yrtime < secyr) ! 924: break; ! 925: yrtime -= secyr; ! 926: year++; ! 927: } ! 928: mtpr(0x1b , ((unsigned)(1<<28)) + yrtime*100); ! 929: } ! 930: sendsig(p, n) ! 931: int (*p)(); ! 932: { ! 933: register int *usp, *regs; ! 934: regs = u.u_ar0; ! 935: usp = (int *)regs[(-5)]; ! 936: usp -= 5; ! 937: if ((int)usp <= (0x80000000-8 * 512) - ((u.u_ssize)<<9)) ! 938: (void) grow((unsigned)usp); ! 939: ; ! 940: asm("probew $3,$20,(r11)"); ! 941: asm("beql bad"); ! 942: *usp++ = n; ! 943: if (n == 4 || n == 8 ) { ! 944: *usp++ = u.u_code; ! 945: u.u_code = 0; ! 946: } else ! 947: *usp++ = 0; ! 948: *usp++ = (int)p; ! 949: *usp++ = regs[(-2)]; ! 950: *usp++ = regs[(-1)]; ! 951: regs[(-5)] = (int)(usp - 5); ! 952: regs[(-1)] &= ~( 0x80000000 | 0x08000000 ); ! 953: regs[(-2)] = (int)u.u_pcb.pcb_sigc; ! 954: return; ! 955: asm("bad:"); ! 956: bad: ! 957: ! 958: u.u_signal[4 ] = (int (*)())0; ! 959: u.u_procp->p_siga0 &= ~(1<<(4 -1)); ! 960: u.u_procp->p_siga1 &= ~(1<<(4 -1)); ! 961: psignal(u.u_procp, 4 ); ! 962: } ! 963: dorti() ! 964: { ! 965: struct frame frame; ! 966: register int sp; ! 967: register int reg, mask; ! 968: extern int ipcreg[]; ! 969: (void) copyin((caddr_t)u.u_ar0[(-20)], (caddr_t)&frame, sizeof (frame)); ! 970: sp = u.u_ar0[(-20)] + sizeof (frame); ! 971: u.u_ar0[(-2)] = frame.fr_savpc; ! 972: u.u_ar0[(-20)] = frame.fr_savfp; ! 973: u.u_ar0[(-21)] = frame.fr_savap; ! 974: mask = frame.fr_mask; ! 975: for (reg = 0; reg <= 11; reg++) { ! 976: if (mask&1) { ! 977: u.u_ar0[ipcreg[reg]] = fuword((caddr_t)sp); ! 978: sp += 4; ! 979: } ! 980: mask >>= 1; ! 981: } ! 982: sp += frame.fr_spa; ! 983: u.u_ar0[(-1)] = (u.u_ar0[(-1)] & 0xffff0000) | frame.fr_psw; ! 984: if (frame.fr_s) ! 985: sp += 4 + 4 * (fuword((caddr_t)sp) & 0xff); ! 986: ! 987: u.u_ar0[(-2)] = fuword((caddr_t)sp); ! 988: sp += 4; ! 989: u.u_ar0[(-1)] = fuword((caddr_t)sp); ! 990: sp += 4; ! 991: u.u_ar0[(-1)] |= (0x00c00000 |0x03000000 ); ! 992: u.u_ar0[(-1)] &= ~( 0x04000000 | 0x001f0000 | 0x3020ff00 ); ! 993: u.u_ar0[(-5)] = (int)sp; ! 994: } ! 995: int memintvl = (60*60*30) ; ! 996: memenable() ! 997: { ! 998: register struct mcr *mcr; ! 999: register int m; ! 1000: for (m = 0; m < nmcr; m++) { ! 1001: mcr = mcraddr[m]; ! 1002: switch (cpu) { ! 1003: } ! 1004: } ! 1005: if (memintvl > 0) ! 1006: timeout(memenable, (caddr_t)0, memintvl); ! 1007: } ! 1008: memerr() ! 1009: { ! 1010: register struct mcr *mcr; ! 1011: register int m; ! 1012: for (m = 0; m < nmcr; m++) { ! 1013: mcr = mcraddr[m]; ! 1014: switch (cpu) { ! 1015: } ! 1016: } ! 1017: } ! 1018: tbiscl(v) ! 1019: unsigned v; ! 1020: { ! 1021: register caddr_t addr; ! 1022: register int i; ! 1023: asm(".set TBIS,58"); ! 1024: addr = ((caddr_t)((v) << 9 )); ! 1025: for (i = 0; i < 2; i++) { ! 1026: asm("mtpr r11,$TBIS"); ! 1027: addr += 512; ! 1028: } ! 1029: } ! 1030: ! 1031: int waittime = -1; ! 1032: boot(paniced, arghowto) ! 1033: int paniced, arghowto; ! 1034: { ! 1035: register int howto; ! 1036: register int devtype; ! 1037: howto = arghowto; ! 1038: if ((howto&4 )==0 && waittime < 0 && bfreelist[0].b_forw) { ! 1039: waittime = 0; ! 1040: update(); ! 1041: printf("syncing disks... "); ! 1042: while (++waittime <= 5) ! 1043: sleep((caddr_t)&lbolt, 25); ! 1044: printf("done\n"); ! 1045: } ! 1046: splx(0x1f); ! 1047: devtype = ((int)(((unsigned)(rootdev)>>8)&0377)); ! 1048: if (howto& 8 ) { ! 1049: printf("halting (in tight loop); hit\n\t^P\n\tHALT\n\n"); ! 1050: mtpr(0x12 , 0x1f); ! 1051: for (;;) ! 1052: ; ! 1053: } else { ! 1054: if (paniced == 0 ) ! 1055: doadump(); ! 1056: tocons(0xf02 ); ! 1057: } ! 1058: for (;;) ! 1059: asm("halt"); ! 1060: ! 1061: } ! 1062: tocons(c) ! 1063: { ! 1064: while ((mfpr(0x22 )&0x00000080 ) == 0) ! 1065: continue; ! 1066: mtpr(0x23 , c); ! 1067: } ! 1068: dumpsys() ! 1069: { ! 1070: rpb.rp_flag = 1; ! 1071: if (( ((int)((dumpdev)&0377))&07) != 1) ! 1072: return; ! 1073: printf("\ndumping to dev %x, offset %d\n", dumpdev, dumplo); ! 1074: printf("dump "); ! 1075: switch ((*bdevsw[ ((int)(((unsigned)(dumpdev)>>8)&0377))].d_dump)(dumpdev)) { ! 1076: case 6: ! 1077: printf("device bad\n"); ! 1078: break; ! 1079: case 14: ! 1080: printf("device not ready\n"); ! 1081: break; ! 1082: case 22: ! 1083: printf("area improper\n"); ! 1084: break; ! 1085: case 5: ! 1086: printf("i/o error"); ! 1087: break; ! 1088: default: ! 1089: printf("succeeded"); ! 1090: break; ! 1091: } ! 1092: } ! 1093: struct mc780frame { ! 1094: int mc8_bcnt; ! 1095: int mc8_summary; ! 1096: int mc8_cpues; ! 1097: int mc8_upc; ! 1098: int mc8_vaviba; ! 1099: int mc8_dreg; ! 1100: int mc8_tber0; ! 1101: int mc8_tber1; ! 1102: int mc8_timo; ! 1103: int mc8_parity; ! 1104: int mc8_sbier; ! 1105: int mc8_pc; ! 1106: int mc8_psl; ! 1107: }; ! 1108: struct mc750frame { ! 1109: int mc5_bcnt; ! 1110: int mc5_summary; ! 1111: int mc5_va; ! 1112: int mc5_errpc; ! 1113: int mc5_mdr; ! 1114: int mc5_svmode; ! 1115: int mc5_rdtimo; ! 1116: int mc5_tbgpar; ! 1117: int mc5_cacherr; ! 1118: int mc5_buserr; ! 1119: int mc5_mcesr; ! 1120: int mc5_pc; ! 1121: int mc5_psl; ! 1122: }; ! 1123: struct mc7ZZframe { ! 1124: int mc3_bcnt; ! 1125: int mc3_summary; ! 1126: int mc3_parm[2]; ! 1127: int mc3_pc; ! 1128: int mc3_psl; ! 1129: }; ! 1130: machinecheck(cmcf) ! 1131: caddr_t cmcf; ! 1132: { ! 1133: register u_int type = ((struct mc780frame *)cmcf)->mc8_summary; ! 1134: printf("machine check %x: ", type); ! 1135: switch (cpu) { ! 1136: } ! 1137: switch (cpu) { ! 1138: } ! 1139: panic("mchk"); ! 1140: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.