1 // Copyright 2016 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef ZIRCON_TYPES_H_
6 #define ZIRCON_TYPES_H_
7 
8 #include <stdbool.h>
9 #include <stddef.h>
10 #include <stdint.h>
11 #include <zircon/compiler.h>
12 #include <zircon/errors.h>
13 #include <zircon/limits.h>
14 #include <zircon/rights.h>
15 
16 #ifndef __cplusplus
17 #ifndef _KERNEL
18 // We don't want to include <stdatomic.h> from the kernel code because the
19 // kernel definitions of atomic operations are incompatible with those defined
20 // in <stdatomic.h>.
21 //
22 // A better solution would be to use <stdatomic.h> and C11 atomic operation
23 // even in the kernel, but that would require modifying all the code that uses
24 // the existing homegrown atomics.
25 #include <stdatomic.h>
26 #endif
27 #endif
28 
29 __BEGIN_CDECLS
30 
31 // ask clang format not to mess up the indentation:
32 // clang-format off
33 
34 typedef uint32_t zx_handle_t;
35 
36 #define ZX_HANDLE_INVALID         ((zx_handle_t)0)
37 
38 // See errors.h for the values zx_status_t can take.
39 typedef int32_t zx_status_t;
40 
41 // absolute time in nanoseconds (generally with respect to the monotonic clock)
42 typedef int64_t zx_time_t;
43 // a duration in nanoseconds
44 typedef int64_t zx_duration_t;
45 // a duration in hardware ticks
46 typedef uint64_t zx_ticks_t;
47 #define ZX_TIME_INFINITE INT64_MAX
48 #define ZX_TIME_INFINITE_PAST INT64_MIN
49 #define ZX_NSEC(n) ((zx_duration_t)(1LL * (n)))
50 #define ZX_USEC(n) ((zx_duration_t)(1000LL * (n)))
51 #define ZX_MSEC(n) ((zx_duration_t)(1000000LL * (n)))
52 #define ZX_SEC(n)  ((zx_duration_t)(1000000000LL * (n)))
53 #define ZX_MIN(n)  (ZX_SEC(n) * 60LL)
54 #define ZX_HOUR(n) (ZX_MIN(n) * 60LL)
55 
56 // clock ids
57 typedef uint32_t zx_clock_t;
58 #define ZX_CLOCK_MONOTONIC        ((zx_clock_t)0)
59 #define ZX_CLOCK_UTC              ((zx_clock_t)1)
60 #define ZX_CLOCK_THREAD           ((zx_clock_t)2)
61 
62 typedef uint32_t zx_signals_t;
63 
64 #define ZX_SIGNAL_NONE              ((zx_signals_t)0u)
65 #define ZX_USER_SIGNAL_ALL          ((zx_signals_t)0xff000000u)
66 
67 // Implementation details (__ZX_* not intended for public consumption)
68 //
69 // Signals that have a common meaning where used are named with that
70 // meaning.  Signals that do not, or are not yet in use, are named
71 // generically.
72 #define __ZX_OBJECT_SIGNAL_ALL      ((zx_signals_t)0x00ffffffu)
73 #define __ZX_OBJECT_READABLE        ((zx_signals_t)1u << 0)
74 #define __ZX_OBJECT_WRITABLE        ((zx_signals_t)1u << 1)
75 #define __ZX_OBJECT_PEER_CLOSED     ((zx_signals_t)1u << 2)
76 #define __ZX_OBJECT_SIGNALED        ((zx_signals_t)1u << 3)
77 #define __ZX_OBJECT_SIGNAL_4        ((zx_signals_t)1u << 4)
78 #define __ZX_OBJECT_SIGNAL_5        ((zx_signals_t)1u << 5)
79 #define __ZX_OBJECT_SIGNAL_6        ((zx_signals_t)1u << 6)
80 #define __ZX_OBJECT_SIGNAL_7        ((zx_signals_t)1u << 7)
81 #define __ZX_OBJECT_SIGNAL_8        ((zx_signals_t)1u << 8)
82 #define __ZX_OBJECT_SIGNAL_9        ((zx_signals_t)1u << 9)
83 #define __ZX_OBJECT_SIGNAL_10       ((zx_signals_t)1u << 10)
84 #define __ZX_OBJECT_SIGNAL_11       ((zx_signals_t)1u << 11)
85 #define __ZX_OBJECT_SIGNAL_12       ((zx_signals_t)1u << 12)
86 #define __ZX_OBJECT_SIGNAL_13       ((zx_signals_t)1u << 13)
87 #define __ZX_OBJECT_SIGNAL_14       ((zx_signals_t)1u << 14)
88 #define __ZX_OBJECT_SIGNAL_15       ((zx_signals_t)1u << 15)
89 #define __ZX_OBJECT_SIGNAL_16       ((zx_signals_t)1u << 16)
90 #define __ZX_OBJECT_SIGNAL_17       ((zx_signals_t)1u << 17)
91 #define __ZX_OBJECT_SIGNAL_18       ((zx_signals_t)1u << 18)
92 #define __ZX_OBJECT_SIGNAL_19       ((zx_signals_t)1u << 19)
93 #define __ZX_OBJECT_SIGNAL_20       ((zx_signals_t)1u << 20)
94 #define __ZX_OBJECT_SIGNAL_21       ((zx_signals_t)1u << 21)
95 #define __ZX_OBJECT_SIGNAL_22       ((zx_signals_t)1u << 22)
96 #define __ZX_OBJECT_HANDLE_CLOSED   ((zx_signals_t)1u << 23)
97 
98 
99 
100 // User Signals (for zx_object_signal() and zx_object_signal_peer())
101 #define ZX_USER_SIGNAL_0            ((zx_signals_t)1u << 24)
102 #define ZX_USER_SIGNAL_1            ((zx_signals_t)1u << 25)
103 #define ZX_USER_SIGNAL_2            ((zx_signals_t)1u << 26)
104 #define ZX_USER_SIGNAL_3            ((zx_signals_t)1u << 27)
105 #define ZX_USER_SIGNAL_4            ((zx_signals_t)1u << 28)
106 #define ZX_USER_SIGNAL_5            ((zx_signals_t)1u << 29)
107 #define ZX_USER_SIGNAL_6            ((zx_signals_t)1u << 30)
108 #define ZX_USER_SIGNAL_7            ((zx_signals_t)1u << 31)
109 
110 // Cancellation (handle was closed while waiting with it)
111 #define ZX_SIGNAL_HANDLE_CLOSED     __ZX_OBJECT_HANDLE_CLOSED
112 
113 // Event
114 #define ZX_EVENT_SIGNALED           __ZX_OBJECT_SIGNALED
115 #define ZX_EVENT_SIGNAL_MASK        (ZX_USER_SIGNAL_ALL | __ZX_OBJECT_SIGNALED)
116 
117 // EventPair
118 #define ZX_EVENTPAIR_SIGNALED       __ZX_OBJECT_SIGNALED
119 #define ZX_EVENTPAIR_PEER_CLOSED    __ZX_OBJECT_PEER_CLOSED
120 #define ZX_EVENTPAIR_SIGNAL_MASK    (ZX_USER_SIGNAL_ALL | __ZX_OBJECT_SIGNALED | __ZX_OBJECT_PEER_CLOSED)
121 
122 // Channel
123 #define ZX_CHANNEL_READABLE         __ZX_OBJECT_READABLE
124 #define ZX_CHANNEL_WRITABLE         __ZX_OBJECT_WRITABLE
125 #define ZX_CHANNEL_PEER_CLOSED      __ZX_OBJECT_PEER_CLOSED
126 
127 // Socket
128 #define ZX_SOCKET_READABLE            __ZX_OBJECT_READABLE
129 #define ZX_SOCKET_WRITABLE            __ZX_OBJECT_WRITABLE
130 #define ZX_SOCKET_PEER_CLOSED         __ZX_OBJECT_PEER_CLOSED
131 #define ZX_SOCKET_PEER_WRITE_DISABLED __ZX_OBJECT_SIGNAL_4
132 #define ZX_SOCKET_WRITE_DISABLED      __ZX_OBJECT_SIGNAL_5
133 #define ZX_SOCKET_CONTROL_READABLE    __ZX_OBJECT_SIGNAL_6
134 #define ZX_SOCKET_CONTROL_WRITABLE    __ZX_OBJECT_SIGNAL_7
135 #define ZX_SOCKET_ACCEPT              __ZX_OBJECT_SIGNAL_8
136 #define ZX_SOCKET_SHARE               __ZX_OBJECT_SIGNAL_9
137 #define ZX_SOCKET_READ_THRESHOLD      __ZX_OBJECT_SIGNAL_10
138 #define ZX_SOCKET_WRITE_THRESHOLD     __ZX_OBJECT_SIGNAL_11
139 
140 // Deprecated
141 #define ZX_SOCKET_READ_DISABLED       ZX_SOCKET_PEER_WRITE_DISABLED
142 
143 // Fifo
144 #define ZX_FIFO_READABLE            __ZX_OBJECT_READABLE
145 #define ZX_FIFO_WRITABLE            __ZX_OBJECT_WRITABLE
146 #define ZX_FIFO_PEER_CLOSED         __ZX_OBJECT_PEER_CLOSED
147 
148 // Task signals (process, thread, job)
149 #define ZX_TASK_TERMINATED          __ZX_OBJECT_SIGNALED
150 
151 // Job
152 #define ZX_JOB_NO_PROCESSES         __ZX_OBJECT_SIGNALED
153 #define ZX_JOB_NO_JOBS              __ZX_OBJECT_SIGNAL_4
154 
155 // Process
156 #define ZX_PROCESS_TERMINATED       __ZX_OBJECT_SIGNALED
157 
158 // Thread
159 #define ZX_THREAD_TERMINATED        __ZX_OBJECT_SIGNALED
160 #define ZX_THREAD_RUNNING           __ZX_OBJECT_SIGNAL_4
161 #define ZX_THREAD_SUSPENDED         __ZX_OBJECT_SIGNAL_5
162 
163 // Log
164 #define ZX_LOG_READABLE             __ZX_OBJECT_READABLE
165 #define ZX_LOG_WRITABLE             __ZX_OBJECT_WRITABLE
166 
167 // Timer
168 #define ZX_TIMER_SIGNALED           __ZX_OBJECT_SIGNALED
169 
170 // VMO
171 #define ZX_VMO_ZERO_CHILDREN        __ZX_OBJECT_SIGNALED
172 
173 // global kernel object id.
174 // Note: kernel object ids use 63 bits, with the most significant bit being zero.
175 // The remaining values (msb==1) are for use by programs and tools that wish to
176 // create koids for artificial objets.
177 typedef uint64_t zx_koid_t;
178 #define ZX_KOID_INVALID ((uint64_t) 0)
179 #define ZX_KOID_KERNEL  ((uint64_t) 1)
180 
181 // Transaction ID and argument types for zx_channel_call.
182 typedef uint32_t zx_txid_t;
183 
184 typedef struct zx_channel_call_args {
185     const void* wr_bytes;
186     const zx_handle_t* wr_handles;
187     void *rd_bytes;
188     zx_handle_t* rd_handles;
189     uint32_t wr_num_bytes;
190     uint32_t wr_num_handles;
191     uint32_t rd_num_bytes;
192     uint32_t rd_num_handles;
193 } zx_channel_call_args_t;
194 
195 // Maximum number of wait items allowed for zx_object_wait_many()
196 // TODO(ZX-1349) Re-lower this.
197 #define ZX_WAIT_MANY_MAX_ITEMS ((size_t)16)
198 
199 // Structure for zx_object_wait_many():
200 typedef struct zx_wait_item {
201     zx_handle_t handle;
202     zx_signals_t waitfor;
203     zx_signals_t pending;
204 } zx_wait_item_t;
205 
206 // VM Object creation options
207 #define ZX_VMO_NON_RESIZABLE             ((uint32_t)1u)
208 
209 // VM Object opcodes
210 #define ZX_VMO_OP_COMMIT                 ((uint32_t)1u)
211 #define ZX_VMO_OP_DECOMMIT               ((uint32_t)2u)
212 #define ZX_VMO_OP_LOCK                   ((uint32_t)3u)
213 #define ZX_VMO_OP_UNLOCK                 ((uint32_t)4u)
214 // opcode 5 was ZX_VMO_OP_LOOKUP, but is now unused.
215 #define ZX_VMO_OP_CACHE_SYNC             ((uint32_t)6u)
216 #define ZX_VMO_OP_CACHE_INVALIDATE       ((uint32_t)7u)
217 #define ZX_VMO_OP_CACHE_CLEAN            ((uint32_t)8u)
218 #define ZX_VMO_OP_CACHE_CLEAN_INVALIDATE ((uint32_t)9u)
219 
220 // VM Object clone flags
221 #define ZX_VMO_CLONE_COPY_ON_WRITE        ((uint32_t)1u << 0)
222 #define ZX_VMO_CLONE_NON_RESIZEABLE       ((uint32_t)1u << 1)
223 
224 typedef uint32_t zx_vm_option_t;
225 // Mapping flags to vmar routines
226 #define ZX_VM_PERM_READ             ((zx_vm_option_t)(1u << 0))
227 #define ZX_VM_PERM_WRITE            ((zx_vm_option_t)(1u << 1))
228 #define ZX_VM_PERM_EXECUTE          ((zx_vm_option_t)(1u << 2))
229 #define ZX_VM_COMPACT               ((zx_vm_option_t)(1u << 3))
230 #define ZX_VM_SPECIFIC              ((zx_vm_option_t)(1u << 4))
231 #define ZX_VM_SPECIFIC_OVERWRITE    ((zx_vm_option_t)(1u << 5))
232 #define ZX_VM_CAN_MAP_SPECIFIC      ((zx_vm_option_t)(1u << 6))
233 #define ZX_VM_CAN_MAP_READ          ((zx_vm_option_t)(1u << 7))
234 #define ZX_VM_CAN_MAP_WRITE         ((zx_vm_option_t)(1u << 8))
235 #define ZX_VM_CAN_MAP_EXECUTE       ((zx_vm_option_t)(1u << 9))
236 #define ZX_VM_MAP_RANGE             ((zx_vm_option_t)(1u << 10))
237 #define ZX_VM_REQUIRE_NON_RESIZABLE ((zx_vm_option_t)(1u << 11))
238 
239 
240 // virtual address
241 typedef uintptr_t zx_vaddr_t;
242 
243 // physical address
244 typedef uintptr_t zx_paddr_t;
245 // low mem physical address
246 typedef uint32_t  zx_paddr32_t;
247 // Hypervisor guest physical addresses.
248 typedef uintptr_t zx_gpaddr_t;
249 
250 // offset
251 typedef uint64_t zx_off_t;
252 
253 // Maximum string length for kernel names (process name, thread name, etc)
254 #define ZX_MAX_NAME_LEN              ((size_t)32u)
255 
256 // Buffer size limits on the cprng syscalls
257 #define ZX_CPRNG_DRAW_MAX_LEN        ((size_t)256u)
258 #define ZX_CPRNG_ADD_ENTROPY_MAX_LEN ((size_t)256u)
259 
260 // interrupt bind flags
261 #define ZX_INTERRUPT_REMAP_IRQ       ((uint32_t)0x1u)
262 #define ZX_INTERRUPT_MODE_DEFAULT    ((uint32_t)0u << 1)
263 #define ZX_INTERRUPT_MODE_EDGE_LOW   ((uint32_t)1u << 1)
264 #define ZX_INTERRUPT_MODE_EDGE_HIGH  ((uint32_t)2u << 1)
265 #define ZX_INTERRUPT_MODE_LEVEL_LOW  ((uint32_t)3u << 1)
266 #define ZX_INTERRUPT_MODE_LEVEL_HIGH ((uint32_t)4u << 1)
267 #define ZX_INTERRUPT_MODE_EDGE_BOTH  ((uint32_t)5u << 1)
268 #define ZX_INTERRUPT_MODE_MASK       ((uint32_t)0xe)
269 #define ZX_INTERRUPT_VIRTUAL         ((uint32_t)0x10)
270 
271 // Preallocated virtual interrupt slot, typically used for signaling interrupt threads to exit.
272 #define ZX_INTERRUPT_SLOT_USER              ((uint32_t)62u)
273 // interrupt wait slots must be in the range 0 - 62 inclusive
274 #define ZX_INTERRUPT_MAX_SLOTS              ((uint32_t)62u)
275 
276 // PCI interrupt handles use interrupt slot 0 for the PCI hardware interrupt
277 #define ZX_PCI_INTERRUPT_SLOT               ((uint32_t)0u)
278 
279 // Channel options and limits.
280 #define ZX_CHANNEL_READ_MAY_DISCARD         ((uint32_t)1u)
281 
282 #define ZX_CHANNEL_MAX_MSG_BYTES            ((uint32_t)65536u)
283 #define ZX_CHANNEL_MAX_MSG_HANDLES          ((uint32_t)64u)
284 
285 // Socket options and limits.
286 // These options can be passed to zx_socket_shutdown()
287 #define ZX_SOCKET_SHUTDOWN_WRITE            ((uint32_t)1u << 0)
288 #define ZX_SOCKET_SHUTDOWN_READ             ((uint32_t)1u << 1)
289 #define ZX_SOCKET_SHUTDOWN_MASK             (ZX_SOCKET_SHUTDOWN_WRITE | ZX_SOCKET_SHUTDOWN_READ)
290 
291 // These can be passed to zx_socket_create()
292 #define ZX_SOCKET_STREAM                    ((uint32_t)0u)
293 #define ZX_SOCKET_DATAGRAM                  ((uint32_t)1u << 0)
294 #define ZX_SOCKET_HAS_CONTROL               ((uint32_t)1u << 1)
295 #define ZX_SOCKET_HAS_ACCEPT                ((uint32_t)1u << 2)
296 #define ZX_SOCKET_CREATE_MASK               (ZX_SOCKET_DATAGRAM | ZX_SOCKET_HAS_CONTROL | ZX_SOCKET_HAS_ACCEPT)
297 
298 // These can be passed to zx_socket_read() and zx_socket_write().
299 #define ZX_SOCKET_CONTROL                   ((uint32_t)1u << 2)
300 
301 // Flags which can be used to to control cache policy for APIs which map memory.
302 #define ZX_CACHE_POLICY_CACHED              ((uint32_t)0u)
303 #define ZX_CACHE_POLICY_UNCACHED            ((uint32_t)1u)
304 #define ZX_CACHE_POLICY_UNCACHED_DEVICE     ((uint32_t)2u)
305 #define ZX_CACHE_POLICY_WRITE_COMBINING     ((uint32_t)3u)
306 #define ZX_CACHE_POLICY_MASK                ((uint32_t)3u)
307 
308 // Flag bits for zx_cache_flush.
309 #define ZX_CACHE_FLUSH_INSN         ((uint32_t)1u << 0)
310 #define ZX_CACHE_FLUSH_DATA         ((uint32_t)1u << 1)
311 #define ZX_CACHE_FLUSH_INVALIDATE   ((uint32_t)1u << 2)
312 
313 // Timer options.
314 #define ZX_TIMER_SLACK_CENTER       ((uint32_t)0u)
315 #define ZX_TIMER_SLACK_EARLY        ((uint32_t)1u)
316 #define ZX_TIMER_SLACK_LATE         ((uint32_t)2u)
317 
318 // Bus Transaction Initiator options.
319 #define ZX_BTI_PERM_READ          ((uint32_t)1u << 0)
320 #define ZX_BTI_PERM_WRITE         ((uint32_t)1u << 1)
321 #define ZX_BTI_PERM_EXECUTE       ((uint32_t)1u << 2)
322 #define ZX_BTI_COMPRESS           ((uint32_t)1u << 3)
323 #define ZX_BTI_CONTIGUOUS         ((uint32_t)1u << 4)
324 
325 typedef uint32_t zx_obj_type_t;
326 
327 #define ZX_OBJ_TYPE_NONE            ((zx_obj_type_t)0u)
328 #define ZX_OBJ_TYPE_PROCESS         ((zx_obj_type_t)1u)
329 #define ZX_OBJ_TYPE_THREAD          ((zx_obj_type_t)2u)
330 #define ZX_OBJ_TYPE_VMO             ((zx_obj_type_t)3u)
331 #define ZX_OBJ_TYPE_CHANNEL         ((zx_obj_type_t)4u)
332 #define ZX_OBJ_TYPE_EVENT           ((zx_obj_type_t)5u)
333 #define ZX_OBJ_TYPE_PORT            ((zx_obj_type_t)6u)
334 #define ZX_OBJ_TYPE_INTERRUPT       ((zx_obj_type_t)9u)
335 #define ZX_OBJ_TYPE_PCI_DEVICE      ((zx_obj_type_t)11u)
336 #define ZX_OBJ_TYPE_LOG             ((zx_obj_type_t)12u)
337 #define ZX_OBJ_TYPE_SOCKET          ((zx_obj_type_t)14u)
338 #define ZX_OBJ_TYPE_RESOURCE        ((zx_obj_type_t)15u)
339 #define ZX_OBJ_TYPE_EVENTPAIR       ((zx_obj_type_t)16u)
340 #define ZX_OBJ_TYPE_JOB             ((zx_obj_type_t)17u)
341 #define ZX_OBJ_TYPE_VMAR            ((zx_obj_type_t)18u)
342 #define ZX_OBJ_TYPE_FIFO            ((zx_obj_type_t)19u)
343 #define ZX_OBJ_TYPE_GUEST           ((zx_obj_type_t)20u)
344 #define ZX_OBJ_TYPE_VCPU            ((zx_obj_type_t)21u)
345 #define ZX_OBJ_TYPE_TIMER           ((zx_obj_type_t)22u)
346 #define ZX_OBJ_TYPE_IOMMU           ((zx_obj_type_t)23u)
347 #define ZX_OBJ_TYPE_BTI             ((zx_obj_type_t)24u)
348 #define ZX_OBJ_TYPE_PROFILE         ((zx_obj_type_t)25u)
349 #define ZX_OBJ_TYPE_PMT             ((zx_obj_type_t)26u)
350 #define ZX_OBJ_TYPE_SUSPEND_TOKEN   ((zx_obj_type_t)27u)
351 #define ZX_OBJ_TYPE_PAGER           ((zx_obj_type_t)28u)
352 #define ZX_OBJ_TYPE_LAST            ((zx_obj_type_t)29u)
353 
354 typedef struct zx_handle_info {
355     zx_handle_t handle;
356     zx_obj_type_t type;
357     zx_rights_t rights;
358     uint32_t unused;
359 } zx_handle_info_t;
360 
361 // The ZX_VM_FLAG_* constants are to be deprecated in favor of the ZX_VM_*
362 // versions.
363 #define ZX_VM_FLAG_PERM_READ              ((uint32_t)1u << 0)
364 #define ZX_VM_FLAG_PERM_WRITE             ((uint32_t)1u << 1)
365 #define ZX_VM_FLAG_PERM_EXECUTE           ((uint32_t)1u << 2)
366 #define ZX_VM_FLAG_COMPACT                ((uint32_t)1u << 3)
367 #define ZX_VM_FLAG_SPECIFIC               ((uint32_t)1u << 4)
368 #define ZX_VM_FLAG_SPECIFIC_OVERWRITE     ((uint32_t)1u << 5)
369 #define ZX_VM_FLAG_CAN_MAP_SPECIFIC       ((uint32_t)1u << 6)
370 #define ZX_VM_FLAG_CAN_MAP_READ           ((uint32_t)1u << 7)
371 #define ZX_VM_FLAG_CAN_MAP_WRITE          ((uint32_t)1u << 8)
372 #define ZX_VM_FLAG_CAN_MAP_EXECUTE        ((uint32_t)1u << 9)
373 #define ZX_VM_FLAG_MAP_RANGE              ((uint32_t)1u << 10)
374 #define ZX_VM_FLAG_REQUIRE_NON_RESIZABLE  ((uint32_t)1u << 11)
375 
376 #ifdef __cplusplus
377 // We cannot use <stdatomic.h> with C++ code as _Atomic qualifier defined by
378 // C11 is not valid in C++11. There is not a single standard name that can
379 // be used in both C and C++. C++ <atomic> defines names which are equivalent
380 // to those in <stdatomic.h>, but these are contained in the std namespace.
381 //
382 // In kernel, the only operation done is a user_copy (of sizeof(int)) inside a
383 // lock; otherwise the futex address is treated as a key.
384 typedef int zx_futex_t;
385 #else
386 #ifdef _KERNEL
387 typedef int zx_futex_t;
388 #else
389 typedef atomic_int zx_futex_t;
390 #endif
391 #endif
392 
393 __END_CDECLS
394 
395 #endif // ZIRCON_TYPES_H_
396