|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.