/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos72V src/bos/kernel/sys/vminfo.h 1.19.5.12                           */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 1988,2020              */
/* All Rights Reserved                                                    */
/*                                                                        */
/* US Government Users Restricted Rights - Use, duplication or            */
/* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.      */
/*                                                                        */
/* IBM_PROLOG_END_TAG                                                     */
/* @(#)19     1.19.5.12  src/bos/kernel/sys/vminfo.h, sysvmm, bos72V, v2020_28A5 7/1/20 11:48:31 */
#ifndef _H_VMINFO
#define _H_VMINFO

/*
 * COMPONENT_NAME: (SYSVMM) Virtual Memory Manager
 *
 * FUNCTIONS:
 *
 * ORIGINS: 27, 83
 *
 */
#include <sys/types.h>
#include <sys/corralid.h>
#include <sys/rset.h>
#include <sys/time.h>

#ifdef __cplusplus
extern "C" {
#endif

/* Information shown by vmstat command.
 */
struct vminfo {
	uint	pgexct; 	/* count of page faults     		*/
	uint	pgrclm; 	/* count of page reclaims 		*/
	uint	lockexct;	/* count of lockmisses	    		*/
	uint	backtrks;    	/* count of backtracks	    		*/
	uint	pageins;	/* count of pages paged in  		*/
	uint	pageouts;	/* count of pages paged out 		*/
	uint	pgspgins;	/* count of page ins from paging space	*/
	uint	pgspgouts;	/* count of page outs from paging space */
	uint	numsios;	/* count of start I/Os	    		*/
	uint	numiodone;	/* count of iodones	    		*/
	uint	zerofills;      /* count of zero filled pages 		*/
	uint	exfills;        /* count of exec filled pages		*/
	uint	scans;      	/* count of page scans by clock 	*/
	uint	cycles;      	/* count of clock hand cycles		*/
	uint	pgsteals;      	/* count of page steals	   		*/
	uint	freewts;      	/* count of free frame waits		*/
	uint	extendwts;      /* count of extend XPT waits		*/
	uint	pendiowts;      /* count of pending I/O waits  		*/
	uint	pings;		/* count of ping-pongs: source => alias */
	uint	pongs;		/* count of ping-pongs: alias => source */
	uint	pangs;		/* count of ping-pongs: alias => alias  */
	uint	dpongs;		/* count of ping-pongs: alias page delete */
	uint	wpongs;		/* count of ping-pongs: alias page writes */
	uint	cachef;		/* count of ping-pong cache flushes	*/
	uint	cachei;		/* count of ping-pong cache invalidates	*/

        /*
         * the next fields need to be computed by vmgetinfo
         * system call, else their value will be inaccurate.
         */
        rpn64_t numfrb;         /* number of pages on free list */
        rpn64_t numclient;      /* number of client frames */
        rpn64_t numcompress;    /* no of frames in compressed segments */
        rpn64_t numperm;        /* number frames non-working segments */
        rpn64_t maxperm;        /* max number of frames non-working */
	rpn64_t memsizepgs;     /* real memory size in 4K pages  */
	rpn64_t numvpages;      /* accessed virtual pages */	
        rpn64_t minperm;        /* no fileonly page steals */
        rpn64_t minfree;        /* minimun pages free list (fblru) */
        rpn64_t maxfree;        /* maxfree pages free list (fblru) */
	rpn64_t maxclient;      /* max number of client frames */
#ifndef RPTYPES
#define RPTYPES         2
#endif
	rpn64_t rpgcnt[RPTYPES];/* repaging cnt */
	rpn64_t numpout;	/* number of fblru page-outs        */
	rpn64_t numremote;	/* number of fblru remote page-outs */
	rpn64_t numwseguse;	/* count of pages in use for working seg */
	rpn64_t numpseguse;	/* count of pages in use for persistent seg */
	rpn64_t numclseguse;	/* count of pages in use for client seg */
	rpn64_t numwsegpin;	/* count of pages pinned for working seg */
	rpn64_t numpsegpin;	/* count of pages pinned for persistent seg */
	rpn64_t numclsegpin;	/* count of pages pinned for client seg */
	uint    lgpg_size;	/* Hardware large page size */
	rpn64_t lgpg_cnt;	/* Total number of large pages on the system */
	rpn64_t lgpg_numfrb;	/* Number of large pages on the freelist(s) */
	rpn64_t lgpg_inuse;	/* Number of large pages in use */
	rpn64_t lgpg_hi;	/* Large page high water count */
	rpn64_t numralloc;	/* number of remote allocations */
	cnt64_t numspecsegs;	/* number of special dataseg id's */
	cnt64_t numspecfree;	/* number of free special dataseg id's */
	cnt64_t specsegshi;	/* special dataseg id's high water count */
	
	/* Current number of free paging space blocks, and the thresholds
	 * when SIGDANGER and SIGKILL signals will be sent to processes.
	 */
	rpn64_t psfreeblks;	/* number of free paging space blocks */
	rpn64_t npswarn;	/* threshold when SIGDANGER is sent */
	rpn64_t npskill;	/* threshold when SIGKILL is sent */
	rpn64_t normlmbmem;	/* #nonremoveable pages for DR. */ 
	rpn64_t	pfrsvdblks;	/* number of system reserved blocks */
	rpn64_t	pfavail;	/* number of pages available for pinning */
	rpn64_t	pfpinavail;	/* app-level num pages avail for pinning */
	rpn64_t nreplaced[RPTYPES]; /* number of pages replaced         */
	rpn64_t nrepaged[RPTYPES];  /* number of pages repaged          */
	rpn64_t minpgahead;	/* min number of pageahead pages        */
	rpn64_t maxpgahead;	/* max number of pageahead pages        */
	rpn64_t numpermio;	/* number of fblru non-w.s. pageouts    */
	cnt64_t hisid;		/* max index + 1 of sids ever used      */
	cnt64_t hiesid;		/* max index + 1 of esids ever used,
				 * always set to -1 on 64 bit kernel 	*/
	rpn64_t system_pgs;	/* pages on SCBs marked V_SYSTEM	*/
	rpn64_t nonsys_pgs;	/* pages on SCBs not marked V_SYSTEM	*/
	rpn64_t unmngd_pgs;	/* pages not on SCBs			*/

	uint	memgrd_succ_pgs;/* pages memguard successfully removed	*/
	uint	memgrd_fail_pgs;/* pages memguard failed to remove	*/

	rpn64_t	soft_wseguse;	/* # soft pages in use for working seg	*/
	rpn64_t	soft_pseguse;	/* # soft pages in use for pers seg	*/
	rpn64_t	soft_clseguse;	/* # soft pages in use for client seg	*/

	rpn64_t nloaned;	/* # pages loaned to hypervisor for CMO	*/
	size64_t memavailable;	/* # bytes mem avail w/o paging working	*/

	uint64_t flags;		  /* See VMINFO_FLAG*			*/
	rpn64_t  true_memsizepgs; /* true # of log/phys 4k pages	*/
	rpn64_t  true_numfrb;     /* true # of free page frames		*/

	rpn64_t  ame_memsizepgs;    /* # of expanded log/phys 4k pages	*/
	rpn64_t  ame_numfrb;        /* # of expaned free page frames	*/
	amef_t	 ame_factor_tgt;    /* target AME expansion factor	*/
	amef_t	 ame_factor_actual; /* actual AME expansion factor 	*/
	size64_t ame_deficit_size;  /* deficit, in bytes btwn tgt and actual */
	
	size64_t cmem_cpool_size;   /* size of comp. pool in bytes	  */
	size64_t cmem_cpool_free;   /* free memory in comp. pool in bytes */
	size64_t cmem_ucpool_size;  /* size of uncomp. pool in bytes	  */
	rpn64_t  cmem_tot_ncpgs;    /* # of compressed pages		  */
	size64_t cmem_tot_csize;    /* size of comp. pages in comp. form  */
	uint64_t cmem_ncomp_ops;    /* # of compression ops (page-outs)	  */
	uint64_t cmem_ndecomp_ops;  /* # of decompression ops (page-ins)  */
	rpn64_t  cmem_wseg_ncpgs;   /* # of comp. working storage pgs     */
	size64_t cmem_wseg_csize;   /* size of comp. working storage pgs  */
	rpn64_t  klock_tot_npgs;    /* total number of kernel locked pgs  */
	rpn64_t  klock_pin_npgs;    /* number of pinned kernel locked pgs */
	size64_t cmem_max_cpool_size; /* maximum compressed pool size     */
	size64_t cmem_tgt_cpool_size; /* target compressed pool size      */

	ssize64_t bsr_mem_total;     /* Total bytes of the BSR facility */
	uint64_t  bsr_support_window;/* Bit mask for supported window size*/
	ssize64_t bsr_mem_free;      /* Available bytes of the BSR facility */
	uint64_t  bsr_free_window;   /* Bit mask for free window size */


	rpn64_t klock_tot_steals;  /* # of kernel locked pages stolen by lru*/
	rpn64_t klock_pta_steals;  /* # of PTA locked pages stolen by lru */
	rpn64_t klock_kstk_steals; /* # of kstack locked pages stolen by lru*/

	rpn64_t	soft_16mb_wseguse; /* # soft 16m pages in use for working seg*/
	
#ifndef _NUM_PG_PSIZE
#define _NUM_PG_PSIZE 2		   /* # of pageable page sizes */
#endif
	uint64_t cmem_ncomps[_NUM_PG_PSIZE];    /* comp ops per psx */
	uint64_t cmem_ndecomps[_NUM_PG_PSIZE];  /* decomp ops per psx */

	/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
	 *
	 * When adding members to struct vminfo they must also be
	 * added to struct vminfo64 below.
	 */
};

extern struct vminfo vmminfo;

#define vmpf_pgexct		vmminfo.pgexct
#define vmpf_pgrclm		vmminfo.pgrclm
#define vmpf_lockexct		vmminfo.lockexct
#define vmpf_backtrks		vmminfo.backtrks
#define vmpf_pageins		vmminfo.pageins
#define vmpf_pageouts		vmminfo.pageouts
#define vmpf_pgspgins		vmminfo.pgspgins
#define vmpf_pgspgouts		vmminfo.pgspgouts
#define vmpf_numsios		vmminfo.numsios
#define vmpf_numiodone		vmminfo.numiodone
#define vmpf_zerofills		vmminfo.zerofills
#define vmpf_exfills		vmminfo.exfills
#define vmpf_scans		vmminfo.scans
#define vmpf_cycles		vmminfo.cycles
#define vmpf_pgsteals		vmminfo.pgsteals
#define vmpf_freewts		vmminfo.freewts
#define vmpf_extendwts		vmminfo.extendwts
#define vmpf_pendiowts		vmminfo.pendiowts
#define vmpf_pings		vmminfo.pings
#define vmpf_pangs		vmminfo.pangs
#define vmpf_pongs		vmminfo.pongs
#define vmpf_dpongs		vmminfo.dpongs
#define vmpf_wpongs		vmminfo.wpongs
#define vmpf_cachef		vmminfo.cachef
#define vmpf_cachei		vmminfo.cachei
#define vmpf_numfrb		vmminfo.numfrb
#define vmpf_numclient		vmminfo.numclient
#define vmpf_numcompress	vmminfo.numcompress
#define vmpf_numperm		vmminfo.numperm
#define vmpf_maxperm		vmminfo.maxperm
#define vmpf_memsizepgs		vmminfo.memsizepgs
#define vmpf_minperm		vmminfo.minperm
#define vmpf_minfree		vmminfo.minfree
#define vmpf_maxfree		vmminfo.maxfree
#define vmpf_maxclient		vmminfo.maxclient
#define vmpf_rpgcnt		vmminfo.rpgcnt
#define vmpf_numpout		vmminfo.numpout
#define vmpf_numremote		vmminfo.numremote
#define vmpf_numwseguse		vmminfo.numwseguse
#define vmpf_numpseguse		vmminfo.numpseguse
#define vmpf_numclseguse	vmminfo.numclseguse
#define vmpf_numwsegpin		vmminfo.numwsegpin
#define vmpf_numpsegpin		vmminfo.numpsegpin
#define vmpf_numclsegpin	vmminfo.numclsegpin
#define vmpf_numvpages		vmminfo.numvpages
#define vmpf_psfreeblks		vmminfo.psfreeblks
#define vmpf_npswarn		vmminfo.npswarn
#define vmpf_npskill		vmminfo.npskill
#define vmpf_normlmbmem		vmminfo.normlmbmem
#define vmpf_pfrsvdblks		vmminfo.pfrsvdblks
#define vmpf_pfavail		vmminfo.pfavail
#define vmpf_pfpinavail		vmminfo.pfpinavail
#define vmpf_lgpg_cnt		vmminfo.lgpg_cnt
#define vmpf_lgpg_size		vmminfo.lgpg_size
#define vmpf_lgpg_numfrb	vmminfo.lgpg_numfrb
#define vmpf_lgpg_inuse		vmminfo.lgpg_inuse
#define vmpf_lgpg_hi		vmminfo.lgpg_hi
#define vmpf_numspecsegs	vmminfo.numspecsegs
#define vmpf_numspecfree	vmminfo.numspecfree
#define vmpf_specsegshi		vmminfo.specsegshi
#define vmpf_numralloc		vmminfo.numralloc
#define vmpf_nreplaced		vmminfo.nreplaced
#define vmpf_nrepaged		vmminfo.nrepaged
#define vmpf_minpgahead		vmminfo.minpgahead
#define vmpf_maxpgahead		vmminfo.maxpgahead
#define vmpf_numpermio		vmminfo.numpermio
#define vmpf_hisid		vmminfo.hisid
#define vmpf_hiesid		vmminfo.hiesid
#define vmpf_system_pgs		vmminfo.system_pgs
#define vmpf_nonsys_pgs		vmminfo.nonsys_pgs
#define vmpf_unmngd_pgs		vmminfo.unmngd_pgs
#define vmpf_memgrd_succ_pgs	vmminfo.memgrd_succ_pgs
#define vmpf_memgrd_fail_pgs	vmminfo.memgrd_fail_pgs
#define	vmpf_flags		vmminfo.flags
#define vmpf_true_memsizepgs	vmminfo.true_memsizepgs
#define vmpf_true_numfrb	vmminfo.true_numfrb
#define vmpf_ame_memsizepgs	vmminfo.ame_memsizepgs
#define vmpf_ame_numfrb		vmminfo.ame_numfrb
#define	vmpf_ame_factor_tgt	vmminfo.ame_factor_tgt
#define	vmpf_ame_factor_actual	vmminfo.ame_factor_actual
#define vmpf_ame_deficit_size	vmminfo.ame_deficit_size
#define vmpf_cmem_cpool_size	vmminfo.cmem_cpool_size
#define vmpf_cmem_cpool_free	vmminfo.cmem_cpool_free
#define vmpf_cmem_ucpool_size	vmminfo.cmem_ucpool_size
#define vmpf_cmem_tot_ncpgs	vmminfo.cmem_tot_ncpgs
#define vmpf_cmem_tot_csize	vmminfo.cmem_tot_csize
#define vmpf_cmem_ncomp_ops	vmminfo.cmem_ncomp_ops
#define vmpf_cmem_ndecomp_ops	vmminfo.cmem_ndecomp_ops
#define vmpf_cmem_wseg_ncpgs	vmminfo.cmem_wseg_ncpgs
#define vmpf_cmem_wseg_csize	vmminfo.cmem_wseg_csize
#define vmpf_cmem_ncomps(x)	vmminfo.cmem_ncomps[(x)]
#define vmpf_cmem_ndecomps(x)	vmminfo.cmem_ndecomps[(x)]

/* struct for VMINFO64 */
struct vminfo64 {
	uint64_t pgexct; 	/* count of page faults     		*/
	uint64_t pgrclm; 	/* count of page reclaims 		*/
	uint64_t lockexct;	/* count of lockmisses	    		*/
	uint64_t backtrks;    	/* count of backtracks	    		*/
	uint64_t pageins;	/* count of pages paged in  		*/
	uint64_t pageouts;	/* count of pages paged out 		*/
	uint64_t pgspgins;	/* count of page ins from paging space	*/
	uint64_t pgspgouts;	/* count of page outs from paging space */
	uint64_t numsios;	/* count of start I/Os	    		*/
	uint64_t numiodone;	/* count of iodones	    		*/
	uint64_t zerofills;	/* count of zero filled pages 		*/
	uint64_t exfills;	/* count of exec filled pages		*/
	uint64_t scans;		/* count of page scans by clock 	*/
	uint64_t cycles;	/* count of clock hand cycles		*/
	uint64_t pgsteals;	/* count of page steals	   		*/
	uint64_t freewts;	/* count of free frame waits		*/
	uint64_t extendwts;	/* count of extend XPT waits		*/
	uint64_t pendiowts;	/* count of pending I/O waits  		*/
        /*
         * the next fields need to be computed by vmgetinfo
         * system call, else their value will be inaccurate.
         */
        rpn64_t numfrb;         /* number of pages on free list */
        rpn64_t numclient;      /* number of client frames */
        rpn64_t numcompress;    /* no of frames in compressed segments */
        rpn64_t numperm;        /* number frames non-working segments */
        rpn64_t maxperm;        /* max number of frames non-working */
	rpn64_t memsizepgs;     /* real memory size in 4K pages  */
	rpn64_t numvpages;      /* accessed virtual pages */	
        rpn64_t minperm;        /* no fileonly page steals */
        rpn64_t minfree;        /* minimun pages free list (fblru) */
        rpn64_t maxfree;        /* maxfree pages free list (fblru) */
	rpn64_t maxclient;      /* max number of client frames */
#ifndef RPTYPES
#define RPTYPES         2
#endif
	rpn64_t rpgcnt[RPTYPES];/* repaging cnt */
	rpn64_t numpout;	/* number of fblru page-outs        */
	rpn64_t numremote;	/* number of fblru remote page-outs */
	rpn64_t numwseguse;	/* count of pages in use for working seg */
	rpn64_t numpseguse;	/* count of pages in use for persistent seg */
	rpn64_t numclseguse;	/* count of pages in use for client seg */
	rpn64_t numwsegpin;	/* count of pages pinned for working seg */
	rpn64_t numpsegpin;	/* count of pages pinned for persistent seg */
	rpn64_t numclsegpin;	/* count of pages pinned for client seg */
	psize_t lgpg_size;	/* Hardware large page size */
	rpn64_t lgpg_cnt;	/* Total number of large pages on the system */
	rpn64_t lgpg_numfrb;	/* Number of large pages on the freelist(s) */
	rpn64_t lgpg_inuse;	/* Number of large pages in use */
	rpn64_t lgpg_hi;	/* Large page high water count */
	rpn64_t numralloc;	/* number of remote allocations */
	cnt64_t numspecsegs;	/* number of special dataseg id's */
	cnt64_t numspecfree;	/* number of free special dataseg id's */
	cnt64_t specsegshi;	/* special dataseg id's high water count */
	
	/* Current number of free paging space blocks, and the thresholds
	 * when SIGDANGER and SIGKILL signals will be sent to processes.
	 */
	rpn64_t psfreeblks;	/* number of free paging space blocks */
	rpn64_t npswarn;	/* threshold when SIGDANGER is sent */
	rpn64_t npskill;	/* threshold when SIGKILL is sent */
	rpn64_t normlmbmem;	/* #nonremoveable pages for DR. */ 
	rpn64_t	pfrsvdblks;	/* number of system reserved blocks */
	rpn64_t	pfavail;	/* number of pages available for pinning */
	rpn64_t	pfpinavail;	/* app-level num pages avail for pinning */
	rpn64_t nreplaced[RPTYPES]; /* number of pages replaced         */
	rpn64_t nrepaged[RPTYPES];  /* number of pages repaged          */
	rpn64_t minpgahead;	/* min number of pageahead pages        */
	rpn64_t maxpgahead;	/* max number of pageahead pages        */
	rpn64_t numpermio;	/* number of fblru non-w.s. pageouts    */
	cnt64_t hisid;		/* max index + 1 of sids ever used      */
	cnt64_t hiesid;		/* max index + 1 of esids ever used,
				 * always set to -1 on 64 bit kernel 	*/
	rpn64_t system_pgs;	/* pages on SCBs marked V_SYSTEM	*/
	rpn64_t nonsys_pgs;	/* pages on SCBs not marked V_SYSTEM	*/
	rpn64_t unmngd_pgs;	/* pages not on SCBs			*/

	uint64_t memgrd_succ_pgs;/* pages memguard successfully removed	*/
	uint64_t memgrd_fail_pgs;/* pages memguard failed to remove	*/

	rpn64_t	soft_wseguse;	/* # soft pages in use for working seg	*/
	rpn64_t	soft_pseguse;	/* # soft pages in use for pers seg	*/
	rpn64_t	soft_clseguse;	/* # soft pages in use for client seg	*/

	rpn64_t nloaned;	/* # pages loaned to hypervisor for CMO	*/
	size64_t memavailable;	/* # bytes mem avail w/o paging working	*/

	uint64_t flags;		    /* See VMINFO_FLAG*			*/
	rpn64_t  true_memsizepgs;   /* true # of log/phys 4k pages	*/
	rpn64_t  true_numfrb;       /* true # of free page frames	*/

	rpn64_t  ame_memsizepgs;    /* # of expanded log/phys 4k pages	*/
	rpn64_t  ame_numfrb;        /* # of expaned free page frames	*/
	amef_t	 ame_factor_tgt;    /* target AME expansion factor	*/
	amef_t	 ame_factor_actual; /* actual AME expansion factor 	*/
	size64_t ame_deficit_size;  /* deficit, in bytes btwn tgt and actual */
	
	size64_t cmem_cpool_size;   /* size of comp. pool in bytes	  */
	size64_t cmem_cpool_free;   /* free memory in comp. pool in bytes */
	size64_t cmem_ucpool_size;  /* size of uncomp. pool in bytes	  */
	rpn64_t  cmem_tot_ncpgs;    /* # of compressed pages		  */
	size64_t cmem_tot_csize;    /* size of comp. pages in comp. form  */
	uint64_t cmem_ncomp_ops;    /* # of compression ops (page-outs)	  */
	uint64_t cmem_ndecomp_ops;  /* # of decompression ops (page-ins)  */
	rpn64_t  cmem_wseg_ncpgs;   /* # of comp. working storage pgs     */
	size64_t cmem_wseg_csize;   /* size of comp. working storage pgs  */
	rpn64_t  klock_tot_npgs;    /* total number of kernel locked pgs  */
	rpn64_t  klock_pin_npgs;    /* number of pinned kernel locked pgs */
	size64_t cmem_max_cpool_size; /* maximum compressed pool size     */
	size64_t cmem_tgt_cpool_size; /* target compressed pool size      */

	ssize64_t bsr_mem_total;     /* Total bytes of the BSR facility */
	uint64_t  bsr_support_window;/* Bit mask for supported window size*/
	ssize64_t bsr_mem_free;    /* Available bytes of the BSR facility */
	uint64_t  bsr_free_window; /* Bit mask for free window size */

	rpn64_t klock_tot_steals;  /* # of kernel locked pages stolen by lru*/
	rpn64_t klock_pta_steals;  /* # of PTA locked pages stolen by lru */
	rpn64_t klock_kstk_steals; /* # of kstack locked pages stolen by lru*/

	rpn64_t	soft_16mb_wseguse; /* # soft 16m pages in use for working seg*/
	
#ifndef _NUM_PG_PSIZE
#define _NUM_PG_PSIZE 2		   /* # of pageable page sizes */
#endif
	uint64_t cmem_ncomps[_NUM_PG_PSIZE];    /* comp ops per psx */
	uint64_t cmem_ndecomps[_NUM_PG_PSIZE];  /* decomp ops per psx */

	/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
	 *
	 * When adding members to struct vminfo64 they must also be
	 * added to struct vminfo above.
	 */
};

struct vminfo_psize {
	psize_t psize;          /* IN: page size                        */

	/* The rest of this struct is output from vmgetinfo()           */

	uint64_t attr;          /* bitmap of page size's attributes     */

       /* Page size attributes reported in the vminfo_psize.attr field: */
#define VM_PSIZE_ATTR_PAGEABLE       0x1  /* page size supports paging  */
	
	uint64_t pgexct; 	/* count of page faults     		*/
	uint64_t pgrclm; 	/* count of page reclaims 		*/
	uint64_t lockexct;	/* count of lockmisses	    		*/
	uint64_t backtrks;    	/* count of backtracks	    		*/
	uint64_t pageins;	/* count of pages paged in  		*/
	uint64_t pageouts;	/* count of pages paged out 		*/
	uint64_t pgspgins;	/* count of page ins from paging space	*/
	uint64_t pgspgouts;	/* count of page outs from paging space */
	uint64_t numsios;	/* count of start I/Os	    		*/
	uint64_t numiodone;	/* count of iodones	    		*/
	uint64_t zerofills;     /* count of zero filled pages 		*/
	uint64_t exfills;       /* count of exec filled pages		*/
	uint64_t scans;      	/* count of page scans by clock 	*/
	uint64_t cycles;      	/* count of clock hand cycles		*/
	uint64_t pgsteals;      /* count of page steals	   		*/
	uint64_t freewts;      	/* count of free frame waits		*/
	uint64_t extendwts;     /* count of extend XPT waits		*/
	uint64_t pendiowts;     /* count of pending I/O waits  		*/

        /*
         * the next fields need to be computed by vmgetinfo
         * system call, else their value will be inaccurate.
         */
	rpn64_t numframes;      /* # of real memory frames of this psize */
        rpn64_t numfrb;         /* number of pages on free list */
        rpn64_t numclient;      /* number of client frames */
        rpn64_t numcompress;    /* no of frames in compressed segments */
        rpn64_t numperm;        /* number frames non-working segments */
	rpn64_t numvpages;      /* accessed virtual pages */	
        rpn64_t minfree;        /* minimun pages free list (fblru) */
        rpn64_t maxfree;        /* maxfree pages free list (fblru) */
#ifndef RPTYPES
#define RPTYPES         2
#endif
	rpn64_t rpgcnt[RPTYPES];/* repaging cnt */
	rpn64_t numpout;	/* number of fblru page-outs        */

	rpn64_t numremote;	/* number of fblru remote page-outs */
	rpn64_t numwseguse;	/* count of pages in use for working seg */
	rpn64_t numpseguse;	/* count of pages in use for persistent seg */
	rpn64_t numclseguse;	/* count of pages in use for client seg */
	rpn64_t numwsegpin;	/* count of pages pinned for working seg */
	rpn64_t numpsegpin;	/* count of pages pinned for persistent seg */
	rpn64_t numclsegpin;	/* count of pages pinned for client seg */
	rpn64_t numpgsp_pgs;    /* # of wseg pages with allocated paging space */
	
	rpn64_t numralloc;	/* number of remote allocations */
	rpn64_t	pfrsvdblks;	/* number of system reserved blocks */
	rpn64_t	pfavail;	/* number of pages available for pinning */
	rpn64_t	pfpinavail;	/* app-level num pages avail for pinning */
	rpn64_t numpermio;	/* number of fblru non-w.s. pageouts    */

	rpn64_t system_pgs;	/* pages on SCBs marked V_SYSTEM	*/
	rpn64_t nonsys_pgs;	/* pages on SCBs not marked V_SYSTEM	*/

	rpn64_t	soft_wseguse;	/* # soft pages in use for working seg	*/
	rpn64_t	soft_pseguse;	/* # soft pages in use for pers seg	*/
	rpn64_t	soft_clseguse;	/* # soft pages in use for client seg	*/
	size64_t memavailable;	/* # bytes mem avail w/o paging working	*/

	uint64_t flags;		    /* See VMINFO_FLAG*			  */
	rpn64_t  true_numfrb;       /* true # of free page frames	  */
	rpn64_t  ame_numfrb;        /* # of expaned free page frames	  */
	size64_t cmem_ucpool_size;  /* size of uncomp. pool in bytes	  */
	rpn64_t  cmem_tot_ncpgs;    /* # of compressed pages		  */
	size64_t cmem_tot_csize;    /* size of comp. pages in comp. form  */
	uint64_t cmem_ncomp_ops;    /* # of compression ops (page-outs)	  */
	uint64_t cmem_ndecomp_ops;  /* # of decompression ops (page-ins)  */
	rpn64_t  cmem_wseg_ncpgs;   /* # of comp. working storage pgs     */
	size64_t cmem_wseg_csize;   /* size of comp. working storage pgs  */

	rpn64_t  klock_tot_npgs;    /* total number of kernel locked pgs  */
	rpn64_t  klock_pin_npgs;    /* number of pinned kernel locked pgs */

	rpn64_t  true_numframes;    /* true # of frames of this page size */
	rpn64_t  ame_numframes;     /* AME # of frames of this page size  */
	rpn64_t  ame_deficit_npgs;  /* # deficit frames of this page size */

	rpn64_t klock_tot_steals;  /* # of kernel locked pages stolen by lru*/
	rpn64_t klock_pta_steals;  /* # of PTA locked pages stolen by lru */
	rpn64_t klock_kstk_steals; /* # of kstack locked pages stolen by lru*/
};
extern struct vminfo_psize vmminfo_psizes[];

/* Macros for referencing variables in vminfo_psize.
 */
#define VMPFPS_REF(p)		vmminfo_psizes[(p)]
#define vmpfps_psize(p)			VMPFPS_REF(p).psize
#define vmpfps_attr(p)			VMPFPS_REF(p).attr
#define vmpfps_pgexct(p)		VMPFPS_REF(p).pgexct
#define vmpfps_pgrclm(p)		VMPFPS_REF(p).pgrclm
#define vmpfps_lockexct(p)		VMPFPS_REF(p).lockexct
#define vmpfps_backtrks(p)		VMPFPS_REF(p).backtrks
#define vmpfps_pageins(p)		VMPFPS_REF(p).pageins
#define vmpfps_pageouts(p)		VMPFPS_REF(p).pageouts
#define vmpfps_pgspgins(p)		VMPFPS_REF(p).pgspgins
#define vmpfps_pgspgouts(p)		VMPFPS_REF(p).pgspgouts
#define vmpfps_numsios(p)		VMPFPS_REF(p).numsios
#define vmpfps_numiodone(p)		VMPFPS_REF(p).numiodone
#define vmpfps_zerofills(p)		VMPFPS_REF(p).zerofills
#define vmpfps_exfills(p)		VMPFPS_REF(p).exfills
#define vmpfps_scans(p)			VMPFPS_REF(p).scans
#define vmpfps_cycles(p)		VMPFPS_REF(p).cycles
#define vmpfps_pgsteals(p)		VMPFPS_REF(p).pgsteals
#define vmpfps_freewts(p)		VMPFPS_REF(p).freewts
#define vmpfps_extendwts(p)		VMPFPS_REF(p).extendwts
#define vmpfps_pendiowts(p)		VMPFPS_REF(p).pendiowts
#define vmpfps_numfrb(p)		VMPFPS_REF(p).numfrb
#define vmpfps_numclient(p)		VMPFPS_REF(p).numclient
#define vmpfps_numcompress(p)		VMPFPS_REF(p).numcompress
#define vmpfps_numperm(p)		VMPFPS_REF(p).numperm
#define vmpfps_minfree(p)		VMPFPS_REF(p).minfree
#define vmpfps_maxfree(p)		VMPFPS_REF(p).maxfree
#define vmpfps_rpgcnt(p,y)		VMPFPS_REF(p).rpgcnt[(y)]
#define vmpfps_numpout(p)		VMPFPS_REF(p).numpout
#define vmpfps_numframes(p)		VMPFPS_REF(p).numframes
#define vmpfps_numremote(p)		VMPFPS_REF(p).numremote
#define vmpfps_numwseguse(p)		VMPFPS_REF(p).numwseguse
#define vmpfps_numpseguse(p)		VMPFPS_REF(p).numpseguse
#define vmpfps_numclseguse(p)		VMPFPS_REF(p).numclseguse
#define vmpfps_numwseguse_soft(p)	VMPFPS_REF(p).soft_wseguse
#define vmpfps_numpseguse_soft(p)	VMPFPS_REF(p).soft_pseguse
#define vmpfps_numclseguse_soft(p)	VMPFPS_REF(p).soft_clseguse
#define vmpfps_numwsegpin(p)		VMPFPS_REF(p).numwsegpin
#define vmpfps_numpsegpin(p)		VMPFPS_REF(p).numpsegpin
#define vmpfps_numclsegpin(p)		VMPFPS_REF(p).numclsegpin
#define vmpfps_numpgsp_pgs(p)		VMPFPS_REF(p).numpgsp_pgs
#define vmpfps_numvpages(p)		VMPFPS_REF(p).numvpages
#define vmpfps_pfrsvdblks(p)		VMPFPS_REF(p).pfrsvdblks
#define vmpfps_pfavail(p)		VMPFPS_REF(p).pfavail
#define vmpfps_pfpinavail(p)		VMPFPS_REF(p).pfpinavail
#define vmpfps_numralloc(p)		VMPFPS_REF(p).numralloc
#define vmpfps_numpermio(p)		VMPFPS_REF(p).numpermio
#define vmpfps_system_pgs(p)		VMPFPS_REF(p).system_pgs
#define vmpfps_nonsys_pgs(p)		VMPFPS_REF(p).nonsys_pgs
#define	vmpfps_flags(p)			VMPFPS_REF(p).flags
#define vmpfps_true_numfrb(p)		VMPFPS_REF(p).true_numfrb
#define vmpfps_ame_numfrb(p)		VMPFPS_REF(p).ame_numfrb
#define vmpfps_cmem_ucpool_size(p)	VMPFPS_REF(p).cmem_ucpool_size
#define vmpfps_cmem_tot_ncpgs(p)	VMPFPS_REF(p).cmem_tot_ncpgs
#define vmpfps_cmem_tot_csize(p)	VMPFPS_REF(p).cmem_tot_csize
#define vmpfps_cmem_ncomp_ops(p)	VMPFPS_REF(p).cmem_ncomp_ops
#define vmpfps_cmem_ndecomp_ops(p)	VMPFPS_REF(p).cmem_ndecomp_ops
#define vmpfps_cmem_wseg_ncpgs(p)	VMPFPS_REF(p).cmem_wseg_ncpgs
#define vmpfps_cmem_wseg_csize(p)	VMPFPS_REF(p).cmem_wseg_csize

/* Paging space information returned by swapqry() system call
 */
struct pginfo
{
	dev_t	devno;		/* device number		*/
	uint	size;		/* size in PAGESIZE blocks	*/
	uint	free;		/* # of free PAGESIZE blocks	*/
	uint	iocnt;		/* number of pending i/o's	*/
};

/* extended version of pginfo structure
 */
struct pginfo_ext
{
	dev_t	devno;		/* device number		*/
	uint	size;		/* size in PAGESIZE blocks	*/
	uint	free;		/* # of free PAGESIZE blocks	*/
	uint	iocnt;		/* number of pending i/o's	*/
	uint	chksum_size;	/* size of checksum in bits	*/
};

#ifdef _KERNEL

/* 32bit application representation of pginfo structure */

struct pginfo32
{

	dev32_t	devno;		/* device number		*/
	uint	size;		/* size in PAGESIZE blocks	*/
	uint	free;		/* # of free PAGESIZE blocks	*/
	uint	iocnt;		/* number of pending i/o's	*/
};

struct pginfo32_ext
{
	dev32_t	devno;		/* device number		*/
	uint	size;		/* size in PAGESIZE blocks	*/
	uint	free;		/* # of free PAGESIZE blocks	*/
	uint	iocnt;		/* number of pending i/o's	*/
	uint	chksum_size;	/* size of checksum in bits	*/
};
#endif

/* Output of VMSHMID_TO_VMID command */
struct vmshmid_to_vmid
{
	int    shmid;       /* INPUT: shared memory id */
	int    num_vmids;   /* INPUT: size of vmids array*/
	                    /* OUTPUT: number vmids copied */
	vmid64_t  *vmids;   /* OUTPUT: where vmids are copied */
} ;


/*  struct to report page information for the VM_PAGE_INFO command
 */
struct vm_page_info {
	uint64_t addr;		/* IN: address on which to report */
	size64_t pagesize;	/* OUT: size of page backing addr */
};

/* struct to report the system's IPC limits
 */
struct ipc_limits {
	/* Semaphore limits */
	size64_t semmni;	/* max # of semaphore id's */
	size64_t semmsl;	/* max # of semaphores per sem id */
	size64_t semopm;	/* max # of op's per semop() call */
	size64_t semvmx;	/* max value of a semaphore */
	size64_t semume;	/* max # of undo entries per proc */
	size64_t semaem;	/* adjust on exit max value */

	/* Message limits */
	size64_t msgmax;	/* max message size */
	size64_t msgmnb;	/* max # of bytes per queue */
	size64_t msgmni;	/* max # of message queue id's */
	size64_t msgmnm;	/* max # of messages per queue id */

	/* Shared memory limits */
	size64_t shmmni;	/* max # of shared memory id's */
	size64_t shmmax64;	/* 64bit proc max shm region size */
	uint     shmmax32;	/* 32bit proc max shm region size */
	uint     shmmin;	/* min shared memory region size */
	size64_t shmseg64;	/* max # of shm segs per 64bit proc */
	uint     shmseg32;	/* max # of shm segs per 32bit proc
				 * (non-extended shm) */
};

/* struct to report mem info per SRAD */
struct vm_srad_meminfo
{
	int vmsrad_in_size;    /* size of the structure provided by the caller */
	int vmsrad_out_size;   /* number of bytes returned by the service.  */
	size64_t vmsrad_total_pg; 
			       /* total number of bytes of memory in 
				* pageable frames in the SRAD 
				*/
	size64_t vmsrad_free_pg; 
			       /* total number of bytes of free memory in 
				* pageable frames in the SRAD 
				*/
	size64_t vmsrad_file;  /* number of file cache bytes that could
				* be stolen by the LRU daemon */    
	int vmsrad_aff_priv_pct;
			       /* effective percentage of private memory that
				* can get affinitized to this vmpool by default
				* page placement based on the tunable
				* enhanced_affinity_private, the pool's
				* computational usage, and the SRAD's memory to
				* cpu capacity ratio.
				*/
	int vmsrad_aff_avail_pct;
			       /* percentage of available computational memory
				* left in the vmpool based on the tunable
				* enhanced_affinity_vmpool_limit and the average
				* system computational percentage.
				*/
	size64_t vmsrad_total_nonpg; 
			       /* total number of bytes of memory in 
				* nonpageable frames in the SRAD 
				*/
	size64_t vmsrad_free_nonpg;
			       /* total number of bytes of free memory in 
				* nonpageable frames in the SRAD 
				*/
};

#define vmsrad_total	vmsrad_total_pg /* for compatibility - the original
					 * name was incorrect */
#define vmsrad_free	vmsrad_free_pg  /* for compatibility */
#define VM_MEMINFO_OLDSIZE (sizeof(struct vm_srad_meminfo) - 2*sizeof(size64_t))
			       /* size of old struct - if passed in_size
				* equals this, then do not return nonpg data
				*/
				
                               

/* Structure to report kernel's real memory usage (see VMINFO64_KMEM). 
 * It reports total pages in memory, pinned pages, and kernel locked 
 * unpinned pages for input page-size. Note that unpinned klocked pages
 * are not necessarily in memory if kernel pages were actually paged out.
 * This is just a sum over all segments of each type (i.e. kernel heap, 
 * mbuf heap, PTA, etc). They are computed in vmgetinfo() by looping over 
 * all sidx in the system.
 */
enum vm_kmem_type_e
{
	VM_KER_SEG = 0,
	VM_KHEAP_SEG,
	VM_MBUFHEAP_SEG,
	VM_PTA_SEG,
	VM_UGALLOC_SEG,
	VM_PRIV_SEG,
	VM_KTHR_SEG,
	VM_KPROC_STK_SEG,
	VM_OTHER_SEG,
	VM_KMEM_TYPES
};

struct vm_kmem_stats
{
	rpn64_t total;
	rpn64_t pinned;
	rpn64_t klocked;
};

/*
 * Structure to report page fault time for a process (VM_PROC_PF_INFO) 
 * and thread (VM_THREAD_PF_INFO). It reports time taken for page faults.
 * Faults may be major/minor and for text/kernel/data.
 *
 * NOTES: 
 * 1. Information for calling thread or process can be obtained by 
 *    setting id field to -1.
 * 2. flags field is currently unused. Setting to a non-zero value
 *    will cause an error (EINVAL).
 * 3. minor (no sleep) page fault times are measured in CPU 
 *    utilization (PURR/SPURR) units, and major (involving sleep) 
 *    page fault times are measured in wall clock time (timebase) units.
 *    Both are converted to real time in timestruc64_t format when 
 *    reporting to user.
 */
#define VM_PF_INFO_VER		0x1

#if defined(_ALL_SOURCE) && (defined(__64BIT__) || defined(_LONG_LONG))
struct vm_pf_info
{
	/* INPUT */
	uint32_t		version; /* Set to VM_PF_INFO_VER */
	uint32_t 		flags; /* Unused. MUST be zero */
	id64_t 			id; /* pid or tid */

	/* OUTPUT */
	struct timestruc64_t 	text_major_pf_time;
	struct timestruc64_t 	data_major_pf_time;
	struct timestruc64_t 	kernel_major_pf_time;
	struct timestruc64_t 	text_minor_pf_time;
	struct timestruc64_t 	data_minor_pf_time;
	struct timestruc64_t 	kernel_minor_pf_time;
	uint64_t 		minor_pf_count;
	uint64_t 		major_pf_count;
};
#endif

#define VM_KMEM_INFO_VER	VM_KMEM_TYPES
struct vm_kmem_psize
{
	/* IN: this are set on input to vmgetinfo() */
	unsigned int version;
	unsigned int psize;

	/* OUT: Following fields are returned from vmgetinfo() */
	struct vm_kmem_stats stats[VM_KMEM_TYPES];
};

/* vmgetinfo system call */
extern  int     vmgetinfo (void *out, int command, int arg);
extern  int     wpar_vmgetinfo(cid_t cid, void *out, int command, int arg);

#ifdef _KERNEL
#if defined(__64BIT_KERNEL) || defined(__FULL_PROTO)
extern  int     kvmgetinfo(void *out, int command, int arg);
#endif /* __64BIT_KERNEL || __FULL_PROTO */
#endif /* _KERNEL */

/* command values: */
#define VMINFO          0
#define VMSHMID_TO_VMID 1
#define VMINFO_ABRIDGED	2
#define VMGETMEMPVARS	3
#define VMSETMEMPVARS	4
#define VMGETKERVARS	5
#define VMSETKERVARS	6
#define VM_PAGE_INFO    7
#define VMPERF		8
#define IPC_LIMITS      9
#define BOSBOOT_VARS	10
/* values 11-99 are reserved for internal use. */

#define VM_NEW_HEAP_PSIZE      100  /* advisory psize for future sbrk allocs */
#define VM_STAGGER_DATA	       101  /* stagger the present sbreak value */
#define VMINFO_GETPSIZES       102  /* report a system's supported page sizes */
#define VMINFO_PSIZE           103  /* report statistics for a page size */
#define VMINFO64	       104  /* VMINFO with all 64 bit fields */
#define VMINFO64_SLOW	       105  /* VMINFO64 but slow scb-walk */
#define VM_SRAD_MEMINFO        106  /* Free/stealable pages per SRAD */
#define VM_AFFINITIZED_MEMINFO 107  /* Private affintized mem per proc */
#define VM_UPD_PGHINTS	       108  /* Update page hints at pmig time */
#define KVMINFO_USR            109  /* kvmgetinfo() - report user-view of VMINFO */
#define KVMINFO_SYS            110  /* kvmgetinfo() - report system-view of VMINFO */
#define VMINFO64_KMEM          111  /* kernel memory usage by seg type */
#define VM_PROC_PF_INFO        112  /* Page fault time for process */
#define VM_THREAD_PF_INFO      113  /* Page fault time for thread */

#ifdef _NO_PROTO
        extern  blkcnt_t psdanger();
        extern  int swapoff();
        extern  int swapon();
        extern  int swapqry();
#else
        extern  blkcnt_t psdanger(int);
        extern  int swapoff(char *);
        extern  int swapon(char *);
        extern  int swapqry(char *, struct pginfo *);
#endif

/* defines for valid paging device checksum sizes */
#define PGDEV_CHKSUM_0  0
#define PGDEV_CHKSUM_8  8  
#define PGDEV_CHKSUM_16 16
#define PGDEV_CHKSUM_32 32
#define VALID_PGDEV_CHKSUM(_chksum_size) \
        ((_chksum_size) == PGDEV_CHKSUM_0 || \
	 (_chksum_size) == PGDEV_CHKSUM_8 || \
	 (_chksum_size) == PGDEV_CHKSUM_16 || \
	 (_chksum_size) == PGDEV_CHKSUM_32)

/* defines for _swapon_ext flags */
#define SWAPON_CHKSUM  1       /* means that arg 2 is a checksum */
#define SWAPON_WPAR    2       /* means that arg 2 is a WPAR id  */


/* definse for _swapqry_ext flags */
#define SWAPQRY_PGINFO  1  /* means that arg 2 is a pginfo_ext* */

/* system call to allow user-space programs set their default 
 * page placement policies 
 */
int vm_mem_policy(int, int *, int *, int);

/* Commands accepted by vm_mem_policy (except for the min/max values) */
enum
{
	VM_MIN_POLCMD = 0,
	VM_GET_POLICY,
	VM_SET_POLICY,
	VM_MAX_POLCMD
};

/* Types of memory policies that can be set through vm_mem_policy() */
enum
{
	VM_POLICY_TEXT = 0,
	VM_POLICY_STACK,
	VM_POLICY_DATA,
	VM_POLICY_SHM_NAMED,
	VM_POLICY_SHM_ANON,
	VM_POLICY_MAPPED_FILE,
	VM_POLICY_UNMAPPED_FILE,
	VM_NUM_POLICIES
};

/* Flag values for vminfo[64|_psize].flags */
#define VMINFO_FLAG_VMI_MV_EXP  0x1 /* metrics relative to expanded memory */
#define VMINFO_FLAG_SYS_MV_EXP  0x2 /* system memory view is expanded */

/* Compression system calls */
int accel_compress(void *, size_t, void *, size_t *, int);
int accel_decompress(void *, size_t, void *, size_t *, int);

#ifdef _KERNEL
/* Input flags for kaccel_compress/decompress
 */
#define ACC_BUF_PINNED    0x0001 /* uc_buf, c_buf already pinned */

int kaccel_compress(void *, size_t, void *, size_t *, int);
int kaccel_decompress(void *, size_t, void *, size_t *, int);
#endif /* _KERNEL */

#ifdef __cplusplus
}
#endif
  
#endif /* _H_VMINFO */
