/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos72Q src/bos/kernel/sys/vmpattr.h 1.12.2.4                           */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* Restricted Materials of IBM                                            */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 2006,2019              */
/* 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                                                     */
/* @(#)23	1.12.2.4  src/bos/kernel/sys/vmpattr.h, sysvmm, bos72Q, q2019_13A4 2/6/19 00:41:07 */


#ifndef _H_VMPATTR
#define _H_VMPATTR
/*
 * COMPONENT_NAME: (SYSVMM) Virtual Memory Manager
 *
 * ORIGINS: 27
 */

#include <sys/types.h>
#include <sys/kerrno.h>


#ifdef __cplusplus
extern "C" {
#endif

int vm_pattr(long /*cmd*/, pid_t /*pid*/, void * /*attr*/, size_t /*argsz*/);

kerrno_t kvm_pattr(long, pid_t, void *, size_t);

/* [k]vm_pattr returns */
#define EINVAL_VMPATTR_ARGSZ		KERROR(EINVAL, sysvmm_BLOCK_05, 0x001)
#define EINVAL_VMPATTR_MPSS_PSX		KERROR(EINVAL, sysvmm_BLOCK_05, 0x002)
#define ENOTSUP_VMPATTR_MPSS_PSX	KERROR(ENOTSUP,sysvmm_BLOCK_05, 0x003)
#define EINVAL_VMPATTR_ADDR_ALIGN	KERROR(EINVAL, sysvmm_BLOCK_05, 0x004)
#define ENOMEM_VMPATTR_HOLE             KERROR(ENOMEM, sysvmm_BLOCK_05, 0x005)
#define EINVAL_VMPATTR_INVAL_MEM	KERROR(EINVAL, sysvmm_BLOCK_05, 0x006)
#define EINVAL_VMPATTR_SEG_ALIGN1	KERROR(EINVAL, sysvmm_BLOCK_05, 0x007)
#define ENOSYS_VMPATTR_PSPA		KERROR(ENOSYS, sysvmm_BLOCK_05, 0x008)
#define EINVAL_VMPATTR_PSPA		KERROR(EINVAL, sysvmm_BLOCK_05, 0x009)
#define EINVAL_VMPATTR_SEG_ALIGN2	KERROR(EINVAL, sysvmm_BLOCK_05, 0x00A)
#define ENOTSUP_VMPATTR_PSPA1		KERROR(ENOTSUP,sysvmm_BLOCK_05, 0x00B)
#define ENOTSUP_VMPATTR_PSPA2		KERROR(ENOTSUP,sysvmm_BLOCK_05, 0x00C)
#define EINVAL_VMPATTR_PSX		KERROR(EINVAL, sysvmm_BLOCK_05, 0x00D)
#define EINVAL_VMPATTR_PSIZE_ALIGN	KERROR(EINVAL, sysvmm_BLOCK_05, 0x00E)
#define EINVAL_VMPATTR_CMD		KERROR(EINVAL, sysvmm_BLOCK_05, 0x00F)
#define ESRCH_VMPATTR_INVAL_PID0        KERROR(ESRCH,  sysvmm_BLOCK_05, 0x010)
#define ESRCH_VMPATTR_INVAL_PVPROC	KERROR(ESRCH,  sysvmm_BLOCK_05, 0x011)
#define ESRCH_VMPATTR_PSTATE    	KERROR(ESRCH,  sysvmm_BLOCK_05, 0x012)
#define ENOTSUP_VMPATTR_XPROC_KPROC     KERROR(ENOTSUP,sysvmm_BLOCK_05, 0x013)
#define EPERM_VMPATTR_XPROC   	    	KERROR(EPERM,  sysvmm_BLOCK_05, 0x014)
#define ENOSYS_VMPATTR_PSIZE		KERROR(ENOSYS, sysvmm_BLOCK_05, 0x015)
#define EACCES_VMPATTR_RDONLY  	    	KERROR(EACCES, sysvmm_BLOCK_05, 0x016)
#define EACCES_VMPATTR_MMAP  	    	KERROR(EACCES, sysvmm_BLOCK_05, 0x017)
#define EINVAL_VMPATTR_MMAP  	    	KERROR(EINVAL, sysvmm_BLOCK_05, 0x018)
#define ENOTSUP_VMPATTR_MMAP  	    	KERROR(ENOTSUP,sysvmm_BLOCK_05, 0x019)
#define ESRCH_VMPATTR_XPROC_WPAR    	KERROR(ESRCH,  sysvmm_BLOCK_05, 0x01A)
#define EINVAL_VMPATTR_INVAL_MEM2	KERROR(EINVAL, sysvmm_BLOCK_05, 0x01B)
#define EINVAL_VMPATTR_MMAP_MINPS    	KERROR(EINVAL, sysvmm_BLOCK_05, 0x01C)
#define EINVAL_VMPATTR_MMAP_SSIZE    	KERROR(EINVAL, sysvmm_BLOCK_05, 0x01D)
#define EINVAL_VMPATTR_BAD_MSID    	KERROR(EINVAL, sysvmm_BLOCK_05, 0x01E)
#define EINVAL_VMPATTR_BAD_SSID    	KERROR(EINVAL, sysvmm_BLOCK_05, 0x01F)
#define ENOMEM_VMPATTR_XPROC_REQUEST   	KERROR(EINVAL, sysvmm_BLOCK_05, 0x020)
#define EINVAL_VMPATTR_XPROC_BADATA	KERROR(EINVAL, sysvmm_BLOCK_05, 0x021)
#define EINVAL_VMPATTR_XPROC_PVLOCK	KERROR(EINVAL, sysvmm_BLOCK_05, 0x022)
#define ENOMEM_VMPATTR_PSPA_MMAP	KERROR(EINVAL, sysvmm_BLOCK_05, 0x023)
#define EINVAL_VMPATTR_GET_MV_FLAGS     KERROR(EINVAL, sysvmm_BLOCK_05, 0x024)
#define EINVAL_VMPATTR_SET_MV_FLAGS     KERROR(EINVAL, sysvmm_BLOCK_05, 0x025)
#define EINVAL_VMPATTR_SET_MV_TYPE      KERROR(EINVAL, sysvmm_BLOCK_05, 0x026)
#define EINVAL_VMPATTR_SET_MV_AME       KERROR(EINVAL, sysvmm_BLOCK_05, 0x027)
#define ESRCH_VMPATTR_INVAL_PID1        KERROR(ESRCH,  sysvmm_BLOCK_05, 0x028)
#define ESRCH_VMPATTR_INVAL_PID2        KERROR(ESRCH,  sysvmm_BLOCK_05, 0x029)
#define EINVAL_VMPATTR_PSIZE_EXTENDED   KERROR(EINVAL, sysvmm_BLOCK_05, 0x02A)
#define EINVAL_VMPATTR_INVAL_MEM3	KERROR(EINVAL, sysvmm_BLOCK_05, 0x02B)
#define ENOTSUP_VMPATTR_GET_PSEXT	KERROR(ENOTSUP,sysvmm_BLOCK_05, 0x02C)

struct vm_pa_range
{
	ptr64_t		rng_start;
	size64_t	rng_size;
};

/* values for 'cmd' argument and 'attr' argument */
#define VM_PA_SET_PSIZE		0x10L
#define VM_PA_GET_PSIZE		0x20L
struct vm_pa_psize
{
	struct vm_pa_range	pa_range;
	psize_t			pa_psize;
};

#define VM_PA_SET_PSIZE_EXTENDED    0x18L
#define VM_PA_GET_PSIZE_EXTENDED    0x28L

/* RESERVED                         0x1CL */
/* RESERVED                         0x2CL */

struct vm_pa_get_psize_soft
{
        int64_t			n64k_soft;
        int64_t			n16m_soft;
};

struct vm_pa_psize_extended
{
	struct vm_pa_range	pa_range;
	psize_t			pa_psize;
	size64_t		pa_info_size;
	
	/* The pa_info field is used as follows:
	 *
	 * VM_PA_SET_PSIZE_EXTENDED - optional rsethandle_t to rset specifying
	 *	memory srads to be used for the 16m mpss storage allocation.
	 * VM_PA_GET_PSIZE_EXTENDED - pointer to vm_pa_get_psize_soft 
	 *	structure to receive returned data.
	 */
	ptr64_t		        pa_info;
};

#define VM_PA_GET_RMUSAGE	0x30L
struct vm_pa_rmusage
{
	struct vm_pa_range	pa_range;
	size64_t		pa_rbytes;
};

#define VM_PA_SET_PSPA		0x40L
#define VM_PA_GET_PSPA		0x50L
struct vm_pa_pspa
{
	struct vm_pa_range	pa_range;
	int			pa_pspa;
};

#define VM_PA_GET_PSPA_ALIGN	0x60L
struct vm_pa_pspa_align
{
	struct vm_pa_range	pa_range;
	size64_t		pa_pspa_align;
};

#define VM_PA_CHECK_PSIZE	0x70L
struct vm_pa_psize_check
{
	struct vm_pa_range	pa_range;
	psize_t			pa_psize;
	int			pa_reason;
};

#define VM_PA_GET_MEMVIEW	0x80L
#define VM_PA_SET_MEMVIEW	0x90L
struct vm_pa_memview
{
	enum vm_pa_memview_type_e
	{
		VM_PA_MV_TRUE 	  = 0x0,
		VM_PA_MV_EXPANDED = 0x1
	} pa_mv_type;
	unsigned int pa_mv_flags; /* must be set to 0; none currently supported */
};

/* RESERVED			0x100L */
/* RESERVED			0x110L */

#define VM_PA_MPROTECT_SHM_ON   0x120L
#define VM_PA_MPROTECT_TXT_ON   0x121L

#define VM_PA_SET_LSA		0x130L
/* uses struct vm_pa_range as it's argument */

#define VM_PA_SET_LSA_POLICY	0x131L
struct vm_pa_lsa_policy
{
	enum vm_pa_lsa_policy_type_e
	{
		VM_PA_SHM_1TB_SHARED	= 0x0,
		VM_PA_SHM_1TB_UNSHARED	= 0x1
	} pa_lsa_cmd;
	size64_t	pa_lsa_val;
};

/* RESERVED			0x140L */

/* Reason codes for VM_PA_CHECK_PSIZE operations.
 */
#define VMPATTR_SET_PSIZE_VALID         0
#define VMPATTR_INVALID_MPSS_PSIZE      1
#define VMPATTR_NON_MPSS_SEGMENT        2
#define VMPATTR_NON_MPSS_PAGE           3
#define VMPATTR_RDONLY_MEM              4
#define VMPATTR_NON_MPSS_ALIGNED_MMAP	5
#define VMPATTR_MEMORY_TYPE_UNSUPPORTED 6
#define VMPATTR_PAGE_ATTRIBUTES		7
#define VMPATTR_NOT_FULLY_POPULATED     8
#define VMPATTR_PHYSICAL_ATTACHMENTS    9

#ifdef __cplusplus
}
#endif
  
#endif /* _H_VMPATTR */
