home *** CD-ROM | disk | FTP | other *** search
- /* History:
- 5/1/91 DJB baseline
- Originally stolen from Dupuy ofiles.
- */
-
- /*
-
- XXX: Don't ask me what this does; I dunno nuthin' bout no mmaps, bro.
-
- */
-
- #include "structproc.h"
- #include "vmstuff.h"
- #include "getvmseg.h"
- #include "structxnode.h"
- #include "kmem.h"
- #include "confhavevmseg.h"
-
- int vmsegmax;
-
- #ifndef HAVE_VMSEG
- static struct vnode *result = 0;
-
- struct vnode **getvmseg(p)
- struct proc *p;
- {
- vmsegmax = 1;
- return &result;
- }
-
- int seginit()
- {
- ;
- }
-
- #else
-
- #define SEGNLIST "_segvn_ops"
- #define MAXSEGS 256
-
- static int init = 0;
- static unsigned long nlsegvnv;
- static short nlsegvnt;
-
- int seginit()
- {
- nlistadd(SEGNLIST,&nlsegvnt,&nlsegvnv);
- init = 1;
- return 0;
- }
-
- struct vnode **getvmseg(p)
- struct proc *p;
- {
- static struct vnode *segvns[MAXSEGS];
- struct as as;
- struct seg seg;
- struct seg *s;
- register int segn;
- union gseg
- {
- struct segvn_data segvn;
- struct segdev_data segdev;
- struct segmap_data segmap;
- }
- gseg;
-
- segvns[0] = 0;
- if (!(p->p_as))
- return segvns;
-
- if (!init)
- seginit();
- if (nlsegvnt == -1)
- nlistdo();
-
- kmemcpy((char *) &as,(char *) p->p_as,sizeof(as));
-
- segn = 0;
-
- for (s = as.a_segs;;s = seg.s_next)
- {
- kmemcpy((char *) &seg,(char *) s,sizeof(seg));
- kmemcpy((char *) &gseg,(char *) seg.s_data,sizeof(gseg));
- if ((unsigned long) seg.s_ops == nlsegvnv
- &&gseg.segvn.vp
- &&!gseg.segvn.amp)
- segvns[segn++] = gseg.segvn.vp;
- if (s == as.a_seglast || segn == MAXSEGS)
- {
- vmsegmax = segn;
- return segvns;
- }
- }
- }
-
- #endif
-