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_SYSCALLS_PORT_H_
6 #define ZIRCON_SYSCALLS_PORT_H_
7 
8 #include <zircon/compiler.h>
9 #include <zircon/types.h>
10 
11 __BEGIN_CDECLS
12 
13 // clang-format off
14 
15 // zx_object_wait_async() options
16 #define ZX_WAIT_ASYNC_ONCE          ((uint32_t)0u)
17 #define ZX_WAIT_ASYNC_REPEATING     ((uint32_t)1u)
18 
19 // packet types.  zx_port_packet_t::type
20 #define ZX_PKT_TYPE_USER            ((uint8_t)0x00u)
21 #define ZX_PKT_TYPE_SIGNAL_ONE      ((uint8_t)0x01u)
22 #define ZX_PKT_TYPE_SIGNAL_REP      ((uint8_t)0x02u)
23 #define ZX_PKT_TYPE_GUEST_BELL      ((uint8_t)0x03u)
24 #define ZX_PKT_TYPE_GUEST_MEM       ((uint8_t)0x04u)
25 #define ZX_PKT_TYPE_GUEST_IO        ((uint8_t)0x05u)
26 #define ZX_PKT_TYPE_GUEST_VCPU      ((uint8_t)0x06u)
27 #define ZX_PKT_TYPE_INTERRUPT       ((uint8_t)0x07u)
28 #define ZX_PKT_TYPE_EXCEPTION(n)    ((uint32_t)(0x08u | (((n) & 0xFFu) << 8)))
29 
30 // For options passed to port_create
31 #define ZX_PORT_BIND_TO_INTERRUPT   ((uint32_t)(0x1u << 0))
32 
33 #define ZX_PKT_TYPE_MASK            ((uint32_t)0x000000FFu)
34 
35 #define ZX_PKT_IS_USER(type)        ((type) == ZX_PKT_TYPE_USER)
36 #define ZX_PKT_IS_SIGNAL_ONE(type)  ((type) == ZX_PKT_TYPE_SIGNAL_ONE)
37 #define ZX_PKT_IS_SIGNAL_REP(type)  ((type) == ZX_PKT_TYPE_SIGNAL_REP)
38 #define ZX_PKT_IS_GUEST_BELL(type)  ((type) == ZX_PKT_TYPE_GUEST_BELL)
39 #define ZX_PKT_IS_GUEST_MEM(type)   ((type) == ZX_PKT_TYPE_GUEST_MEM)
40 #define ZX_PKT_IS_GUEST_IO(type)    ((type) == ZX_PKT_TYPE_GUEST_IO)
41 #define ZX_PKT_IS_GUEST_VCPU(type)  ((type) == ZX_PKT_TYPE_GUEST_VCPU)
42 #define ZX_PKT_IS_INTERRUPT(type)   ((type) == ZX_PKT_TYPE_INTERRUPT)
43 #define ZX_PKT_IS_EXCEPTION(type)   (((type) & ZX_PKT_TYPE_MASK) == ZX_PKT_TYPE_EXCEPTION(0))
44 
45 // zx_packet_guest_vcpu_t::type
46 #define ZX_PKT_GUEST_VCPU_INTERRUPT  ((uint8_t)0)
47 #define ZX_PKT_GUEST_VCPU_STARTUP    ((uint8_t)1)
48 // clang-format on
49 
50 // port_packet_t::type ZX_PKT_TYPE_USER.
51 typedef union zx_packet_user {
52     uint64_t u64[4];
53     uint32_t u32[8];
54     uint16_t u16[16];
55     uint8_t c8[32];
56 } zx_packet_user_t;
57 
58 // port_packet_t::type ZX_PKT_TYPE_SIGNAL_ONE and ZX_PKT_TYPE_SIGNAL_REP.
59 typedef struct zx_packet_signal {
60     zx_signals_t trigger;
61     zx_signals_t observed;
62     uint64_t count;
63     uint64_t reserved0;
64     uint64_t reserved1;
65 } zx_packet_signal_t;
66 
67 typedef struct zx_packet_exception {
68     uint64_t pid;
69     uint64_t tid;
70     uint64_t reserved0;
71     uint64_t reserved1;
72 } zx_packet_exception_t;
73 
74 typedef struct zx_packet_guest_bell {
75     zx_gpaddr_t addr;
76     uint64_t reserved0;
77     uint64_t reserved1;
78     uint64_t reserved2;
79 } zx_packet_guest_bell_t;
80 
81 typedef struct zx_packet_guest_mem {
82     zx_gpaddr_t addr;
83 #if __aarch64__
84     uint8_t access_size;
85     bool sign_extend;
86     uint8_t xt;
87     bool read;
88     uint64_t data;
89     uint64_t reserved;
90 #elif __x86_64__
91 // NOTE: x86 instructions are guaranteed to be 15 bytes or fewer.
92 #define X86_MAX_INST_LEN 15u
93     uint8_t inst_len;
94     uint8_t inst_buf[X86_MAX_INST_LEN];
95     uint8_t default_operand_size;
96     uint8_t reserved[7];
97 #endif
98 } zx_packet_guest_mem_t;
99 
100 typedef struct zx_packet_guest_io {
101     uint16_t port;
102     uint8_t access_size;
103     bool input;
104     union {
105         uint8_t u8;
106         uint16_t u16;
107         uint32_t u32;
108         uint8_t data[4];
109     };
110     uint64_t reserved0;
111     uint64_t reserved1;
112     uint64_t reserved2;
113 } zx_packet_guest_io_t;
114 
115 typedef struct zx_packet_guest_vcpu {
116     union {
117         struct {
118             uint64_t mask;
119             uint8_t vector;
120         } interrupt;
121         struct {
122             uint64_t id;
123             zx_gpaddr_t entry;
124         } startup;
125     };
126     uint8_t type;
127     uint64_t reserved;
128 } zx_packet_guest_vcpu_t;
129 
130 typedef struct zx_packet_interrupt {
131     zx_time_t timestamp;
132     uint64_t reserved0;
133     uint64_t reserved1;
134     uint64_t reserved2;
135 } zx_packet_interrupt_t;
136 
137 typedef struct zx_port_packet {
138     uint64_t key;
139     uint32_t type;
140     zx_status_t status;
141     union {
142         zx_packet_user_t user;
143         zx_packet_signal_t signal;
144         zx_packet_exception_t exception;
145         zx_packet_guest_bell_t guest_bell;
146         zx_packet_guest_mem_t guest_mem;
147         zx_packet_guest_io_t guest_io;
148         zx_packet_guest_vcpu_t guest_vcpu;
149         zx_packet_interrupt_t interrupt;
150     };
151 } zx_port_packet_t;
152 
153 __END_CDECLS
154 
155 #endif // ZIRCON_SYSCALLS_PORT_H_
156