Skip to main content

fuchsia_zircon_sys/
lib.rs

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#![allow(non_camel_case_types)]
6#![deny(warnings)]
7
8use std::{cmp, fmt};
9
10pub type zx_addr_t = usize;
11pub type zx_duration_t = u64;
12pub type zx_futex_t = i32;
13pub type zx_handle_t = u32;
14pub type zx_off_t = u64;
15pub type zx_paddr_t = usize;
16pub type zx_rights_t = u32;
17pub type zx_signals_t = u32;
18pub type zx_size_t = usize;
19pub type zx_ssize_t = isize;
20pub type zx_status_t = i32;
21pub type zx_time_t = u64;
22pub type zx_vaddr_t = usize;
23
24// TODO: combine these macros with the bitflags and assoc consts macros below
25// so that we only have to do one macro invocation.
26// The result would look something like:
27// multiconst!(bitflags, zx_rights_t, Rights, [RIGHT_NONE => ZX_RIGHT_NONE = 0; ...]);
28// multiconst!(assoc_consts, zx_status_t, Status, [OK => ZX_OK = 0; ...]);
29// Note that the actual name of the inner macro (e.g. `bitflags`) can't be a variable.
30// It'll just have to be matched on manually
31macro_rules! multiconst {
32    ($typename:ident, [$($rawname:ident = $value:expr;)*]) => {
33        $(
34            pub const $rawname: $typename = $value;
35        )*
36    }
37}
38
39multiconst!(zx_handle_t, [
40    ZX_HANDLE_INVALID = 0;
41]);
42
43multiconst!(zx_time_t, [
44    ZX_TIME_INFINITE = ::std::u64::MAX;
45]);
46
47multiconst!(zx_rights_t, [
48    ZX_RIGHT_NONE         = 0;
49    ZX_RIGHT_DUPLICATE    = 1 << 0;
50    ZX_RIGHT_TRANSFER     = 1 << 1;
51    ZX_RIGHT_READ         = 1 << 2;
52    ZX_RIGHT_WRITE        = 1 << 3;
53    ZX_RIGHT_EXECUTE      = 1 << 4;
54    ZX_RIGHT_MAP          = 1 << 5;
55    ZX_RIGHT_GET_PROPERTY = 1 << 6;
56    ZX_RIGHT_SET_PROPERTY = 1 << 7;
57    ZX_RIGHT_ENUMERATE    = 1 << 8;
58    ZX_RIGHT_DESTROY      = 1 << 9;
59    ZX_RIGHT_SET_POLICY   = 1 << 10;
60    ZX_RIGHT_GET_POLICY   = 1 << 11;
61    ZX_RIGHT_SIGNAL       = 1 << 12;
62    ZX_RIGHT_SIGNAL_PEER  = 1 << 13;
63    ZX_RIGHT_WAIT         = 0 << 14; // Coming Soon!
64    ZX_RIGHT_SAME_RIGHTS  = 1 << 31;
65]);
66
67// TODO: add an alias for this type in the C headers.
68multiconst!(u32, [
69    ZX_VMO_OP_COMMIT = 1;
70    ZX_VMO_OP_DECOMMIT = 2;
71    ZX_VMO_OP_LOCK = 3;
72    ZX_VMO_OP_UNLOCK = 4;
73    ZX_VMO_OP_LOOKUP = 5;
74    ZX_VMO_OP_CACHE_SYNC = 6;
75    ZX_VMO_OP_CACHE_INVALIDATE = 7;
76    ZX_VMO_OP_CACHE_CLEAN = 8;
77    ZX_VMO_OP_CACHE_CLEAN_INVALIDATE = 9;
78]);
79
80// TODO: add an alias for this type in the C headers.
81multiconst!(u32, [
82    ZX_VM_FLAG_PERM_READ          = 1  << 0;
83    ZX_VM_FLAG_PERM_WRITE         = 1  << 1;
84    ZX_VM_FLAG_PERM_EXECUTE       = 1  << 2;
85    ZX_VM_FLAG_COMPACT            = 1  << 3;
86    ZX_VM_FLAG_SPECIFIC           = 1  << 4;
87    ZX_VM_FLAG_SPECIFIC_OVERWRITE = 1  << 5;
88    ZX_VM_FLAG_CAN_MAP_SPECIFIC   = 1  << 6;
89    ZX_VM_FLAG_CAN_MAP_READ       = 1  << 7;
90    ZX_VM_FLAG_CAN_MAP_WRITE      = 1  << 8;
91    ZX_VM_FLAG_CAN_MAP_EXECUTE    = 1  << 9;
92]);
93
94multiconst!(zx_status_t, [
95    ZX_OK                    = 0;
96    ZX_ERR_INTERNAL          = -1;
97    ZX_ERR_NOT_SUPPORTED     = -2;
98    ZX_ERR_NO_RESOURCES      = -3;
99    ZX_ERR_NO_MEMORY         = -4;
100    ZX_ERR_CALL_FAILED       = -5;
101    ZX_ERR_INTERRUPTED_RETRY = -6;
102    ZX_ERR_INVALID_ARGS      = -10;
103    ZX_ERR_BAD_HANDLE        = -11;
104    ZX_ERR_WRONG_TYPE        = -12;
105    ZX_ERR_BAD_SYSCALL       = -13;
106    ZX_ERR_OUT_OF_RANGE      = -14;
107    ZX_ERR_BUFFER_TOO_SMALL  = -15;
108    ZX_ERR_BAD_STATE         = -20;
109    ZX_ERR_TIMED_OUT         = -21;
110    ZX_ERR_SHOULD_WAIT       = -22;
111    ZX_ERR_CANCELED          = -23;
112    ZX_ERR_PEER_CLOSED       = -24;
113    ZX_ERR_NOT_FOUND         = -25;
114    ZX_ERR_ALREADY_EXISTS    = -26;
115    ZX_ERR_ALREADY_BOUND     = -27;
116    ZX_ERR_UNAVAILABLE       = -28;
117    ZX_ERR_ACCESS_DENIED     = -30;
118    ZX_ERR_IO                = -40;
119    ZX_ERR_IO_REFUSED        = -41;
120    ZX_ERR_IO_DATA_INTEGRITY = -42;
121    ZX_ERR_IO_DATA_LOSS      = -43;
122    ZX_ERR_BAD_PATH          = -50;
123    ZX_ERR_NOT_DIR           = -51;
124    ZX_ERR_NOT_FILE          = -52;
125    ZX_ERR_FILE_BIG          = -53;
126    ZX_ERR_NO_SPACE          = -54;
127    ZX_ERR_STOP              = -60;
128    ZX_ERR_NEXT              = -61;
129]);
130
131multiconst!(zx_signals_t, [
132    ZX_SIGNAL_NONE              = 0;
133    ZX_OBJECT_SIGNAL_ALL        = 0x00ffffff;
134    ZX_USER_SIGNAL_ALL          = 0xff000000;
135    ZX_OBJECT_SIGNAL_0          = 1 << 0;
136    ZX_OBJECT_SIGNAL_1          = 1 << 1;
137    ZX_OBJECT_SIGNAL_2          = 1 << 2;
138    ZX_OBJECT_SIGNAL_3          = 1 << 3;
139    ZX_OBJECT_SIGNAL_4          = 1 << 4;
140    ZX_OBJECT_SIGNAL_5          = 1 << 5;
141    ZX_OBJECT_SIGNAL_6          = 1 << 6;
142    ZX_OBJECT_SIGNAL_7          = 1 << 7;
143    ZX_OBJECT_SIGNAL_8          = 1 << 8;
144    ZX_OBJECT_SIGNAL_9          = 1 << 9;
145    ZX_OBJECT_SIGNAL_10         = 1 << 10;
146    ZX_OBJECT_SIGNAL_11         = 1 << 11;
147    ZX_OBJECT_SIGNAL_12         = 1 << 12;
148    ZX_OBJECT_SIGNAL_13         = 1 << 13;
149    ZX_OBJECT_SIGNAL_14         = 1 << 14;
150    ZX_OBJECT_SIGNAL_15         = 1 << 15;
151    ZX_OBJECT_SIGNAL_16         = 1 << 16;
152    ZX_OBJECT_SIGNAL_17         = 1 << 17;
153    ZX_OBJECT_SIGNAL_18         = 1 << 18;
154    ZX_OBJECT_SIGNAL_19         = 1 << 19;
155    ZX_OBJECT_SIGNAL_20         = 1 << 20;
156    ZX_OBJECT_SIGNAL_21         = 1 << 21;
157    ZX_OBJECT_SIGNAL_22         = 1 << 22;
158    ZX_OBJECT_HANDLE_CLOSED     = 1 << 23;
159    ZX_USER_SIGNAL_0            = 1 << 24;
160    ZX_USER_SIGNAL_1            = 1 << 25;
161    ZX_USER_SIGNAL_2            = 1 << 26;
162    ZX_USER_SIGNAL_3            = 1 << 27;
163    ZX_USER_SIGNAL_4            = 1 << 28;
164    ZX_USER_SIGNAL_5            = 1 << 29;
165    ZX_USER_SIGNAL_6            = 1 << 30;
166    ZX_USER_SIGNAL_7            = 1 << 31;
167
168    ZX_OBJECT_READABLE          = ZX_OBJECT_SIGNAL_0;
169    ZX_OBJECT_WRITABLE          = ZX_OBJECT_SIGNAL_1;
170    ZX_OBJECT_PEER_CLOSED       = ZX_OBJECT_SIGNAL_2;
171
172    // Cancelation (handle was closed while waiting with it)
173    ZX_SIGNAL_HANDLE_CLOSED     = ZX_OBJECT_HANDLE_CLOSED;
174
175    // Event
176    ZX_EVENT_SIGNALED           = ZX_OBJECT_SIGNAL_3;
177
178    // EventPair
179    ZX_EPAIR_SIGNALED           = ZX_OBJECT_SIGNAL_3;
180    ZX_EPAIR_CLOSED             = ZX_OBJECT_SIGNAL_2;
181
182    // Task signals (process, thread, job)
183    ZX_TASK_TERMINATED          = ZX_OBJECT_SIGNAL_3;
184
185    // Channel
186    ZX_CHANNEL_READABLE         = ZX_OBJECT_SIGNAL_0;
187    ZX_CHANNEL_WRITABLE         = ZX_OBJECT_SIGNAL_1;
188    ZX_CHANNEL_PEER_CLOSED      = ZX_OBJECT_SIGNAL_2;
189
190    // Socket
191    ZX_SOCKET_READABLE          = ZX_OBJECT_SIGNAL_0;
192    ZX_SOCKET_WRITABLE          = ZX_OBJECT_SIGNAL_1;
193    ZX_SOCKET_PEER_CLOSED       = ZX_OBJECT_SIGNAL_2;
194
195    // Port
196    ZX_PORT_READABLE            = ZX_OBJECT_READABLE;
197
198    // Resource
199    ZX_RESOURCE_DESTROYED       = ZX_OBJECT_SIGNAL_3;
200    ZX_RESOURCE_READABLE        = ZX_OBJECT_READABLE;
201    ZX_RESOURCE_WRITABLE        = ZX_OBJECT_WRITABLE;
202    ZX_RESOURCE_CHILD_ADDED     = ZX_OBJECT_SIGNAL_4;
203
204    // Fifo
205    ZX_FIFO_READABLE            = ZX_OBJECT_READABLE;
206    ZX_FIFO_WRITABLE            = ZX_OBJECT_WRITABLE;
207    ZX_FIFO_PEER_CLOSED         = ZX_OBJECT_PEER_CLOSED;
208
209    // Job
210    ZX_JOB_NO_PROCESSES         = ZX_OBJECT_SIGNAL_3;
211    ZX_JOB_NO_JOBS              = ZX_OBJECT_SIGNAL_4;
212
213    // Process
214    ZX_PROCESS_TERMINATED       = ZX_OBJECT_SIGNAL_3;
215
216    // Thread
217    ZX_THREAD_TERMINATED        = ZX_OBJECT_SIGNAL_3;
218
219    // Log
220    ZX_LOG_READABLE             = ZX_OBJECT_READABLE;
221    ZX_LOG_WRITABLE             = ZX_OBJECT_WRITABLE;
222
223    // Timer
224    ZX_TIMER_SIGNALED           = ZX_OBJECT_SIGNAL_3;
225]);
226
227// clock ids
228pub const ZX_CLOCK_MONOTONIC: u32 = 0;
229
230// Buffer size limits on the cprng syscalls
231pub const ZX_CPRNG_DRAW_MAX_LEN: usize = 256;
232pub const ZX_CPRNG_ADD_ENTROPY_MAX_LEN: usize = 256;
233
234// Socket flags and limits.
235pub const ZX_SOCKET_HALF_CLOSE: u32 = 1;
236
237// VM Object clone flags
238pub const ZX_VMO_CLONE_COPY_ON_WRITE: u32 = 1;
239
240#[repr(C)]
241#[derive(Debug, Copy, Clone, Eq, PartialEq)]
242pub enum zx_cache_policy_t {
243    ZX_CACHE_POLICY_CACHED = 0,
244    ZX_CACHE_POLICY_UNCACHED = 1,
245    ZX_CACHE_POLICY_UNCACHED_DEVICE = 2,
246    ZX_CACHE_POLICY_WRITE_COMBINING = 3,
247}
248
249#[repr(C)]
250#[derive(Debug, Copy, Clone, Eq, PartialEq)]
251pub struct zx_wait_item_t {
252    pub handle: zx_handle_t,
253    pub waitfor: zx_signals_t,
254    pub pending: zx_signals_t,
255}
256
257#[repr(C)]
258#[derive(Debug, Copy, Clone, Eq, PartialEq)]
259pub struct zx_waitset_result_t {
260    pub cookie: u64,
261    pub status: zx_status_t,
262    pub observed: zx_signals_t,
263}
264
265#[repr(C)]
266#[derive(Debug, Copy, Clone, Eq, PartialEq)]
267pub struct zx_channel_call_args_t {
268    pub wr_bytes: *const u8,
269    pub wr_handles: *const zx_handle_t,
270    pub rd_bytes: *mut u8,
271    pub rd_handles: *mut zx_handle_t,
272    pub wr_num_bytes: u32,
273    pub wr_num_handles: u32,
274    pub rd_num_bytes: u32,
275    pub rd_num_handles: u32,
276}
277
278pub type zx_pci_irq_swizzle_lut_t = [[[u32; 4]; 8]; 32];
279
280#[repr(C)]
281#[derive(Debug, Copy, Clone, Eq, PartialEq)]
282pub struct zx_pci_init_arg_t {
283    pub dev_pin_to_global_irq: zx_pci_irq_swizzle_lut_t,
284    pub num_irqs: u32,
285    pub irqs: [zx_irq_t; 32],
286    pub ecam_window_count: u32,
287    // Note: the ecam_windows field is actually a variable size array.
288    // We use a fixed size array to match the C repr.
289    pub ecam_windows: [zx_ecam_window_t; 1],
290}
291
292#[repr(C)]
293#[derive(Debug, Copy, Clone, Eq, PartialEq)]
294pub struct zx_irq_t {
295    pub global_irq: u32,
296    pub level_triggered: bool,
297    pub active_high: bool,
298}
299
300#[repr(C)]
301#[derive(Debug, Copy, Clone, Eq, PartialEq)]
302pub struct zx_ecam_window_t {
303    pub base: u64,
304    pub size: usize,
305    pub bus_start: u8,
306    pub bus_end: u8,
307}
308
309#[repr(C)]
310#[derive(Debug, Copy, Clone, Eq, PartialEq)]
311pub struct zx_pcie_device_info_t {
312    pub vendor_id: u16,
313    pub device_id: u16,
314    pub base_class: u8,
315    pub sub_class: u8,
316    pub program_interface: u8,
317    pub revision_id: u8,
318    pub bus_id: u8,
319    pub dev_id: u8,
320    pub func_id: u8,
321}
322
323#[repr(C)]
324#[derive(Debug, Copy, Clone, Eq, PartialEq)]
325pub struct zx_pci_resource_t {
326    pub type_: u32,
327    pub size: usize,
328    // TODO: Actually a union
329    pub pio_addr: usize,
330}
331
332// TODO: Actually a union
333pub type zx_rrec_t = [u8; 64];
334
335// Ports V2
336#[repr(u32)]
337#[derive(Debug, Copy, Clone, Eq, PartialEq)]
338pub enum zx_packet_type_t {
339    ZX_PKT_TYPE_USER = 0,
340    ZX_PKT_TYPE_SIGNAL_ONE = 1,
341    ZX_PKT_TYPE_SIGNAL_REP = 2,
342}
343
344impl Default for zx_packet_type_t {
345    fn default() -> Self {
346        zx_packet_type_t::ZX_PKT_TYPE_USER
347    }
348}
349
350#[repr(C)]
351#[derive(Debug, Copy, Clone)]
352pub struct zx_packet_signal_t {
353    pub trigger: zx_signals_t,
354    pub observed: zx_signals_t,
355    pub count: u64,
356}
357
358pub const ZX_WAIT_ASYNC_ONCE: u32 = 0;
359pub const ZX_WAIT_ASYNC_REPEATING: u32 = 1;
360
361// Actually a union of different integer types, but this should be good enough.
362pub type zx_packet_user_t = [u8; 32];
363
364#[repr(C)]
365#[derive(Debug, Default, Copy, Clone, Eq, PartialEq)]
366pub struct zx_port_packet_t {
367    pub key: u64,
368    pub packet_type: zx_packet_type_t,
369    pub status: i32,
370    pub union: [u8; 32],
371}
372
373#[repr(C)]
374#[derive(Debug, Copy, Clone, Eq, PartialEq)]
375pub struct zx_guest_io_t {
376    port: u16,
377    access_size: u8,
378    input: bool,
379    // TODO: Actually a union
380    data: [u8; 4],
381}
382
383#[cfg(target_arch="aarch64")]
384#[repr(C)]
385#[derive(Debug, Copy, Clone, Eq, PartialEq)]
386pub struct zx_guest_memory_t {
387    addr: zx_vaddr_t,
388    inst: u32,
389}
390
391pub const X86_MAX_INST_LEN: usize = 15;
392
393#[cfg(target_arch="x86_64")]
394#[repr(C)]
395#[derive(Debug, Copy, Clone, Eq, PartialEq)]
396pub struct zx_guest_memory_t {
397    addr: zx_vaddr_t,
398    inst_len: u8,
399    inst_buf: [u8; X86_MAX_INST_LEN],
400}
401
402#[repr(u8)]
403#[derive(Debug, Copy, Clone, Eq, PartialEq)]
404pub enum zx_guest_packet_t_type {
405    ZX_GUEST_PKT_MEMORY = 1,
406    ZX_GUEST_PKT_IO = 2,
407}
408
409#[repr(C)]
410#[derive(Copy, Clone)]
411pub union zx_guest_packet_t_union {
412    // ZX_GUEST_PKT_MEMORY
413    memory: zx_guest_memory_t,
414    // ZX_GUEST_PKT_IO
415    io: zx_guest_io_t,
416}
417
418// Note: values of this type must maintain the invariant that
419// `packet_type` correctly indicates the type of `contents`.
420// Failure to do so will result in unsafety.
421#[repr(C)]
422#[derive(Copy, Clone)]
423pub struct zx_guest_packet_t {
424    packet_type: zx_guest_packet_t_type,
425    contents: zx_guest_packet_t_union,
426}
427
428impl fmt::Debug for zx_guest_packet_t {
429    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
430        write!(f, "zx_guest_packet_t {{ packet_type: {:?}, contents: ", self.packet_type)?;
431        match self.packet_type {
432            zx_guest_packet_t_type::ZX_GUEST_PKT_MEMORY =>
433                write!(f, "zx_guest_packet_t_union {{ memory: {:?} }} }}",
434                    unsafe { self.contents.memory }
435                ),
436            zx_guest_packet_t_type::ZX_GUEST_PKT_IO =>
437                write!(f, "zx_guest_packet_t_union {{ io: {:?} }} }}",
438                    unsafe { self.contents.io }
439                ),
440        }
441    }
442}
443
444impl cmp::PartialEq for zx_guest_packet_t {
445    fn eq(&self, other: &Self) -> bool {
446        (self.packet_type == other.packet_type) &&
447        match self.packet_type {
448            zx_guest_packet_t_type::ZX_GUEST_PKT_MEMORY =>
449                unsafe { self.contents.memory == other.contents.memory },
450            zx_guest_packet_t_type::ZX_GUEST_PKT_IO =>
451                unsafe { self.contents.io == other.contents.io },
452        }
453    }
454}
455
456impl cmp::Eq for zx_guest_packet_t {}
457
458#[cfg(target_arch="x86_64")]
459#[repr(C)]
460#[derive(Debug, Copy, Clone, Eq, PartialEq)]
461pub struct zx_vcpu_create_args_t {
462    pub ip: zx_vaddr_t,
463    pub cr3: zx_vaddr_t,
464    pub apic_vmo: zx_handle_t,
465}
466
467#[cfg(not(target_arch="x86_64"))]
468#[repr(C)]
469#[derive(Debug, Copy, Clone, Eq, PartialEq)]
470pub struct zx_vcpu_create_args_t {
471    pub ip: zx_vaddr_t,
472}
473
474include!("definitions.rs");