/* IBM_PROLOG_BEGIN_TAG                                                   */
/* This is an automatically generated prolog.                             */
/*                                                                        */
/* bos72Q src/bos/kernel/sys/ukeys.h 1.4.1.1                              */
/*                                                                        */
/* Licensed Materials - Property of IBM                                   */
/*                                                                        */
/* Restricted Materials of IBM                                            */
/*                                                                        */
/* COPYRIGHT International Business Machines Corp. 2005,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                                                     */
/* @(#)31     1.4.1.1  src/bos/kernel/sys/ukeys.h, syskeys, bos72Q, q2019_13A4 2/6/19 00:42:31 */
/*
 *   COMPONENT_NAME: SYSRAS (Storage Keys infrastructure)
 *
 *   FUNCTIONS:
 *
 *   ORIGINS: 27
 *
 */

#ifndef _H_UKEYS
#define _H_UKEYS

#include <sys/types.h>

#ifdef __cplusplus
extern "C" {
#endif

/* User-key type defines and structures */
typedef unsigned int ukey_t;
typedef unsigned long long ukeyset_t;

#ifndef _KERNEL
/* User-key APIs and related defines */

int ukey_enable(void);
int ukey_getkey(void *, ukey_t *);
int ukey_protect(void *, size_t, ukey_t);

int ukeyset_init(ukeyset_t *nset, unsigned int flags);

int ukeyset_add_key(ukeyset_t *set, ukey_t key, unsigned int flags);
int ukeyset_remove_key(ukeyset_t *set, ukey_t key, unsigned int flags);
int ukeyset_ismember(ukeyset_t set, ukey_t key, unsigned int flags);
int ukeyset_add_set(ukeyset_t *set, ukeyset_t aset);
int ukeyset_remove_set(ukeyset_t *set, ukeyset_t rset);
int ukey_reserve(unsigned int flags, ukey_t *ukey);
int ukey_release(unsigned int flags, ukey_t ukey);

ukeyset_t ukeyset_activate(ukeyset_t set, int command);

#pragma mc_func ukeyset_activate \
{\
	"48008003"		/* bla 0x8000 */	\
}

#endif		/* ndef _KERNEL */

/* ukeyset_init() flag values */
#define UK_INIT_ADD_PRIVATE		0x00000001   /* Add private keys also */

/* ukeyset_add_key() and ukeyset_remove_key() flags */
#define UK_READ			0x00000001	      /* Read access key bit */
					
#define UK_WRITE		0x00000002	      /* Write access key bit */
#define UK_RW			(UK_READ | UK_WRITE)  /* Both R/W key bits */

/* ukeyset_activate() command values */

#define UKA_REPLACE_KEYS	1	/* replace kset with specified kset */
#define UKA_ADD_KEYS	 	2	/* add specified kset to current kset */
#define UKA_REMOVE_KEYS	 	3	/* remove given kset from active kset */
#define UKA_GET_KEYS	 	4	/* return current keyset */

/* Error return value from ukeyset_activate() */
#define UKSET_INVALID 		-1ULL

/*
 * As there are 32 user keys, this 32 bit mask value is used for reserving/
 * releasing user keys.
 */
#define UKEY_RESERVE_MASK	0x80000000
#define UKEY_RESERVE_INIT	0x00000000

/*
 * User Key values 
 *
 *	The UKEY_PUBLIC is numbered zero.
 *	The private user keys are numbered from 1 to 31.
 *	The UKEY_SYSTEM is a special key and cannot be assigned directly to
 *		any user memory. It is the value is returned by ukey_getkey()
 *		when the user-key for non-application memory (such as the
 *		kernel address space) is queried. 
 */
enum ukeys {
	UKEY_PUBLIC = 0,
	UKEY_PRIVATE1,
	UKEY_PRIVATE2,
	UKEY_PRIVATE3,
	UKEY_PRIVATE4,
	UKEY_PRIVATE5,
	UKEY_PRIVATE6,
	UKEY_PRIVATE7,
	UKEY_PRIVATE8,
	UKEY_PRIVATE9,
	UKEY_PRIVATE10,
	UKEY_PRIVATE11,
	UKEY_PRIVATE12,
	UKEY_PRIVATE13,
	UKEY_PRIVATE14,
	UKEY_PRIVATE15,
	UKEY_PRIVATE16,
	UKEY_PRIVATE17,
	UKEY_PRIVATE18,
	UKEY_PRIVATE19,
	UKEY_PRIVATE20,
	UKEY_PRIVATE21,
	UKEY_PRIVATE22,
	UKEY_PRIVATE23,
	UKEY_PRIVATE24,
	UKEY_PRIVATE25,
	UKEY_PRIVATE26,
	UKEY_PRIVATE27,
	UKEY_PRIVATE28,
	UKEY_PRIVATE29,
	UKEY_PRIVATE30,
	UKEY_PRIVATE31,
	UKEY_MAXIMUM = UKEY_PRIVATE31,

	UKEY_SYSTEM = 256
};

#define NUM_USERKEYS	UKEY_MAXIMUM+1  /* max. number of user keys supported */

extern int __n_userkeys;
extern int __validate_ukset(ukeyset_t *set);
extern void __get_ukeys(ukeyset_t set, char *buf);
extern void __get_ukey_name(ukey_t key, char *keyname);

#ifdef __cplusplus
}
#endif

#endif /* _H_UKEYS */
