home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 202.img / SCO386N2.TD0 / usr / include / sys / page.h < prev    next >
Encoding:
C/C++ Source or Header  |  1988-05-18  |  9.2 KB  |  347 lines

  1. /*
  2.  *    @(#) page.h 2.3 88/05/18 
  3.  *
  4.  *    Copyright (C) The Santa Cruz Operation, 1984, 1985, 1986, 1987.
  5.  *    Copyright (C) Microsoft Corporation, 1984, 1985, 1986, 1987.
  6.  *    This Module contains Proprietary Information of
  7.  *    The Santa Cruz Operation, Microsoft Corporation
  8.  *    and AT&T, and should be treated as Confidential.
  9.  */
  10.  
  11.  
  12. #ifdef M_I386
  13.  
  14. /*
  15.  * Format of a page directory or page table entry
  16.  *
  17.  *    N.B.: if te_pres is zero, the other bits have no assigned meaning,
  18.  *          and are all available for software use.
  19.  *
  20.  *    When the page table entry is marked present, the page frame number
  21.  *    (te_frameno) refers to a memory frame.  When the PTE is marked 
  22.  *    not present, te_frameno refers to a swap frame.
  23.  */
  24. struct tabent {
  25.     unsigned long    te_flags:9;    /* see below */
  26.     unsigned long    te_type:3;    /* see below */
  27.     unsigned long    te_frameno:20;    /* see below */
  28. };
  29.  
  30. /*
  31.  * values of te_flags
  32.  */
  33. #define TF_PRESENT    0x001    /* page is present */
  34. #define TF_WRITE    0x002    /* page is writable */
  35. #define TF_USER        0x004    /* access is kernel only */
  36. #define TF_RES1        0x008    /* reserved must not be set */
  37. #define TF_RES2        0x010    /* reserved must not be set */
  38. #define TF_ACCESSED    0x020    /* page has been accessed */
  39. #define TF_DIRTY    0x040    /* page has been written */
  40. #define TF_RES3        0x080    /* reserved must not be set */
  41. #define TF_RES4        0x100    /* reserved must not be set */
  42.  
  43. /*
  44.  * values of te_type
  45.  */
  46. #define TE_INVALID    0    /* page is not valid */
  47. #define TE_FILSYS    1    /* text page resides on filesystem */
  48. #define TE_LOCKED    2    /* page is locked in core (shared data) */
  49. #define TE_SWAP        3    /* page resides on swap area */
  50. #define TE_ZERO        4    /* zero fill on access */
  51. #define TE_COPY        5    /* copy on write */
  52. #define TE_INTRN    6    /* filesystem page in transit */
  53. #define TE_TABLE    7    /* page table or u area page */
  54.  
  55. /* 
  56.  * format of a linear address
  57.  */
  58. struct laddr {
  59.     unsigned la_off:12;        /* offset of byte in page */
  60.     unsigned la_page:10;        /* offset of pte in page table */ 
  61.     unsigned la_dir:10;        /* offset of pde in page directory */
  62. };
  63.  
  64. /*
  65.  * layout of a memory page frame information structure 
  66.  */
  67. struct mpfi {
  68.     struct mpfi *mp_fw, *mp_bw;    /* freelist chains */
  69.     struct dpfi *mp_xlink;        /* link to other map */
  70.     struct mpfi *mp_hash;        /* link for filsys cache list */
  71.     unsigned short mp_rcnt;        /* reference count */
  72.     unsigned short mp_flags;    /* see below for values */
  73.     dev_t    mp_dev;        /* device for filsys page */
  74.     ino_t    mp_ino;        /* inode for filsys page */
  75.     daddr_t mp_blockno;        /* block for filsys page */
  76. #ifdef SANITY
  77.     unsigned int mp_type;        /* type of page in this frame */
  78. #endif
  79.     unsigned char mp_lcnt;        /* number of locks on this page */
  80.     int mp_xser;            /* xlink serial number */
  81.     int mp_pid;            /* pid of owner if TE_SWAP */
  82. };
  83. extern struct mpfi *mftomp();
  84. extern pfn_t mptomf();
  85.  
  86. /*
  87.  * values of mp_flags
  88.  */
  89. #define MF_INTRANSIT    1
  90. #define MF_NOTIFY    2
  91. #define MF_DIRTY    4
  92. #define MF_CACHE    8
  93. #define MF_LOCKED    16
  94.  
  95. struct dpfi {
  96.     struct dpfi *dp_fw, *dp_bw;    /* freelist chains */
  97.     struct mpfi *dp_xlink;
  98.     unsigned short dp_flags;
  99.     unsigned short dp_rcnt;
  100. #ifdef SANITY
  101.     unsigned int dp_type;        /* type of page in this frame */
  102. #endif
  103.     int dp_xser;            /* xlink serial number */
  104.     int dp_pid;            /* pid of owner if TE_SWAP */
  105. };
  106. extern struct dpfi *dftodp();
  107.  
  108. /*
  109.  * values of dp_flags
  110.  */
  111. #define DF_INTRANSIT    1
  112. #define DF_NOTIFY    2
  113. #define DF_DIRTY    4
  114.  
  115.  
  116. /*
  117.  * values of cr0 register
  118.  */
  119. #define CR0_PE    0x00000001    /* protection enabled (segmentation) */
  120. #define CR0_MP    0x00000002    /* monitor coprocessor */
  121. #define CR0_EM    0x00000004    /* emulate coprocessor */
  122. #define CR0_TS    0x00000008    /* task switched */
  123. #define CR0_ET    0x00000010    /* coprocessor type */
  124. #define CR0_PG    0x80000000    /* paging enabled */
  125.  
  126. /*
  127.  * arguments to chgprot
  128.  */
  129. #define RO    0
  130. #define RW    TF_WRITE
  131.  
  132. /*
  133.  * some useful constants
  134.  */
  135. #define PGSIZE    ctob(1)
  136. #define NEPT    (ctob(1)/sizeof(struct tabent))
  137. #define NBPT    (NEPT*ctob(1))
  138.  
  139. /* how many pde's needed to map n bytes */
  140. #define btopde(n) (((n) + NBPT - 1)/NBPT)
  141. #define btopdet(n) ((n)/NBPT)
  142.  
  143. /* how many page table entries to map n bytes */
  144. #define btopte(n) (((n) + ctob(1) - 1)/ctob(1))
  145. #define btoptet(n) ((n)/ctob(1))
  146.  
  147. /* virtual address to page offset */
  148. #define    vtpo(a)        ((unsigned long)(a) & (PGSIZE-1))
  149.  
  150. /* virtual address to page number */
  151. #define    vtpn(a)        ( btoct((a)) )
  152.  
  153. /* kernel virtual address to linear address */
  154. #define    kvtol(a)    ( (unsigned long)(a) + KERNADDR )
  155.  
  156. /* linear address to page directory offset */
  157. #define latopdo(a)    ( (unsigned long)(a) >> 22 )
  158.  
  159. /* linear address to page table offset */
  160. #define latopto(a)    ( ((unsigned long)(a) >> 12) & 0x3ff)
  161.  
  162. /* linear address to page offset */
  163. #define latopo(a)    ((unsigned long)(a) & 0xfff)
  164.  
  165. /* page directory offset to linear address */
  166. #define pdotola(a)     (ctob((a) * NEPT))
  167.  
  168. #define BLOCKOK    0
  169. #define NOBLOCK    1
  170. #define NOMEMBLOCK 2
  171.  
  172. #define HEAD 0
  173. #define TAIL 1
  174.  
  175.  
  176. /*
  177.  * paging system statistics
  178.  */
  179. struct pgstat {
  180.     /* page cache statistics */
  181.     unsigned long ps_chits;        /* page cache hits */
  182.     unsigned long ps_cmisses;    /* page cache misses */
  183.  
  184.     /* swapping statistics */
  185.     unsigned long ps_swapins;    /* number of procs swapped in */
  186.     unsigned long ps_swapouts;    /* number of procs swapped out */
  187.  
  188.     /* page io statistics */
  189.     unsigned long ps_ffrds;        /* filesystem page reads */
  190.     unsigned long ps_swrds;        /* swap area page reads */
  191.     unsigned long ps_swwts;        /* swap area page writes */
  192.     unsigned long ps_pgrcl;        /* # pages reclaimed from free list */
  193.  
  194.     /* copy on write statistics */
  195.     unsigned long ps_fshare;    /* # of pages shared due to cow fork */
  196.     unsigned long ps_cshare;    /* # pages shared due to cache hits */
  197.     unsigned long ps_copy;        /* # of shared pages copied */
  198.  
  199.     /* page fault statistics */
  200.     unsigned long ps_flts;        /* total number of page faults */
  201. };
  202. extern struct pgstat pgstat;
  203.  
  204. #define NMFMAP  10
  205. #define NDFMAP    10
  206.  
  207. extern struct mfmap {
  208.     pfn_t fm_start;
  209.     pfn_t fm_end;
  210.     struct mpfi *fm_mp;
  211. };
  212.  
  213. extern struct dfmap {
  214.     pfn_t dm_start;
  215.     pfn_t dm_end;
  216.     struct dpfi *dm_dp;
  217.     dev_t dm_dev;
  218.     daddr_t dm_base;
  219. };
  220.  
  221. #define PG_OK       0
  222. #define PG_FAIL       1
  223. #define PG_NOROOM  2
  224. #define PG_RDONLY  3
  225. #define PG_PHYS       4
  226. #define PG_WEIT       5
  227.  
  228. typedef unsigned long laddr_t;
  229.  
  230. /* 
  231.  * from pgalloc.c
  232.  */
  233. extern pfn_t mfalloc(int);
  234. extern pfn_t dfalloc(void);
  235. extern struct mpfi *mfclaim(struct mpfi *);
  236. extern struct dpfi *dfclaim(struct dpfi *);
  237. extern void mffree(pfn_t, int);
  238. extern void dffree(pfn_t);
  239. extern void xlink(pfn_t, pfn_t);
  240. extern char *sptalloc(int);
  241. extern void sptfree(char *, int, int);
  242. extern int map(struct tabent *, int);
  243. extern void unmap(char *, int);
  244. extern int mapphys(char *, int);
  245. extern void unmapphys(char *, int);
  246. extern int mapptov(char *, unsigned int, int);
  247. extern void xlcheck(struct mpfi *, struct dpfi *);
  248. /*
  249.  * from pgbuild.c
  250.  */
  251. extern int buildpte(unsigned short, unsigned short, int);
  252. extern int impcode(unsigned short, unsigned short);
  253. extern int preload(struct inode *, unsigned short);
  254. /*
  255.  * from pgfault.c
  256.  */
  257. extern int pagefault(struct tabent);
  258. extern int pgaccess(laddr_t, int, int);
  259. extern int lverify(laddr_t, int);
  260. extern int pgfault(laddr_t, struct tabent, int);
  261. extern struct tabent *addpt(struct tabent *);
  262. /*
  263.  * from pghash.c
  264.  */
  265. extern int pgfind(dev_t, ino_t, daddr_t);
  266. extern void pghash(struct mpfi *);
  267. extern void pgunhash(dev_t, ino_t, daddr_t);
  268. extern void pginval(struct mpfi *);
  269. extern void pgpurge(dev_t);
  270. extern void pgflush(dev_t, ino_t);
  271. /*
  272.  * from pginit.c
  273.  */
  274. extern struct mpfi *mftomp(pfn_t);
  275. extern pfn_t mptomf(struct mpfi *);
  276. extern void memrange(pfn_t, pfn_t);
  277. extern pfn_t memget(int);
  278. extern void meminit(void);
  279. extern void mpinit(struct mpfi *, int);
  280. extern void swapadd(dev_t, daddr_t, daddr_t);
  281. extern void dpinit(struct dpfi *, int);
  282. extern void dfinit(void);
  283. extern struct dpfi *dftodp(pfn_t);
  284. extern pfn_t dptodf(struct dpfi *);
  285. extern void dptoblk(struct dpfi *, struct buf *);
  286. /*
  287.  * from pgio.c
  288.  */
  289. extern int pgread(pfn_t);
  290. extern int pgwrite(struct mpfi *, struct dpfi *);
  291. extern int pageio(int, struct dpfi *, int);
  292. extern int ffread(pfn_t, inodep_t, daddr_t);
  293. /*
  294.  * from pgmisc.c
  295.  */
  296. extern void uadjust(char *);
  297. extern void ptfree(struct tabent *, int);
  298. extern void ptshrink(pfn_t, pfn_t);
  299. extern void pgfree(struct tabent *, struct tabent *);
  300. extern struct tabent *vtopte(char *);
  301. extern struct tabent *ltopte(laddr_t);
  302. extern void pgcheck(struct tabent *, int);
  303. extern void pgset(struct tabent *, int);
  304. extern void pgpid(struct tabent *);
  305. extern laddr_t pghila(struct user *);
  306. extern laddr_t pglola(struct user *);
  307. /*
  308.  * from pgscan.c
  309.  */
  310. extern int wsscan(void);
  311. extern int pdscan(pfn_t, pfn_t);
  312.  
  313. #ifdef VPIX
  314. extern int ptscan(struct tabent *, struct tabent *, int);
  315. #else
  316. extern int ptscan(struct tabent *, struct tabent *);
  317. #endif
  318.  
  319. /* 
  320.  * from pgswap.c
  321.  */
  322. extern void sched(void);
  323. extern void swapout(struct proc *);
  324.  
  325. #ifdef VPIX
  326. extern int pdswapout(struct tabent *, pfn_t, pfn_t, int, struct user *);
  327. extern int ptswapout(struct tabent *, int, int, struct user *);
  328. #else
  329. extern int pdswapout(struct tabent *, pfn_t, pfn_t, int);
  330. extern int ptswapout(struct tabent *, int, int);
  331. #endif
  332.  
  333. extern int swapin(struct proc *);
  334. extern int ptswapin(struct tabent *, int);
  335. /*
  336.  * from pgxlat.c
  337.  */
  338. extern int dftomf(struct tabent *, int);
  339. extern int mftodf(struct tabent *);
  340. extern int fftomf(struct tabent *);
  341. extern pfn_t mfcvt(pfn_t);
  342. extern void mftoff(struct tabent *, struct user *);
  343. extern void pddup(struct user *);
  344. extern void ptdup(struct tabent *, struct tabent *, unsigned int);
  345.  
  346. #endif
  347.