xref: /trueos/sys/sys/mach/mach_voucher_types.h (revision 192ccd356fc04f92eff2c1d3bc61c1cd1f1aad6b)
1 /*
2  * Copyright (c) 2013 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5  *
6  * This file contains Original Code and/or Modifications of Original Code
7  * as defined in and that are subject to the Apple Public Source License
8  * Version 2.0 (the 'License'). You may not use this file except in
9  * compliance with the License. The rights granted to you under the License
10  * may not be used to create, or enable the creation or redistribution of,
11  * unlawful or unlicensed copies of an Apple operating system, or to
12  * circumvent, violate, or enable the circumvention or violation of, any
13  * terms of an Apple operating system software license agreement.
14  *
15  * Please obtain a copy of the License at
16  * http://www.opensource.apple.com/apsl/ and read it before using this file.
17  *
18  * The Original Code and all software distributed under the License are
19  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23  * Please see the License for the specific language governing rights and
24  * limitations under the License.
25  *
26  * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27  */
28 
29 #ifndef	_MACH_VOUCHER_TYPES_H_
30 #define	_MACH_VOUCHER_TYPES_H_
31 
32 #include <sys/mach/port.h>
33 #include <sys/mach/message.h>
34 
35 /*
36  * Mach Voucher - an immutable collection of attribute value handles.
37  *
38  * The mach voucher is such that it can be passed between processes
39  * as a Mach port send right (by convention in the mach_msg_header_t’s
40  * msgh_voucher field).
41  *
42  * You may construct a new mach voucher by passing a construction
43  * recipe to host_create_mach_voucher().  The construction recipe supports
44  * generic commands for copying, removing, and redeeming attribute value
45  * handles from previous vouchers, or running attribute-mananger-specific
46  * commands within the recipe.
47  *
48  * Once the set of attribute value handles is constructed and returned,
49  * that set will not change for the life of the voucher (just because the
50  * attribute value handle itself doesn't change, the value the handle refers
51  * to is free to change at will).
52  */
53 typedef mach_port_t		mach_voucher_t;
54 #define MACH_VOUCHER_NULL	((mach_voucher_t) 0)
55 
56 typedef mach_port_name_t	mach_voucher_name_t;
57 #define MACH_VOUCHER_NAME_NULL	((mach_voucher_name_t) 0)
58 
59 typedef mach_voucher_name_t	*mach_voucher_name_array_t;
60 #define MACH_VOUCHER_NAME_ARRAY_NULL ((mach_voucher_name_array_t) 0)
61 
62 /*
63  * This type changes appearance between user-space and kernel.  It is
64  * a port at user-space and a reference to an ipc_voucher structure in-kernel.
65  */
66 typedef mach_voucher_t		ipc_voucher_t;
67 #define IPC_VOUCHER_NULL	((ipc_voucher_t) 0)
68 
69 /*
70  * mach_voucher_selector_t - A means of specifying which thread/task value to extract -
71  *  the current voucher set at this level, or a voucher representing
72  * the full [layered] effective value for the task/thread.
73  */
74 typedef uint32_t mach_voucher_selector_t;
75 #define MACH_VOUCHER_SELECTOR_CURRENT 		((mach_voucher_selector_t)0)
76 #define MACH_VOUCHER_SELECTOR_EFFECTIVE 	((mach_voucher_selector_t)1)
77 
78 
79 /*
80  * mach_voucher_attr_key_t - The key used to identify a particular managed resource or
81  * to select the specific resource manager’s data associated
82  * with a given voucher.
83  */
84 typedef uint32_t mach_voucher_attr_key_t;
85 typedef mach_voucher_attr_key_t *mach_voucher_attr_key_array_t;
86 
87 #define MACH_VOUCHER_ATTR_KEY_ALL 		((mach_voucher_attr_key_t)~0)
88 #define MACH_VOUCHER_ATTR_KEY_NONE 		((mach_voucher_attr_key_t)0)
89 
90 /* other well-known-keys will be added here */
91 #define MACH_VOUCHER_ATTR_KEY_ATM		((mach_voucher_attr_key_t)1)
92 #define MACH_VOUCHER_ATTR_KEY_IMPORTANCE	((mach_voucher_attr_key_t)2)
93 #define MACH_VOUCHER_ATTR_KEY_BANK		((mach_voucher_attr_key_t)3)
94 
95 #define MACH_VOUCHER_ATTR_KEY_USER_DATA		((mach_voucher_attr_key_t)7)
96 #define MACH_VOUCHER_ATTR_KEY_BITS		MACH_VOUCHER_ATTR_KEY_USER_DATA /* deprecated */
97 #define MACH_VOUCHER_ATTR_KEY_TEST 		((mach_voucher_attr_key_t)8)
98 
99 #define MACH_VOUCHER_ATTR_KEY_NUM_WELL_KNOWN	MACH_VOUCHER_ATTR_KEY_TEST
100 
101 /*
102  * mach_voucher_attr_content_t
103  *
104  * Data passed to a resource manager for modifying an attribute
105  * value or returned from the resource manager in response to a
106  * request to externalize the current value for that attribute.
107  */
108 typedef uint8_t *mach_voucher_attr_content_t;
109 typedef uint32_t mach_voucher_attr_content_size_t;
110 
111 /*
112  * mach_voucher_attr_command_t - The private verbs implemented by each voucher
113  * attribute manager via mach_voucher_attr_command().
114  */
115 typedef uint32_t mach_voucher_attr_command_t;
116 
117 /*
118  * mach_voucher_attr_recipe_command_t
119  *
120  * The verbs used to create/morph a voucher attribute value.
121  * We define some system-wide commands here - related to creation, and transport of
122  * vouchers and attributes.  Additional commands can be defined by, and supported by,
123  * individual attribute resource managers.
124  */
125 typedef uint32_t mach_voucher_attr_recipe_command_t;
126 typedef mach_voucher_attr_recipe_command_t *mach_voucher_attr_recipe_command_array_t;
127 
128 #define MACH_VOUCHER_ATTR_NOOP			((mach_voucher_attr_recipe_command_t)0)
129 #define MACH_VOUCHER_ATTR_COPY 			((mach_voucher_attr_recipe_command_t)1)
130 #define MACH_VOUCHER_ATTR_REMOVE		((mach_voucher_attr_recipe_command_t)2)
131 #define MACH_VOUCHER_ATTR_SET_VALUE_HANDLE	((mach_voucher_attr_recipe_command_t)3)
132 
133 /* redeem is on its way out? */
134 #define MACH_VOUCHER_ATTR_REDEEM 		((mach_voucher_attr_recipe_command_t)10)
135 
136 /* recipe command(s) for importance attribute manager */
137 #define MACH_VOUCHER_ATTR_IMPORTANCE_SELF	((mach_voucher_attr_recipe_command_t)200)
138 
139 /* recipe command(s) for bit-store attribute manager */
140 #define MACH_VOUCHER_ATTR_USER_DATA_STORE 	((mach_voucher_attr_recipe_command_t)211)
141 #define MACH_VOUCHER_ATTR_BITS_STORE 		MACH_VOUCHER_ATTR_USER_DATA_STORE /* deprecated */
142 
143 /* recipe command(s) for test attribute manager */
144 #define MACH_VOUCHER_ATTR_TEST_STORE 		MACH_VOUCHER_ATTR_USER_DATA_STORE
145 
146 /*
147  * mach_voucher_attr_recipe_t
148  *
149  * An element in a recipe list to create a voucher.
150  */
151 #pragma pack(1)
152 
153 typedef struct mach_voucher_attr_recipe_data {
154 	mach_voucher_attr_key_t	                key;
155 	mach_voucher_attr_recipe_command_t      command;
156 	mach_voucher_name_t                     previous_voucher;
157 	mach_voucher_attr_content_size_t	content_size;
158 	uint8_t				        content[];
159 } mach_voucher_attr_recipe_data_t;
160 typedef mach_voucher_attr_recipe_data_t *mach_voucher_attr_recipe_t;
161 typedef mach_msg_type_number_t mach_voucher_attr_recipe_size_t;
162 
163 /* Make the above palatable to MIG */
164 typedef uint8_t *mach_voucher_attr_raw_recipe_t;
165 typedef mach_voucher_attr_raw_recipe_t mach_voucher_attr_raw_recipe_array_t;
166 typedef mach_msg_type_number_t mach_voucher_attr_raw_recipe_size_t;
167 typedef mach_msg_type_number_t mach_voucher_attr_raw_recipe_array_size_t;
168 
169 #pragma pack()
170 
171 /*
172  * VOUCHER ATTRIBUTE MANAGER Writer types
173  */
174 
175 /*
176  * mach_voucher_attr_manager_t
177  *
178  * A handle through which the mach voucher mechanism communicates with the voucher
179  * attribute manager for a given attribute key.
180  */
181 typedef mach_port_t			mach_voucher_attr_manager_t;
182 #define MACH_VOUCHER_ATTR_MANAGER_NULL  ((mach_voucher_attr_manager_t) 0)
183 
184 /*
185  * mach_voucher_attr_control_t
186  *
187  * A handle provided to the voucher attribute manager for a given attribute key
188  * through which it makes inquiries or control operations of the mach voucher mechanism.
189  */
190 typedef mach_port_t			mach_voucher_attr_control_t;
191 #define MACH_VOUCHER_ATTR_CONTROL_NULL  ((mach_voucher_attr_control_t) 0)
192 
193 /*
194  * These types are different in-kernel vs user-space.  They are ports in user-space,
195  * pointers to opaque structs in most of the kernel, and pointers to known struct
196  * types in the Mach portion of the kernel.
197  */
198 typedef mach_port_t		ipc_voucher_attr_manager_t;
199 typedef mach_port_t		ipc_voucher_attr_control_t;
200 #define IPC_VOUCHER_ATTR_MANAGER_NULL ((ipc_voucher_attr_manager_t) 0)
201 #define IPC_VOUCHER_ATTR_CONTROL_NULL ((ipc_voucher_attr_control_t) 0)
202 
203 /*
204  * mach_voucher_attr_value_handle_t
205  *
206  * The private handle that the voucher attribute manager provides to
207  * the mach voucher mechanism to represent a given attr content/value.
208  */
209 typedef uint64_t mach_voucher_attr_value_handle_t;
210 typedef mach_voucher_attr_value_handle_t *mach_voucher_attr_value_handle_array_t;
211 
212 typedef mach_msg_type_number_t mach_voucher_attr_value_handle_array_size_t;
213 #define MACH_VOUCHER_ATTR_VALUE_MAX_NESTED 	((mach_voucher_attr_value_handle_array_size_t)4)
214 
215 typedef uint32_t mach_voucher_attr_value_reference_t;
216 
217 /* USE - TBD */
218 typedef uint32_t mach_voucher_attr_control_flags_t;
219 #define MACH_VOUCHER_ATTR_CONTROL_FLAGS_NONE 	((mach_voucher_attr_control_flags_t)0)
220 
221 /*
222  * Commands and types for the IPC Importance Attribute Manager
223  *
224  * These are the valid mach_voucher_attr_command() options with the
225  * MACH_VOUCHER_ATTR_KEY_IMPORTANCE key.
226  */
227 #define MACH_VOUCHER_IMPORTANCE_ATTR_ADD_EXTERNAL       1  /* Add some number of external refs (not supported) */
228 #define MACH_VOUCHER_IMPORTANCE_ATTR_DROP_EXTERNAL      2  /* Drop some number of external refs */
229 typedef uint32_t mach_voucher_attr_importance_refs;
230 
231 #endif	/* _MACH_VOUCHER_TYPES_H_ */
232