home *** CD-ROM | disk | FTP | other *** search
- /*
- * @(#) page.h 2.3 88/05/18
- *
- * Copyright (C) The Santa Cruz Operation, 1984, 1985, 1986, 1987.
- * Copyright (C) Microsoft Corporation, 1984, 1985, 1986, 1987.
- * This Module contains Proprietary Information of
- * The Santa Cruz Operation, Microsoft Corporation
- * and AT&T, and should be treated as Confidential.
- */
-
-
- #ifdef M_I386
-
- /*
- * Format of a page directory or page table entry
- *
- * N.B.: if te_pres is zero, the other bits have no assigned meaning,
- * and are all available for software use.
- *
- * When the page table entry is marked present, the page frame number
- * (te_frameno) refers to a memory frame. When the PTE is marked
- * not present, te_frameno refers to a swap frame.
- */
- struct tabent {
- unsigned long te_flags:9; /* see below */
- unsigned long te_type:3; /* see below */
- unsigned long te_frameno:20; /* see below */
- };
-
- /*
- * values of te_flags
- */
- #define TF_PRESENT 0x001 /* page is present */
- #define TF_WRITE 0x002 /* page is writable */
- #define TF_USER 0x004 /* access is kernel only */
- #define TF_RES1 0x008 /* reserved must not be set */
- #define TF_RES2 0x010 /* reserved must not be set */
- #define TF_ACCESSED 0x020 /* page has been accessed */
- #define TF_DIRTY 0x040 /* page has been written */
- #define TF_RES3 0x080 /* reserved must not be set */
- #define TF_RES4 0x100 /* reserved must not be set */
-
- /*
- * values of te_type
- */
- #define TE_INVALID 0 /* page is not valid */
- #define TE_FILSYS 1 /* text page resides on filesystem */
- #define TE_LOCKED 2 /* page is locked in core (shared data) */
- #define TE_SWAP 3 /* page resides on swap area */
- #define TE_ZERO 4 /* zero fill on access */
- #define TE_COPY 5 /* copy on write */
- #define TE_INTRN 6 /* filesystem page in transit */
- #define TE_TABLE 7 /* page table or u area page */
-
- /*
- * format of a linear address
- */
- struct laddr {
- unsigned la_off:12; /* offset of byte in page */
- unsigned la_page:10; /* offset of pte in page table */
- unsigned la_dir:10; /* offset of pde in page directory */
- };
-
- /*
- * layout of a memory page frame information structure
- */
- struct mpfi {
- struct mpfi *mp_fw, *mp_bw; /* freelist chains */
- struct dpfi *mp_xlink; /* link to other map */
- struct mpfi *mp_hash; /* link for filsys cache list */
- unsigned short mp_rcnt; /* reference count */
- unsigned short mp_flags; /* see below for values */
- dev_t mp_dev; /* device for filsys page */
- ino_t mp_ino; /* inode for filsys page */
- daddr_t mp_blockno; /* block for filsys page */
- #ifdef SANITY
- unsigned int mp_type; /* type of page in this frame */
- #endif
- unsigned char mp_lcnt; /* number of locks on this page */
- int mp_xser; /* xlink serial number */
- int mp_pid; /* pid of owner if TE_SWAP */
- };
- extern struct mpfi *mftomp();
- extern pfn_t mptomf();
-
- /*
- * values of mp_flags
- */
- #define MF_INTRANSIT 1
- #define MF_NOTIFY 2
- #define MF_DIRTY 4
- #define MF_CACHE 8
- #define MF_LOCKED 16
-
- struct dpfi {
- struct dpfi *dp_fw, *dp_bw; /* freelist chains */
- struct mpfi *dp_xlink;
- unsigned short dp_flags;
- unsigned short dp_rcnt;
- #ifdef SANITY
- unsigned int dp_type; /* type of page in this frame */
- #endif
- int dp_xser; /* xlink serial number */
- int dp_pid; /* pid of owner if TE_SWAP */
- };
- extern struct dpfi *dftodp();
-
- /*
- * values of dp_flags
- */
- #define DF_INTRANSIT 1
- #define DF_NOTIFY 2
- #define DF_DIRTY 4
-
-
- /*
- * values of cr0 register
- */
- #define CR0_PE 0x00000001 /* protection enabled (segmentation) */
- #define CR0_MP 0x00000002 /* monitor coprocessor */
- #define CR0_EM 0x00000004 /* emulate coprocessor */
- #define CR0_TS 0x00000008 /* task switched */
- #define CR0_ET 0x00000010 /* coprocessor type */
- #define CR0_PG 0x80000000 /* paging enabled */
-
- /*
- * arguments to chgprot
- */
- #define RO 0
- #define RW TF_WRITE
-
- /*
- * some useful constants
- */
- #define PGSIZE ctob(1)
- #define NEPT (ctob(1)/sizeof(struct tabent))
- #define NBPT (NEPT*ctob(1))
-
- /* how many pde's needed to map n bytes */
- #define btopde(n) (((n) + NBPT - 1)/NBPT)
- #define btopdet(n) ((n)/NBPT)
-
- /* how many page table entries to map n bytes */
- #define btopte(n) (((n) + ctob(1) - 1)/ctob(1))
- #define btoptet(n) ((n)/ctob(1))
-
- /* virtual address to page offset */
- #define vtpo(a) ((unsigned long)(a) & (PGSIZE-1))
-
- /* virtual address to page number */
- #define vtpn(a) ( btoct((a)) )
-
- /* kernel virtual address to linear address */
- #define kvtol(a) ( (unsigned long)(a) + KERNADDR )
-
- /* linear address to page directory offset */
- #define latopdo(a) ( (unsigned long)(a) >> 22 )
-
- /* linear address to page table offset */
- #define latopto(a) ( ((unsigned long)(a) >> 12) & 0x3ff)
-
- /* linear address to page offset */
- #define latopo(a) ((unsigned long)(a) & 0xfff)
-
- /* page directory offset to linear address */
- #define pdotola(a) (ctob((a) * NEPT))
-
- #define BLOCKOK 0
- #define NOBLOCK 1
- #define NOMEMBLOCK 2
-
- #define HEAD 0
- #define TAIL 1
-
-
- /*
- * paging system statistics
- */
- struct pgstat {
- /* page cache statistics */
- unsigned long ps_chits; /* page cache hits */
- unsigned long ps_cmisses; /* page cache misses */
-
- /* swapping statistics */
- unsigned long ps_swapins; /* number of procs swapped in */
- unsigned long ps_swapouts; /* number of procs swapped out */
-
- /* page io statistics */
- unsigned long ps_ffrds; /* filesystem page reads */
- unsigned long ps_swrds; /* swap area page reads */
- unsigned long ps_swwts; /* swap area page writes */
- unsigned long ps_pgrcl; /* # pages reclaimed from free list */
-
- /* copy on write statistics */
- unsigned long ps_fshare; /* # of pages shared due to cow fork */
- unsigned long ps_cshare; /* # pages shared due to cache hits */
- unsigned long ps_copy; /* # of shared pages copied */
-
- /* page fault statistics */
- unsigned long ps_flts; /* total number of page faults */
- };
- extern struct pgstat pgstat;
-
- #define NMFMAP 10
- #define NDFMAP 10
-
- extern struct mfmap {
- pfn_t fm_start;
- pfn_t fm_end;
- struct mpfi *fm_mp;
- };
-
- extern struct dfmap {
- pfn_t dm_start;
- pfn_t dm_end;
- struct dpfi *dm_dp;
- dev_t dm_dev;
- daddr_t dm_base;
- };
-
- #define PG_OK 0
- #define PG_FAIL 1
- #define PG_NOROOM 2
- #define PG_RDONLY 3
- #define PG_PHYS 4
- #define PG_WEIT 5
-
- typedef unsigned long laddr_t;
-
- /*
- * from pgalloc.c
- */
- extern pfn_t mfalloc(int);
- extern pfn_t dfalloc(void);
- extern struct mpfi *mfclaim(struct mpfi *);
- extern struct dpfi *dfclaim(struct dpfi *);
- extern void mffree(pfn_t, int);
- extern void dffree(pfn_t);
- extern void xlink(pfn_t, pfn_t);
- extern char *sptalloc(int);
- extern void sptfree(char *, int, int);
- extern int map(struct tabent *, int);
- extern void unmap(char *, int);
- extern int mapphys(char *, int);
- extern void unmapphys(char *, int);
- extern int mapptov(char *, unsigned int, int);
- extern void xlcheck(struct mpfi *, struct dpfi *);
- /*
- * from pgbuild.c
- */
- extern int buildpte(unsigned short, unsigned short, int);
- extern int impcode(unsigned short, unsigned short);
- extern int preload(struct inode *, unsigned short);
- /*
- * from pgfault.c
- */
- extern int pagefault(struct tabent);
- extern int pgaccess(laddr_t, int, int);
- extern int lverify(laddr_t, int);
- extern int pgfault(laddr_t, struct tabent, int);
- extern struct tabent *addpt(struct tabent *);
- /*
- * from pghash.c
- */
- extern int pgfind(dev_t, ino_t, daddr_t);
- extern void pghash(struct mpfi *);
- extern void pgunhash(dev_t, ino_t, daddr_t);
- extern void pginval(struct mpfi *);
- extern void pgpurge(dev_t);
- extern void pgflush(dev_t, ino_t);
- /*
- * from pginit.c
- */
- extern struct mpfi *mftomp(pfn_t);
- extern pfn_t mptomf(struct mpfi *);
- extern void memrange(pfn_t, pfn_t);
- extern pfn_t memget(int);
- extern void meminit(void);
- extern void mpinit(struct mpfi *, int);
- extern void swapadd(dev_t, daddr_t, daddr_t);
- extern void dpinit(struct dpfi *, int);
- extern void dfinit(void);
- extern struct dpfi *dftodp(pfn_t);
- extern pfn_t dptodf(struct dpfi *);
- extern void dptoblk(struct dpfi *, struct buf *);
- /*
- * from pgio.c
- */
- extern int pgread(pfn_t);
- extern int pgwrite(struct mpfi *, struct dpfi *);
- extern int pageio(int, struct dpfi *, int);
- extern int ffread(pfn_t, inodep_t, daddr_t);
- /*
- * from pgmisc.c
- */
- extern void uadjust(char *);
- extern void ptfree(struct tabent *, int);
- extern void ptshrink(pfn_t, pfn_t);
- extern void pgfree(struct tabent *, struct tabent *);
- extern struct tabent *vtopte(char *);
- extern struct tabent *ltopte(laddr_t);
- extern void pgcheck(struct tabent *, int);
- extern void pgset(struct tabent *, int);
- extern void pgpid(struct tabent *);
- extern laddr_t pghila(struct user *);
- extern laddr_t pglola(struct user *);
- /*
- * from pgscan.c
- */
- extern int wsscan(void);
- extern int pdscan(pfn_t, pfn_t);
-
- #ifdef VPIX
- extern int ptscan(struct tabent *, struct tabent *, int);
- #else
- extern int ptscan(struct tabent *, struct tabent *);
- #endif
-
- /*
- * from pgswap.c
- */
- extern void sched(void);
- extern void swapout(struct proc *);
-
- #ifdef VPIX
- extern int pdswapout(struct tabent *, pfn_t, pfn_t, int, struct user *);
- extern int ptswapout(struct tabent *, int, int, struct user *);
- #else
- extern int pdswapout(struct tabent *, pfn_t, pfn_t, int);
- extern int ptswapout(struct tabent *, int, int);
- #endif
-
- extern int swapin(struct proc *);
- extern int ptswapin(struct tabent *, int);
- /*
- * from pgxlat.c
- */
- extern int dftomf(struct tabent *, int);
- extern int mftodf(struct tabent *);
- extern int fftomf(struct tabent *);
- extern pfn_t mfcvt(pfn_t);
- extern void mftoff(struct tabent *, struct user *);
- extern void pddup(struct user *);
- extern void ptdup(struct tabent *, struct tabent *, unsigned int);
-
- #endif
-