Annotation of researchv10no/cmd/ccom/vax/tests/a.i, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.