Annotation of researchv10no/cmd/ccom/vax/tests/9.i, revision 1.1

1.1     ! root        1: /* vmmem.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 pte
        !            75: {
        !            76: unsigned int   pg_pfnum:21,            
        !            77:                :2,
        !            78:                pg_vreadm:1,            
        !            79:                pg_swapm:1,             
        !            80:                pg_fod:1,               
        !            81:                pg_m:1,                 
        !            82:                pg_prot:4,              
        !            83:                pg_v:1;                 
        !            84: };
        !            85: struct hpte
        !            86: {
        !            87: unsigned int   pg_pfnum:21,
        !            88:                :2,
        !            89:                pg_high:9;              
        !            90: };
        !            91: struct fpte
        !            92: {
        !            93: unsigned int   pg_blkno:20,            
        !            94:                pg_fileno:5,            
        !            95:                pg_fod:1,               
        !            96:                :1,
        !            97:                pg_prot:4,
        !            98:                pg_v:1;
        !            99: };
        !           100: struct pte *vtopte();
        !           101: extern struct pte Sysmap[];
        !           102: extern struct pte Usrptmap[];
        !           103: extern struct pte usrpt[];
        !           104: extern struct pte Swapmap[];
        !           105: extern struct pte Forkmap[];
        !           106: extern struct pte Xswapmap[];
        !           107: extern struct pte Xswap2map[];
        !           108: extern struct pte Pushmap[];
        !           109: extern struct pte Vfmap[];
        !           110: extern struct pte mmap[];
        !           111: extern struct pte msgbufmap[];
        !           112: extern struct pte camap[];
        !           113: extern struct pte Nexmap[][16];
        !           114: extern struct pte Prusrmap[];
        !           115: struct cmap
        !           116: {
        !           117: unsigned int   c_next:13,      
        !           118:                c_prev:13,      
        !           119:                c_lock:1,       
        !           120:                c_want:1,       
        !           121:                c_page:16,      
        !           122:                c_hlink:13,     
        !           123:                c_intrans:1,    
        !           124:                c_free:1,       
        !           125:                c_gone:1,       
        !           126:                c_type:2,       
        !           127:                c_blkno:20,     
        !           128:                c_ndx:10,       
        !           129:                c_mdev:6;       
        !           130: };
        !           131: struct cmap *cmap;
        !           132: struct cmap *ecmap;
        !           133: int    ncmap;
        !           134: struct cmap *mfind();
        !           135: int    firstfree, maxfree;
        !           136: int    ecmx;                   
        !           137: short  cmhash[512              ];
        !           138: struct direct
        !           139: {
        !           140:        ino_t   d_ino;
        !           141:        char    d_name[14               ];
        !           142: };
        !           143: struct pcb
        !           144: {
        !           145:        int     pcb_ksp;        
        !           146:        int     pcb_esp;        
        !           147:        int     pcb_ssp;        
        !           148:        int     pcb_usp;        
        !           149:        int     pcb_r0; 
        !           150:        int     pcb_r1; 
        !           151:        int     pcb_r2; 
        !           152:        int     pcb_r3; 
        !           153:        int     pcb_r4; 
        !           154:        int     pcb_r5; 
        !           155:        int     pcb_r6; 
        !           156:        int     pcb_r7; 
        !           157:        int     pcb_r8; 
        !           158:        int     pcb_r9; 
        !           159:        int     pcb_r10; 
        !           160:        int     pcb_r11; 
        !           161:        int     pcb_r12; 
        !           162:        int     pcb_r13; 
        !           163:        int     pcb_pc;         
        !           164:        int     pcb_psl;        
        !           165:        struct  pte *pcb_p0br;  
        !           166:        int     pcb_p0lr;       
        !           167:        struct  pte *pcb_p1br;  
        !           168:        int     pcb_p1lr;       
        !           169:        int     pcb_szpt;       
        !           170:        int     pcb_cmap2;
        !           171:        int     *pcb_sswap;
        !           172:        int     pcb_sigc[3];
        !           173: };
        !           174: struct dmap
        !           175: {
        !           176:        swblk_t dm_size;        
        !           177:        swblk_t dm_alloc;       
        !           178:        swblk_t dm_map[         32      ];      
        !           179: };
        !           180: struct dmap zdmap;
        !           181: struct dblock
        !           182: {
        !           183:        swblk_t db_base;        
        !           184:        swblk_t db_size;        
        !           185: };
        !           186: struct vtimes {
        !           187:        int     vm_utime;               
        !           188:        int     vm_stime;               
        !           189:        
        !           190:        unsigned vm_idsrss;             
        !           191:        unsigned vm_ixrss;              
        !           192:        int     vm_maxrss;              
        !           193:        int     vm_majflt;              
        !           194:        int     vm_minflt;              
        !           195:        int     vm_nswap;               
        !           196:        int     vm_inblk;               
        !           197:        int     vm_oublk;               
        !           198: };
        !           199: struct vtimes zvms;            
        !           200:  
        !           201:  
        !           202: struct user
        !           203: {
        !           204:        struct  pcb u_pcb;
        !           205:        int     u_arg[5];               
        !           206:        label_t u_qsav;                 
        !           207:        char    u_segflg;               
        !           208:        char    u_error;                
        !           209:        short   u_uid;                  
        !           210:        short   u_gid;                  
        !           211:        short   u_ruid;                 
        !           212:        short   u_rgid;                 
        !           213:        struct  proc *u_procp;          
        !           214:        int     *u_ap;                  
        !           215:        union {                         
        !           216:                struct  {
        !           217:                        int     R_val1;
        !           218:                        int     R_val2;
        !           219:                } u_rv;
        !           220:                off_t   r_off;
        !           221:                time_t  r_time;
        !           222:        } u_r;
        !           223:        caddr_t u_base;                 
        !           224:        unsigned int u_count;           
        !           225:        off_t   u_offset;               
        !           226:        struct  inode *u_cdir;          
        !           227:        struct  inode *u_rdir;          
        !           228:        char    u_dbuf[14               ];              
        !           229:        caddr_t u_dirp;                 
        !           230:        struct  direct u_dent;          
        !           231:        struct  inode *u_pdir;          
        !           232:        struct  file *u_ofile[20                ];      
        !           233:        char    u_pofile[20             ];      
        !           234:        label_t u_ssav;                 
        !           235:        int     (*u_signal[32])();      
        !           236:        int     u_code;                 
        !           237:        int     *u_ar0;                 
        !           238:        struct uprof {                  
        !           239:                short   *pr_base;       
        !           240:                unsigned pr_size;       
        !           241:                unsigned pr_off;        
        !           242:                unsigned pr_scale;      
        !           243:        } u_prof;
        !           244:        char    u_eosys;                
        !           245:        char    u_sep;                  
        !           246:        dev_t   u_ttydev;               
        !           247:        ino_t   u_ttyino;
        !           248:        union {
        !           249:           struct {                     
        !           250:                int     Ux_mag;         
        !           251:                unsigned Ux_tsize;      
        !           252:                unsigned Ux_dsize;      
        !           253:                unsigned Ux_bsize;      
        !           254:                unsigned Ux_ssize;      
        !           255:                unsigned Ux_entloc;     
        !           256:                unsigned Ux_unused;
        !           257:                unsigned Ux_relflg;
        !           258:           } Ux_A;
        !           259:           char ux_shell[32];   
        !           260:        } u_exdata;
        !           261:        char    u_comm[14               ];
        !           262:        time_t  u_start;
        !           263:        char    u_acflag;
        !           264:        short   u_fpflag;               
        !           265:        short   u_cmask;                
        !           266:        size_t  u_tsize;                
        !           267:        size_t  u_dsize;                
        !           268:        size_t  u_ssize;                
        !           269:        struct  vtimes u_vm;            
        !           270:        struct  vtimes u_cvm;           
        !           271:        struct  dmap u_dmap;            
        !           272:        struct  dmap u_smap;            
        !           273:        struct  dmap u_cdmap, u_csmap;  
        !           274:        time_t  u_outime;               
        !           275:        size_t  u_odsize, u_ossize;     
        !           276:        size_t  u_vrpages[20            ];      
        !           277:        int     u_limit[8];             
        !           278:        int     u_stack[1];
        !           279:                                        
        !           280: };
        !           281: extern struct user u;
        !           282: extern struct user swaputl;
        !           283: extern struct user forkutl;
        !           284: extern struct user xswaputl;
        !           285: extern struct user xswap2utl;
        !           286: extern struct user pushutl;
        !           287: extern struct user vfutl;
        !           288: extern struct user prusrutl;
        !           289: struct proc
        !           290: {
        !           291:        struct  proc *p_link;   
        !           292:        struct  proc *p_rlink;  
        !           293:        struct  pte *p_addr;    
        !           294:        char    p_usrpri;       
        !           295:        char    p_pri;          
        !           296:        char    p_cpu;          
        !           297:        char    p_stat;
        !           298:        char    p_time;         
        !           299:        char    p_nice;         
        !           300:        char    p_slptime;      
        !           301:        char    p_cursig;
        !           302:        long    p_sig;          
        !           303:        long    p_siga0;        
        !           304:        long    p_siga1;        
        !           305:        int     p_flag;
        !           306:        short   p_uid;          
        !           307:        short   p_pgrp;         
        !           308:        short   p_pid;          
        !           309:        short   p_ppid;         
        !           310:        short   p_poip;         
        !           311:        short   p_szpt;         
        !           312:        size_t  p_tsize;        
        !           313:        size_t  p_dsize;        
        !           314:        size_t  p_ssize;        
        !           315:        size_t  p_rssize;       
        !           316:        size_t  p_maxrss;       
        !           317:        size_t  p_swrss;        
        !           318:        swblk_t p_swaddr;       
        !           319:        caddr_t p_wchan;        
        !           320:        struct  text *p_textp;  
        !           321:        u_short p_clktim;       
        !           322:        u_short p_tsleep;       
        !           323:        struct  pte *p_p0br;    
        !           324:        struct  proc *p_xlink;  
        !           325:        short   p_cpticks;      
        !           326:        float   p_pctcpu;       
        !           327:        short   p_ndx;          
        !           328:        short   p_idhash;       
        !           329:        struct  proc *p_pptr;   
        !           330:        struct  inode *p_trace; 
        !           331: };
        !           332: short  pidhash[        63];
        !           333: struct proc *pfind();
        !           334: struct proc *proc, *procNPROC; 
        !           335: int    nproc;
        !           336: struct prochd {
        !           337:        struct  proc *ph_link;  
        !           338:        struct  proc *ph_rlink;
        !           339: } qs[32                ];
        !           340: int    whichqs;                
        !           341: struct xproc
        !           342: {
        !           343:        struct  proc *xp_link;
        !           344:        struct  proc *xp_rlink;
        !           345:        struct  pte *xp_addr;
        !           346:        char    xp_usrpri;
        !           347:        char    xp_pri;         
        !           348:        char    xp_cpu;         
        !           349:        char    xp_stat;
        !           350:        char    xp_time;        
        !           351:        char    xp_nice;        
        !           352:        char    xp_slptime;
        !           353:        char    p_cursig;
        !           354:        int     xp_sig;         
        !           355:        int     xp_siga0;
        !           356:        int     xp_siga1;
        !           357:        int     xp_flag;
        !           358:        short   xp_uid;         
        !           359:        short   xp_pgrp;        
        !           360:        short   xp_pid;         
        !           361:        short   xp_ppid;        
        !           362:        short   xp_xstat;       
        !           363:        struct  vtimes xp_vm;
        !           364: };
        !           365: struct text
        !           366: {
        !           367:        swblk_t x_daddr[12              ];      
        !           368:        swblk_t x_ptdaddr;      
        !           369:        size_t  x_size;         
        !           370:        struct proc *x_caddr;   
        !           371:        struct inode *x_iptr;   
        !           372:        short   x_rssize;
        !           373:        short   x_swrss;
        !           374:        char    x_count;        
        !           375:        char    x_ccount;       
        !           376:        char    x_flag;         
        !           377:        char    x_slptime;
        !           378:        short   x_poip;         
        !           379: };
        !           380: struct text *text, *textNTEXT;
        !           381: int    ntext;
        !           382:                                        
        !           383:                                        
        !           384: int    klseql;
        !           385: int    klsdist;
        !           386: int    klin;
        !           387: int    kltxt;
        !           388: int    klout;
        !           389: struct vmmeter
        !           390: {
        !           391:        unsigned v_swtch;       
        !           392:        unsigned v_trap;        
        !           393:        unsigned v_syscall;     
        !           394:        unsigned v_intr;        
        !           395:        unsigned v_pdma;        
        !           396:        unsigned v_pswpin;      
        !           397:        unsigned v_pswpout;     
        !           398:        unsigned v_pgin;        
        !           399:        unsigned v_pgout;       
        !           400:        unsigned v_pgpgin;      
        !           401:        unsigned v_pgpgout;     
        !           402:        unsigned v_intrans;     
        !           403:        unsigned v_pgrec;       
        !           404:        unsigned v_xsfrec;      
        !           405:        unsigned v_xifrec;      
        !           406:        unsigned v_exfod;       
        !           407:        unsigned v_zfod;        
        !           408:        unsigned v_vrfod;       
        !           409:        unsigned v_nexfod;      
        !           410:        unsigned v_nzfod;       
        !           411:        unsigned v_nvrfod;      
        !           412:        unsigned v_pgfrec;      
        !           413:        unsigned v_faults;      
        !           414:        unsigned v_scan;        
        !           415:        unsigned v_rev;         
        !           416:        unsigned v_seqfree;     
        !           417:        unsigned v_dfree;       
        !           418:        unsigned v_swpin;       
        !           419:        unsigned v_swpout;      
        !           420: };
        !           421: struct vmmeter cnt, rate, sum;
        !           422: struct vmtotal
        !           423: {
        !           424:        short   t_rq;           
        !           425:        short   t_dw;           
        !           426:        short   t_pw;           
        !           427:        short   t_sl;           
        !           428:        short   t_sw;           
        !           429:        int     t_vm;           
        !           430:        int     t_avm;          
        !           431:        short   t_rm;           
        !           432:        short   t_arm;          
        !           433:        int     t_vmtxt;        
        !           434:        int     t_avmtxt;       
        !           435:        short   t_rmtxt;        
        !           436:        short   t_armtxt;       
        !           437:        short   t_free;         
        !           438: };
        !           439: struct vmtotal total;
        !           440: int    freemem;                
        !           441: int    avefree;                
        !           442: int    avefree30;              
        !           443: int    deficit;                
        !           444: int    nscan;                  
        !           445: int    multprog;               
        !           446: int    desscan;                
        !           447: int    maxpgio;                
        !           448: int    maxslp;                 
        !           449: int    lotsfree;               
        !           450: int    minfree;                
        !           451: int    desfree;                
        !           452: int    saferss;                
        !           453: struct forkstat
        !           454: {
        !           455:        int     cntfork;
        !           456:        int     cntvfork;
        !           457:        int     sizfork;
        !           458:        int     sizvfork;
        !           459: };
        !           460: struct forkstat forkstat;
        !           461: struct swptstat
        !           462: {
        !           463:        int     pteasy;         
        !           464:        int     ptexpand;       
        !           465:        int     ptshrink;       
        !           466:        int     ptpack;         
        !           467: };
        !           468: struct swptstat swptstat;
        !           469: struct file
        !           470: {
        !           471:        short   f_flag;
        !           472:        short   f_count;                
        !           473:        struct inode *f_inode;          
        !           474:        off_t   f_offset;               
        !           475: };
        !           476: struct file *file, *fileNFILE; 
        !           477: int    nfile;
        !           478: struct file *getf();
        !           479: struct file *falloc();
        !           480: struct inode
        !           481: {
        !           482:        short   i_flag;
        !           483:        u_char  i_count;        
        !           484:        char    i_fstyp;        
        !           485:        dev_t   i_dev;          
        !           486:        long    i_number;       
        !           487:        unsigned short i_mode;
        !           488:        short   i_nlink;        
        !           489:        short   i_uid;          
        !           490:        short   i_gid;          
        !           491:        off_t   i_size;         
        !           492:        struct  stdata *i_sptr; 
        !           493:        union {
        !           494:                struct {
        !           495:                        daddr_t I_addr[13];     
        !           496:                        daddr_t I_lastr;        
        !           497:                } i_f;
        !           498:                struct {
        !           499:                        daddr_t I_rdev;         
        !           500:                        long    I_key;          
        !           501:                } i_d;
        !           502:                struct {
        !           503:                        long I_tag;
        !           504:                        struct inode *I_cip;    
        !           505:                } i_a;          
        !           506:                struct {
        !           507:                        struct proc *I_proc;    
        !           508:                        int         I_sigmask;  
        !           509:                } i_p;
        !           510:        } i_un;
        !           511:        short   i_hlink;        
        !           512: };
        !           513: struct inode *inode, *inodeNINODE;
        !           514: int    ninode;
        !           515: struct inode *rootdir;         
        !           516: struct inode *ialloc();
        !           517: struct inode *ifind();
        !           518: struct inode *iget();
        !           519: struct inode *owner();
        !           520: struct inode *maknode();
        !           521: struct inode *namei();
        !           522: struct argnamei {      
        !           523:        short flag;     
        !           524:        ino_t ino;      
        !           525:        dev_t idev;
        !           526:        short mode;     
        !           527: };
        !           528: struct nx {    
        !           529:        struct inode *dp;
        !           530:        char *cp;
        !           531:        struct buf *nbp;
        !           532:        int nlink;
        !           533: };
        !           534: struct bufhd
        !           535: {
        !           536:        long    b_flags;                
        !           537:        struct  buf *b_forw, *b_back;   
        !           538: };
        !           539: struct buf
        !           540: {
        !           541:        long    b_flags;                
        !           542:        struct  buf *b_forw, *b_back;   
        !           543:        struct  buf *av_forw, *av_back; 
        !           544:        long    b_bcount;               
        !           545:        short   b_error;                
        !           546:        dev_t   b_dev;                  
        !           547:        union {
        !           548:            caddr_t b_addr;             
        !           549:            int *b_words;               
        !           550:            struct filsys *b_filsys;    
        !           551:            struct dinode *b_dino;      
        !           552:            daddr_t *b_daddr;           
        !           553:        } b_un;
        !           554:        daddr_t b_blkno;                
        !           555:        long    b_resid;                
        !           556:        struct  proc *b_proc;           
        !           557: };
        !           558: struct buf *buf;               
        !           559: char   *buffers;
        !           560: int    nbuf;
        !           561: struct buf *swbuf;             
        !           562: int    nswbuf;
        !           563: short  *swsize;
        !           564: int    *swpf;
        !           565: struct buf bfreelist[  3               ];      
        !           566: struct buf bswlist;            
        !           567: struct buf *bclnlist;          
        !           568: struct buf *alloc();
        !           569: struct buf *baddr();
        !           570: struct buf *getblk();
        !           571: struct buf *geteblk();
        !           572: struct buf *bread();
        !           573: struct buf *breada();
        !           574: unsigned minphys();
        !           575: struct mount   
        !           576: {
        !           577:        dev_t   m_dev;          
        !           578:        struct  buf *m_bufp;    
        !           579:        struct  inode *m_inodp; 
        !           580:        struct  inode *m_idev;  
        !           581:        int     m_fstyp;        
        !           582: };
        !           583: struct mount mount[62          ];
        !           584:                                        
        !           585: struct map {
        !           586:        struct  mapent *m_limit;        
        !           587:        char    *m_name;                
        !           588: };
        !           589: struct mapent
        !           590: {
        !           591:        int     m_size;         
        !           592:        int     m_addr;         
        !           593: };
        !           594: struct map *swapmap;
        !           595: int    nswapmap;
        !           596: struct map *argmap;
        !           597: struct map *kernelmap;
        !           598: vmemall(pte, size, p, type)
        !           599:        register struct pte *pte;
        !           600:        int size;
        !           601:        struct proc *p;
        !           602: {
        !           603:        register int m;
        !           604:        if (size <= 0 || size > maxmem)
        !           605:                panic("vmemall size");
        !           606:        while (size > 0) {
        !           607:                if (freemem < desfree)
        !           608:                        wakeup((caddr_t)&proc[2]);      
        !           609:                while (freemem == 0)
        !           610:                        sleep((caddr_t)&freemem, 0+2);
        !           611:                m = imin(size, freemem);
        !           612:                (void) memall(pte, m, p, type);
        !           613:                size -= m;
        !           614:                pte += m;
        !           615:        }
        !           616:        if (freemem < desfree)
        !           617:                wakeup((caddr_t)&proc[2]);              
        !           618:        
        !           619:        return (1);
        !           620: }
        !           621: vmemfree(pte, count)
        !           622:        register struct pte *pte;
        !           623:        register int count;
        !           624: {
        !           625:        register struct cmap *c;
        !           626:        register struct pte *spte;
        !           627:        register int j;
        !           628:        int size, pcnt, fileno;
        !           629:        if (count % 2)
        !           630:                panic("vmemfree");
        !           631:        for (size = 0, pcnt = 0; count > 0; pte += 2, count -= 2) {
        !           632:                if (pte->pg_fod == 0 && pte->pg_pfnum) {
        !           633:                        c = &cmap[      ((((pte->pg_pfnum)-firstfree) / 2) + 1)];
        !           634:                        pcnt += 2;
        !           635:                        if (c->c_lock && c->c_type !=   0               ) {
        !           636:                                for (j = 0; j < 2; j++)
        !           637:                                        *(int *)(pte+j) &= (    0x78000000|0x00800000);
        !           638:                                c->c_gone = 1;
        !           639:                                goto free;
        !           640:                        }
        !           641:                        if (c->c_free) {
        !           642:                                pcnt -= 2;
        !           643:                                for (j = 0; j < 2; j++)
        !           644:                                        *(int *)(pte+j) &= (    0x78000000|0x00800000);
        !           645:                                if (c->c_type ==        1               )
        !           646:                                        distpte(&text[c->c_ndx], (int)c->c_page, pte);
        !           647:                                c->c_gone = 1;
        !           648:                                goto free;
        !           649:                        }
        !           650:                        if (size == 0)
        !           651:                                spte = pte;
        !           652:                        size += 2;
        !           653:                        continue;
        !           654:                }
        !           655:                if (pte->pg_fod) {
        !           656:                        fileno = ((struct fpte *)pte)->pg_fileno;
        !           657:                        if (fileno < 20         )
        !           658:                                if ((u.u_vrpages[fileno] -= 2) <= 0)
        !           659:                                        if (u.u_vrpages[fileno] < 0)
        !           660:                                                panic("vmemfree vrpages");
        !           661:                        for (j = 0; j < 2; j++)
        !           662:                                *(int *)(pte+j) &= (    0x78000000|0x00800000);
        !           663:                }
        !           664: free:
        !           665:                if (size) {
        !           666:                        memfree(spte, size, 1);
        !           667:                        size = 0;
        !           668:                }
        !           669:        }
        !           670:        if (size)
        !           671:                memfree(spte, size, 1);
        !           672:        return (pcnt);
        !           673: }
        !           674: munlink(pf)
        !           675:        unsigned pf;
        !           676: {
        !           677:        register int next, prev;
        !           678:        next = cmap[    ((((pf)-firstfree) / 2) + 1)].c_next;
        !           679:        prev = cmap[    ((((pf)-firstfree) / 2) + 1)].c_prev;
        !           680:        cmap[prev].c_next = next;
        !           681:        cmap[next].c_prev = prev;
        !           682:        cmap[   ((((pf)-firstfree) / 2) + 1)].c_free = 0;
        !           683:        if (freemem < minfree)
        !           684:                wakeup((caddr_t)&proc[2]);      
        !           685:        freemem -= 2;
        !           686: }
        !           687: memall(pte, size, p, type)
        !           688:        register struct pte *pte;
        !           689:        int size;
        !           690:        struct proc *p;
        !           691: {
        !           692:        register struct cmap *c;
        !           693:        register struct pte *rpte;
        !           694:        register struct proc *rp;
        !           695:        int i, j, next, curpos;
        !           696:        unsigned pf;
        !           697:        struct cmap *c1, *c2;
        !           698:        if (size % 2)
        !           699:                panic("memall");
        !           700:        if (size > freemem)
        !           701:                return (0);
        !           702:        ;
        !           703:        for (i = size; i > 0; i -= 2) {
        !           704:                curpos = cmap[0].c_next;
        !           705:                c = &cmap[curpos];
        !           706:                if (c->c_free == 0)
        !           707:                        panic("dup mem alloc");
        !           708:                if (    ((((curpos)-1) * 2) + firstfree) > maxfree)
        !           709:                        panic("bad mem alloc");
        !           710:                if (c->c_gone == 0 && c->c_type !=      0               ) {
        !           711:                        if (c->c_type ==        1               )
        !           712:                                rp = text[c->c_ndx].x_caddr;
        !           713:                        else
        !           714:                                rp = &proc[c->c_ndx];
        !           715:                        while (rp->p_flag & 0x00004000  )
        !           716:                                rp = rp->p_xlink;
        !           717:                        switch (c->c_type) {
        !           718:                        case    1               :
        !           719:                                rpte =          ((rp)->p_p0br + ( c->c_page));
        !           720:                                break;
        !           721:                        case    2               :
        !           722:                                rpte =          ((rp)->p_p0br + (rp)->p_tsize + ( c->c_page));
        !           723:                                break;
        !           724:                        case    3               :
        !           725:                                rpte =          (((rp)->p_p0br + (rp)->p_szpt*  (       512/(sizeof (struct pte))) - 8           - 1) - ( c->c_page));
        !           726:                                break;
        !           727:                        }
        !           728:                                (rpte)[1]. pg_pfnum = (rpte)[0]. pg_pfnum = 0;
        !           729:                        if (c->c_type ==        1               )
        !           730:                                distpte(&text[c->c_ndx], (int)c->c_page, rpte);
        !           731:                }
        !           732:                switch (type) {
        !           733:                case    0               :
        !           734:                        c->c_ndx = p->p_ndx;
        !           735:                        break;
        !           736:                case    1               :
        !           737:                        c->c_page =     ((int)( ptetov(p, pte)));
        !           738:                        c->c_ndx = p->p_textp - &text[0];
        !           739:                        break;
        !           740:                case    2               :
        !           741:                        c->c_page =     ((int)(( ptetov(p, pte)) - (p)->p_tsize));
        !           742:                        c->c_ndx = p->p_ndx;
        !           743:                        break;
        !           744:                case    3               :
        !           745:                        c->c_page =     ((int)(         (((unsigned)((0x80000000-8              *       512))) >>       9               ) - 1 - ( ptetov(p, pte))));
        !           746:                        c->c_ndx = p->p_ndx;
        !           747:                        break;
        !           748:                }
        !           749:                if (c->c_blkno) {
        !           750:                        
        !           751:                        j =     ((c->c_blkno)&(512              -1));
        !           752:                        c1 = &cmap[cmhash[j]];
        !           753:                        if (c1 == c)
        !           754:                                cmhash[j] = c1->c_hlink;
        !           755:                        else {
        !           756:                                for (;;) {
        !           757:                                        if (c1 == ecmap)
        !           758:                                                panic("memall ecmap");
        !           759:                                        c2 = c1;
        !           760:                                        c1 = &cmap[c2->c_hlink];
        !           761:                                        if (c1 == c)
        !           762:                                                break;
        !           763:                                }
        !           764:                                c2->c_hlink = c1->c_hlink;
        !           765:                        }
        !           766:                        if (mfind(c->c_mdev == 15                ?
        !           767:                              swapdev : mount[c->c_mdev].m_dev,
        !           768:                              (daddr_t)c->c_blkno))
        !           769:                                panic("memall mfind");
        !           770:                        c1->c_mdev = 0;
        !           771:                        c1->c_blkno = 0;
        !           772:                        c1->c_hlink = 0;
        !           773:                }
        !           774:                pf =    ((((curpos)-1) * 2) + firstfree);
        !           775:                for (j = 0; j < 2; j++)
        !           776:                        *(int *)pte++ = pf++;
        !           777:                c->c_free = 0;
        !           778:                c->c_gone = 0;
        !           779:                if (c->c_intrans || c->c_want)
        !           780:                        panic("memall intrans|want");
        !           781:                c->c_lock = 1;
        !           782:                c->c_type = type;
        !           783:                freemem -= 2;
        !           784:                next = c->c_next;
        !           785:                cmap[0].c_next = next;
        !           786:                cmap[next].c_prev = 0;
        !           787:        }
        !           788:        return (size);
        !           789: }
        !           790: memfree(pte, size, detach)
        !           791:        register struct pte *pte;
        !           792:        register int size;
        !           793: {
        !           794:        register int i, j, prev, next;
        !           795:        register struct cmap *c;
        !           796:        
        !           797:        if (size % 2)
        !           798:                panic("memfree");
        !           799:        if (freemem < 2 * (32/2))
        !           800:                wakeup((caddr_t)&freemem);
        !           801:        while (size > 0) {
        !           802:                size -= 2;
        !           803:                i = pte->pg_pfnum;
        !           804:                if (i < firstfree || i > maxfree)
        !           805:                        panic("bad mem free");
        !           806:                i =     ((((i)-firstfree) / 2) + 1);
        !           807:                c = &cmap[i];
        !           808:                if (c->c_free)
        !           809:                        panic("dup mem free");
        !           810:                if (detach && c->c_type !=      0               ) {
        !           811:                        for (j = 0; j < 2; j++)
        !           812:                                *(int *)(pte+j) &= (    0x78000000|0x00800000);
        !           813:                        c->c_gone = 1;
        !           814:                }
        !           815:                if (detach && c->c_blkno == 0) {
        !           816:                        next = cmap[0].c_next;
        !           817:                        cmap[next].c_prev = i;
        !           818:                        c->c_prev = 0;
        !           819:                        c->c_next = next;
        !           820:                        cmap[0].c_next = i;
        !           821:                } else {
        !           822:                        prev = cmap[0].c_prev;
        !           823:                        cmap[prev].c_next = i;
        !           824:                        c->c_next = 0;
        !           825:                        c->c_prev = prev;
        !           826:                        cmap[0].c_prev = i;
        !           827:                }
        !           828:                c->c_free = 1;
        !           829:                freemem += 2;
        !           830:                pte += 2;
        !           831:        }
        !           832: }
        !           833: caddr_t
        !           834: wmemall(pmemall, n)
        !           835:        int (*pmemall)(), n;
        !           836: {
        !           837:        int npg;
        !           838:        caddr_t va;
        !           839:        register int a;
        !           840:        npg =   ((((unsigned)(n)+511)>>9));
        !           841:        a = rmalloc(kernelmap, npg);
        !           842:        if (a == 0)
        !           843:                return (0);
        !           844:        if ((*pmemall)(&Usrptmap[a], npg, &proc[0],     0               ) == 0) {
        !           845:                rmfree(kernelmap, npg, a);
        !           846:                return (0);
        !           847:        }
        !           848:        va = (caddr_t)  (usrpt + (a) *  (       512/(sizeof (struct pte))));
        !           849:        vmaccess(&Usrptmap[a], va, npg);
        !           850:        return (va);
        !           851: }
        !           852: wmemfree(va, n)
        !           853:        caddr_t va;
        !           854:        int n;
        !           855: {
        !           856:        register int a;
        !           857:        int npg;
        !           858:        a =     ((((struct pte *) va) - usrpt) /        (       512/(sizeof (struct pte))));
        !           859:        npg =   ((((unsigned)(n)+511)>>9));
        !           860:        (void) memfree(&Usrptmap[a], npg, 0);
        !           861:        rmfree(kernelmap, npg, a);
        !           862: }
        !           863: mhash(c, dev, bn)
        !           864:        register struct cmap *c;
        !           865:        dev_t dev;
        !           866:        daddr_t bn;
        !           867: {
        !           868:        register int i =        ((bn)&(512              -1));
        !           869:        c->c_hlink = cmhash[i];
        !           870:        cmhash[i] = c - cmap;
        !           871:        c->c_blkno = bn;
        !           872:        i = getfsx(dev);
        !           873:        if (i == -1)
        !           874:                panic("mhash");
        !           875:        c->c_mdev = i;
        !           876: }
        !           877: munhash(dev, bn)
        !           878:        dev_t dev;
        !           879:        daddr_t bn;
        !           880: {
        !           881:        register int i =        ((bn)&(512              -1));
        !           882:        register struct cmap *c1, *c2;
        !           883:        c1 = &cmap[cmhash[i]];
        !           884:        if (c1 == ecmap)
        !           885:                panic("munhash");
        !           886:        if (c1->c_blkno == bn && getfsx(dev) == c1->c_mdev)
        !           887:                cmhash[i] = c1->c_hlink;
        !           888:        else {
        !           889:                for (;;) {
        !           890:                        c2 = c1;
        !           891:                        c1 = &cmap[c2->c_hlink];
        !           892:                        if (c1 == ecmap)
        !           893:                                panic("munhash");
        !           894:                        if (c1->c_blkno == bn && getfsx(dev) == c1->c_mdev)
        !           895:                                break;
        !           896:                }
        !           897:                c2->c_hlink = c1->c_hlink;
        !           898:        }
        !           899:        if (mfind(dev, bn))
        !           900:                panic("munhash mfind");
        !           901:        c1->c_mdev = 0;
        !           902:        c1->c_blkno = 0;
        !           903:        c1->c_hlink = 0;
        !           904: }
        !           905: struct cmap *
        !           906: mfind(dev, bn)
        !           907:        dev_t dev;
        !           908:        daddr_t bn;
        !           909: {
        !           910:        register struct cmap *c1 = &cmap[cmhash[        ((bn)&(512              -1))]];
        !           911:        while (c1 != ecmap) {
        !           912:                if (c1->c_blkno == bn && c1->c_mdev == getfsx(dev))
        !           913:                        return (c1);
        !           914:                c1 = &cmap[c1->c_hlink];
        !           915:        }
        !           916:        return ((struct cmap *)0);
        !           917: }
        !           918: mpurge(mdev)
        !           919:        int mdev;
        !           920: {
        !           921:        register struct cmap *c1, *c2;
        !           922:        register int i;
        !           923:        for (i = 0; i < 512             ; i++) {
        !           924: more:
        !           925:                c1 = &cmap[cmhash[i]];
        !           926:                if (c1 == ecmap)
        !           927:                        continue;
        !           928:                if (c1->c_mdev == mdev)
        !           929:                        cmhash[i] = c1->c_hlink;
        !           930:                else {
        !           931:                        for (;;) {
        !           932:                                c2 = c1;
        !           933:                                c1 = &cmap[c1->c_hlink];
        !           934:                                if (c1 == ecmap)
        !           935:                                        goto cont;
        !           936:                                if (c1->c_mdev == mdev)
        !           937:                                        break;
        !           938:                        }
        !           939:                        c2->c_hlink = c1->c_hlink;
        !           940:                }
        !           941:                c1->c_mdev = 0;
        !           942:                c1->c_blkno = 0;
        !           943:                c1->c_hlink = 0;
        !           944:                goto more;
        !           945: cont:
        !           946:                ;
        !           947:        }
        !           948: }
        !           949: meminit(first, last)
        !           950:        int first, last;
        !           951: {
        !           952:        register int i;
        !           953:        register struct cmap *c;
        !           954:        firstfree =     (((first) + (2-1)) &~ (2-1));
        !           955:        maxfree =       (((last - (2 - 1)) + (2-1)) &~ (2-1));
        !           956:        freemem = maxfree - firstfree;
        !           957:        ecmx = ecmap - cmap;
        !           958:        if (ecmx < freemem / 2)
        !           959:                freemem = ecmx * 2;
        !           960:        for (i = 1; i <= freemem / 2; i++) {
        !           961:                cmap[i-1].c_next = i;
        !           962:                c = &cmap[i];
        !           963:                c->c_prev = i-1;
        !           964:                c->c_free = 1;
        !           965:                c->c_gone = 1;
        !           966:                c->c_type =     0               ;
        !           967:                c->c_mdev = 0;
        !           968:                c->c_blkno = 0;
        !           969:        }
        !           970:        cmap[freemem / 2].c_next = 0;
        !           971:        for (i = 0; i < 512             ; i++)
        !           972:                cmhash[i] = ecmx;
        !           973:        cmap[0].c_prev = freemem / 2;
        !           974:        cmap[0].c_type =        0               ;
        !           975:        avefree = freemem;
        !           976:        hand = 0;
        !           977: }
        !           978: mwait(pf)
        !           979:        unsigned pf;
        !           980: {
        !           981:        mlock(pf);
        !           982:        munlock(pf);
        !           983: }
        !           984: mlock(pf)
        !           985:        unsigned pf;
        !           986: {
        !           987:        register struct cmap *c = &cmap[        ((((pf)-firstfree) / 2) + 1)];
        !           988:        while (c->c_lock) {
        !           989:                c->c_want = 1;
        !           990:                sleep((caddr_t)c, 0+1);
        !           991:        }
        !           992:        c->c_lock = 1;
        !           993: }
        !           994: munlock(pf)
        !           995:        unsigned pf;
        !           996: {
        !           997:        register struct cmap *c = &cmap[        ((((pf)-firstfree) / 2) + 1)];
        !           998:        if (c->c_lock == 0)
        !           999:                panic("dup page unlock");
        !          1000:        if (c->c_want)
        !          1001:                wakeup((caddr_t)c);
        !          1002:        c->c_lock = 0;
        !          1003:        c->c_want = 0;
        !          1004: }
        !          1005: vslock(base, count)
        !          1006:        caddr_t base;
        !          1007: {
        !          1008:        register unsigned v;
        !          1009:        register int npf;
        !          1010:        register struct pte *pte;
        !          1011:        u.u_procp->p_flag |= 0x00000200 ;
        !          1012:        v =             (((unsigned)(base)) >>  9               );
        !          1013:        pte = vtopte(u.u_procp, v);
        !          1014:        npf =   ((((unsigned)(count + ((int)base &      (2*     512-1)  ))+511)>>9));
        !          1015:        while (npf > 0) {
        !          1016:                if (pte->pg_v) 
        !          1017:                        mlock(pte->pg_pfnum);
        !          1018:                else
        !          1019:                        if (fubyte((caddr_t)    ((v)<<9)) < 0)
        !          1020:                                panic("vslock");
        !          1021:                pte += 2;
        !          1022:                v += 2;
        !          1023:                npf -= 2;
        !          1024:        }
        !          1025:        u.u_procp->p_flag &= ~0x00000200        ;
        !          1026: }
        !          1027: vsunlock(base, count, rw)
        !          1028:        caddr_t base;
        !          1029: {
        !          1030:        register struct pte *pte;
        !          1031:        register int npf;
        !          1032:        pte = vtopte(u.u_procp,                 (((unsigned)(base)) >>  9               ));
        !          1033:        npf =   ((((unsigned)(count + ((int)base &      (2*     512-1)  ))+511)>>9));
        !          1034:        while (npf > 0) {
        !          1035:                munlock(pte->pg_pfnum);
        !          1036:                if (rw ==       0x000001        )       
        !          1037:                        pte->pg_m = 1;
        !          1038:                pte += 2;
        !          1039:                npf -= 2;
        !          1040:        }
        !          1041: }

unix.superglobalmegacorp.com

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