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