xref: /xnu-10002.61.3/osfmk/mach/mach_voucher_types.h (revision 0f4c859e951fba394238ab619495c4e1d54d0f34)
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 <mach/std_types.h>
33 #include <mach/port.h>
34 #include <mach/message.h>
35 
36 /*
37  * Mach Voucher - an immutable collection of attribute value handles.
38  *
39  * The mach voucher is such that it can be passed between processes
40  * as a Mach port send right (by convention in the mach_msg_header_t’s
41  * msgh_voucher field).
42  *
43  * You may construct a new mach voucher by passing a construction
44  * recipe to host_create_mach_voucher().  The construction recipe supports
45  * generic commands for copying, removing, and redeeming attribute value
46  * handles from previous vouchers, or running attribute-mananger-specific
47  * commands within the recipe.
48  *
49  * Once the set of attribute value handles is constructed and returned,
50  * that set will not change for the life of the voucher (just because the
51  * attribute value handle itself doesn't change, the value the handle refers
52  * to is free to change at will).
53  */
54 typedef mach_port_t             mach_voucher_t;
55 #define MACH_VOUCHER_NULL       ((mach_voucher_t) 0)
56 
57 typedef mach_port_name_t        mach_voucher_name_t;
58 #define MACH_VOUCHER_NAME_NULL  ((mach_voucher_name_t) 0)
59 
60 typedef mach_voucher_name_t     *mach_voucher_name_array_t;
61 #define MACH_VOUCHER_NAME_ARRAY_NULL ((mach_voucher_name_array_t) 0)
62 
63 /*
64  * This type changes appearance between user-space and kernel.  It is
65  * a port at user-space and a reference to an ipc_voucher structure in-kernel.
66  */
67 #if !defined(KERNEL)
68 typedef mach_voucher_t          ipc_voucher_t;
69 #else
70 #if !defined(MACH_KERNEL_PRIVATE)
71 struct ipc_voucher;
72 #endif
73 typedef struct ipc_voucher      *ipc_voucher_t;
74 #endif
75 #define IPC_VOUCHER_NULL        ((ipc_voucher_t) 0)
76 
77 /*
78  * mach_voucher_selector_t - A means of specifying which thread/task value to extract -
79  *  the current voucher set at this level, or a voucher representing
80  * the full [layered] effective value for the task/thread.
81  */
82 typedef uint32_t mach_voucher_selector_t;
83 #define MACH_VOUCHER_SELECTOR_CURRENT           ((mach_voucher_selector_t)0)
84 #define MACH_VOUCHER_SELECTOR_EFFECTIVE         ((mach_voucher_selector_t)1)
85 
86 
87 /*
88  * mach_voucher_attr_key_t - The key used to identify a particular managed resource or
89  * to select the specific resource manager’s data associated
90  * with a given voucher.
91  */
92 typedef uint32_t mach_voucher_attr_key_t;
93 typedef mach_voucher_attr_key_t *mach_voucher_attr_key_array_t;
94 
95 #define MACH_VOUCHER_ATTR_KEY_ALL               ((mach_voucher_attr_key_t)~0)
96 #define MACH_VOUCHER_ATTR_KEY_NONE              ((mach_voucher_attr_key_t)0)
97 
98 /* other well-known-keys will be added here */
99 #define MACH_VOUCHER_ATTR_KEY_ATM               ((mach_voucher_attr_key_t)1)
100 #define MACH_VOUCHER_ATTR_KEY_IMPORTANCE        ((mach_voucher_attr_key_t)2)
101 #define MACH_VOUCHER_ATTR_KEY_BANK              ((mach_voucher_attr_key_t)3)
102 
103 /* following keys have been removed from embedded platforms */
104 #define MACH_VOUCHER_ATTR_KEY_PTHPRIORITY       ((mach_voucher_attr_key_t)4)
105 #define MACH_VOUCHER_ATTR_KEY_USER_DATA         ((mach_voucher_attr_key_t)7)
106 #define MACH_VOUCHER_ATTR_KEY_BITS              MACH_VOUCHER_ATTR_KEY_USER_DATA
107 #define MACH_VOUCHER_ATTR_KEY_TEST              ((mach_voucher_attr_key_t)8)
108 
109 /* not used, for compatibility only */
110 #define MACH_VOUCHER_ATTR_KEY_NUM_WELL_KNOWN    MACH_VOUCHER_ATTR_KEY_TEST
111 
112 /*
113  * mach_voucher_attr_content_t
114  *
115  * Data passed to a resource manager for modifying an attribute
116  * value or returned from the resource manager in response to a
117  * request to externalize the current value for that attribute.
118  */
119 typedef uint8_t *mach_voucher_attr_content_t;
120 typedef uint32_t mach_voucher_attr_content_size_t;
121 
122 /*
123  * mach_voucher_attr_command_t - The private verbs implemented by each voucher
124  * attribute manager via mach_voucher_attr_command().
125  */
126 typedef uint32_t mach_voucher_attr_command_t;
127 
128 /*
129  * mach_voucher_attr_recipe_command_t
130  *
131  * The verbs used to create/morph a voucher attribute value.
132  * We define some system-wide commands here - related to creation, and transport of
133  * vouchers and attributes.  Additional commands can be defined by, and supported by,
134  * individual attribute resource managers.
135  */
136 typedef uint32_t mach_voucher_attr_recipe_command_t;
137 typedef mach_voucher_attr_recipe_command_t *mach_voucher_attr_recipe_command_array_t;
138 
139 #define MACH_VOUCHER_ATTR_NOOP                  ((mach_voucher_attr_recipe_command_t)0)
140 #define MACH_VOUCHER_ATTR_COPY                  ((mach_voucher_attr_recipe_command_t)1)
141 #define MACH_VOUCHER_ATTR_REMOVE                ((mach_voucher_attr_recipe_command_t)2)
142 #define MACH_VOUCHER_ATTR_SET_VALUE_HANDLE      ((mach_voucher_attr_recipe_command_t)3)
143 #define MACH_VOUCHER_ATTR_AUTO_REDEEM           ((mach_voucher_attr_recipe_command_t)4)
144 #define MACH_VOUCHER_ATTR_SEND_PREPROCESS       ((mach_voucher_attr_recipe_command_t)5)
145 
146 /* redeem is on its way out? */
147 #define MACH_VOUCHER_ATTR_REDEEM                ((mach_voucher_attr_recipe_command_t)10)
148 
149 /* recipe command(s) for importance attribute manager */
150 #define MACH_VOUCHER_ATTR_IMPORTANCE_SELF       ((mach_voucher_attr_recipe_command_t)200)
151 
152 /* recipe command(s) for bit-store attribute manager */
153 #define MACH_VOUCHER_ATTR_USER_DATA_STORE       ((mach_voucher_attr_recipe_command_t)211)
154 #define MACH_VOUCHER_ATTR_BITS_STORE            MACH_VOUCHER_ATTR_USER_DATA_STORE /* deprecated */
155 
156 /* recipe command(s) for test attribute manager */
157 #define MACH_VOUCHER_ATTR_TEST_STORE            MACH_VOUCHER_ATTR_USER_DATA_STORE
158 
159 /*
160  * mach_voucher_attr_recipe_t
161  *
162  * An element in a recipe list to create a voucher.
163  */
164 #pragma pack(push, 1)
165 
166 typedef struct mach_voucher_attr_recipe_data {
167 	mach_voucher_attr_key_t                 key;
168 	mach_voucher_attr_recipe_command_t      command;
169 	mach_voucher_name_t                     previous_voucher;
170 	mach_voucher_attr_content_size_t        content_size;
171 	uint8_t                                 content[];
172 } mach_voucher_attr_recipe_data_t;
173 typedef mach_voucher_attr_recipe_data_t *mach_voucher_attr_recipe_t;
174 typedef mach_msg_type_number_t mach_voucher_attr_recipe_size_t;
175 
176 /* Make the above palatable to MIG */
177 typedef uint8_t *mach_voucher_attr_raw_recipe_t;
178 typedef mach_voucher_attr_raw_recipe_t mach_voucher_attr_raw_recipe_array_t;
179 typedef mach_msg_type_number_t mach_voucher_attr_raw_recipe_size_t;
180 typedef mach_msg_type_number_t mach_voucher_attr_raw_recipe_array_size_t;
181 
182 #define MACH_VOUCHER_ATTR_MAX_RAW_RECIPE_ARRAY_SIZE   5120
183 #define MACH_VOUCHER_TRAP_STACK_LIMIT                 256
184 
185 #pragma pack(pop)
186 
187 /*
188  * VOUCHER ATTRIBUTE MANAGER Writer types
189  */
190 
191 /*
192  * mach_voucher_attr_manager_t
193  *
194  * A handle through which the mach voucher mechanism communicates with the voucher
195  * attribute manager for a given attribute key.
196  */
197 typedef mach_port_t                     mach_voucher_attr_manager_t;
198 #define MACH_VOUCHER_ATTR_MANAGER_NULL  ((mach_voucher_attr_manager_t) 0)
199 
200 /*
201  * mach_voucher_attr_control_t
202  *
203  * A handle provided to the voucher attribute manager for a given attribute key
204  * through which it makes inquiries or control operations of the mach voucher mechanism.
205  */
206 typedef mach_port_t                     mach_voucher_attr_control_t;
207 #define MACH_VOUCHER_ATTR_CONTROL_NULL  ((mach_voucher_attr_control_t) 0)
208 
209 /*
210  * These types are different in-kernel vs user-space.  They are ports in user-space,
211  * pointers to opaque structs in most of the kernel, and pointers to known struct
212  * types in the Mach portion of the kernel.
213  */
214 #if !defined(KERNEL)
215 typedef mach_port_t             ipc_voucher_attr_manager_t;
216 typedef mach_port_t             ipc_voucher_attr_control_t;
217 #else
218 #if !defined(MACH_KERNEL_PRIVATE)
219 struct ipc_voucher_attr_manager;
220 struct ipc_voucher_attr_control;
221 #endif
222 typedef const struct ipc_voucher_attr_manager *ipc_voucher_attr_manager_t;
223 typedef struct ipc_voucher_attr_control *ipc_voucher_attr_control_t;
224 #endif
225 #define IPC_VOUCHER_ATTR_MANAGER_NULL ((ipc_voucher_attr_manager_t) 0)
226 #define IPC_VOUCHER_ATTR_CONTROL_NULL ((ipc_voucher_attr_control_t) 0)
227 
228 /*
229  * mach_voucher_attr_value_handle_t
230  *
231  * The private handle that the voucher attribute manager provides to
232  * the mach voucher mechanism to represent a given attr content/value.
233  */
234 typedef uint64_t mach_voucher_attr_value_handle_t __kernel_ptr_semantics;
235 typedef mach_voucher_attr_value_handle_t *mach_voucher_attr_value_handle_array_t;
236 
237 typedef mach_msg_type_number_t mach_voucher_attr_value_handle_array_size_t;
238 #define MACH_VOUCHER_ATTR_VALUE_MAX_NESTED      ((mach_voucher_attr_value_handle_array_size_t)4)
239 
240 typedef uint32_t mach_voucher_attr_value_reference_t;
241 typedef uint32_t mach_voucher_attr_value_flags_t;
242 #define MACH_VOUCHER_ATTR_VALUE_FLAGS_NONE      ((mach_voucher_attr_value_flags_t)0)
243 #define MACH_VOUCHER_ATTR_VALUE_FLAGS_PERSIST   ((mach_voucher_attr_value_flags_t)1)
244 
245 /* USE - TBD */
246 typedef uint32_t mach_voucher_attr_control_flags_t;
247 #define MACH_VOUCHER_ATTR_CONTROL_FLAGS_NONE    ((mach_voucher_attr_control_flags_t)0)
248 
249 /*
250  * Commands and types for the IPC Importance Attribute Manager
251  *
252  * These are the valid mach_voucher_attr_command() options with the
253  * MACH_VOUCHER_ATTR_KEY_IMPORTANCE key.
254  */
255 #define MACH_VOUCHER_IMPORTANCE_ATTR_ADD_EXTERNAL       1  /* Add some number of external refs (not supported) */
256 #define MACH_VOUCHER_IMPORTANCE_ATTR_DROP_EXTERNAL      2  /* Drop some number of external refs */
257 typedef uint32_t mach_voucher_attr_importance_refs;
258 
259 /*
260  * Activity id Generation defines
261  */
262 #define MACH_ACTIVITY_ID_COUNT_MAX 16
263 
264 #endif  /* _MACH_VOUCHER_TYPES_H_ */
265