Coverage Report

Created: 2017-10-25 09:10

/root/src/xen/xen/include/public/physdev.h
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Permission is hereby granted, free of charge, to any person obtaining a copy
3
 * of this software and associated documentation files (the "Software"), to
4
 * deal in the Software without restriction, including without limitation the
5
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
6
 * sell copies of the Software, and to permit persons to whom the Software is
7
 * furnished to do so, subject to the following conditions:
8
 *
9
 * The above copyright notice and this permission notice shall be included in
10
 * all copies or substantial portions of the Software.
11
 *
12
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
17
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
18
 * DEALINGS IN THE SOFTWARE.
19
 *
20
 * Copyright (c) 2006, Keir Fraser
21
 */
22
23
#ifndef __XEN_PUBLIC_PHYSDEV_H__
24
#define __XEN_PUBLIC_PHYSDEV_H__
25
26
#include "xen.h"
27
28
/*
29
 * Prototype for this hypercall is:
30
 *  int physdev_op(int cmd, void *args)
31
 * @cmd  == PHYSDEVOP_??? (physdev operation).
32
 * @args == Operation-specific extra arguments (NULL if none).
33
 */
34
35
/*
36
 * Notify end-of-interrupt (EOI) for the specified IRQ.
37
 * @arg == pointer to physdev_eoi structure.
38
 */
39
69
#define PHYSDEVOP_eoi                   12
40
struct physdev_eoi {
41
    /* IN */
42
    uint32_t irq;
43
};
44
typedef struct physdev_eoi physdev_eoi_t;
45
DEFINE_XEN_GUEST_HANDLE(physdev_eoi_t);
46
47
/*
48
 * Register a shared page for the hypervisor to indicate whether the guest
49
 * must issue PHYSDEVOP_eoi. The semantics of PHYSDEVOP_eoi change slightly
50
 * once the guest used this function in that the associated event channel
51
 * will automatically get unmasked. The page registered is used as a bit
52
 * array indexed by Xen's PIRQ value.
53
 */
54
0
#define PHYSDEVOP_pirq_eoi_gmfn_v1       17
55
/*
56
 * Register a shared page for the hypervisor to indicate whether the
57
 * guest must issue PHYSDEVOP_eoi. This hypercall is very similar to
58
 * PHYSDEVOP_pirq_eoi_gmfn_v1 but it doesn't change the semantics of
59
 * PHYSDEVOP_eoi. The page registered is used as a bit array indexed by
60
 * Xen's PIRQ value.
61
 */
62
0
#define PHYSDEVOP_pirq_eoi_gmfn_v2       28
63
struct physdev_pirq_eoi_gmfn {
64
    /* IN */
65
    xen_pfn_t gmfn;
66
};
67
typedef struct physdev_pirq_eoi_gmfn physdev_pirq_eoi_gmfn_t;
68
DEFINE_XEN_GUEST_HANDLE(physdev_pirq_eoi_gmfn_t);
69
70
/*
71
 * Query the status of an IRQ line.
72
 * @arg == pointer to physdev_irq_status_query structure.
73
 */
74
69
#define PHYSDEVOP_irq_status_query       5
75
struct physdev_irq_status_query {
76
    /* IN */
77
    uint32_t irq;
78
    /* OUT */
79
    uint32_t flags; /* XENIRQSTAT_* */
80
};
81
typedef struct physdev_irq_status_query physdev_irq_status_query_t;
82
DEFINE_XEN_GUEST_HANDLE(physdev_irq_status_query_t);
83
84
/* Need to call PHYSDEVOP_eoi when the IRQ has been serviced? */
85
0
#define _XENIRQSTAT_needs_eoi   (0)
86
0
#define  XENIRQSTAT_needs_eoi   (1U<<_XENIRQSTAT_needs_eoi)
87
88
/* IRQ shared by multiple guests? */
89
0
#define _XENIRQSTAT_shared      (1)
90
0
#define  XENIRQSTAT_shared      (1U<<_XENIRQSTAT_shared)
91
92
/*
93
 * Set the current VCPU's I/O privilege level.
94
 * @arg == pointer to physdev_set_iopl structure.
95
 */
96
0
#define PHYSDEVOP_set_iopl               6
97
struct physdev_set_iopl {
98
    /* IN */
99
    uint32_t iopl;
100
};
101
typedef struct physdev_set_iopl physdev_set_iopl_t;
102
DEFINE_XEN_GUEST_HANDLE(physdev_set_iopl_t);
103
104
/*
105
 * Set the current VCPU's I/O-port permissions bitmap.
106
 * @arg == pointer to physdev_set_iobitmap structure.
107
 */
108
0
#define PHYSDEVOP_set_iobitmap           7
109
struct physdev_set_iobitmap {
110
    /* IN */
111
#if __XEN_INTERFACE_VERSION__ >= 0x00030205
112
    XEN_GUEST_HANDLE(uint8) bitmap;
113
#else
114
    uint8_t *bitmap;
115
#endif
116
    uint32_t nr_ports;
117
};
118
typedef struct physdev_set_iobitmap physdev_set_iobitmap_t;
119
DEFINE_XEN_GUEST_HANDLE(physdev_set_iobitmap_t);
120
121
/*
122
 * Read or write an IO-APIC register.
123
 * @arg == pointer to physdev_apic structure.
124
 */
125
0
#define PHYSDEVOP_apic_read              8
126
0
#define PHYSDEVOP_apic_write             9
127
struct physdev_apic {
128
    /* IN */
129
    unsigned long apic_physbase;
130
    uint32_t reg;
131
    /* IN or OUT */
132
    uint32_t value;
133
};
134
typedef struct physdev_apic physdev_apic_t;
135
DEFINE_XEN_GUEST_HANDLE(physdev_apic_t);
136
137
/*
138
 * Allocate or free a physical upcall vector for the specified IRQ line.
139
 * @arg == pointer to physdev_irq structure.
140
 */
141
0
#define PHYSDEVOP_alloc_irq_vector      10
142
#define PHYSDEVOP_free_irq_vector       11
143
struct physdev_irq {
144
    /* IN */
145
    uint32_t irq;
146
    /* IN or OUT */
147
    uint32_t vector;
148
};
149
typedef struct physdev_irq physdev_irq_t;
150
DEFINE_XEN_GUEST_HANDLE(physdev_irq_t);
151
 
152
162
#define MAP_PIRQ_TYPE_MSI               0x0
153
48
#define MAP_PIRQ_TYPE_GSI               0x1
154
#define MAP_PIRQ_TYPE_UNKNOWN           0x2
155
0
#define MAP_PIRQ_TYPE_MSI_SEG           0x3
156
102
#define MAP_PIRQ_TYPE_MULTI_MSI         0x4
157
158
69
#define PHYSDEVOP_map_pirq               13
159
struct physdev_map_pirq {
160
    domid_t domid;
161
    /* IN */
162
    int type;
163
    /* IN (ignored for ..._MULTI_MSI) */
164
    int index;
165
    /* IN or OUT */
166
    int pirq;
167
    /* IN - high 16 bits hold segment for ..._MSI_SEG and ..._MULTI_MSI */
168
    int bus;
169
    /* IN */
170
    int devfn;
171
    /* IN (also OUT for ..._MULTI_MSI) */
172
    int entry_nr;
173
    /* IN */
174
    uint64_t table_base;
175
};
176
typedef struct physdev_map_pirq physdev_map_pirq_t;
177
DEFINE_XEN_GUEST_HANDLE(physdev_map_pirq_t);
178
179
69
#define PHYSDEVOP_unmap_pirq             14
180
struct physdev_unmap_pirq {
181
    domid_t domid;
182
    /* IN */
183
    int pirq;
184
};
185
186
typedef struct physdev_unmap_pirq physdev_unmap_pirq_t;
187
DEFINE_XEN_GUEST_HANDLE(physdev_unmap_pirq_t);
188
189
0
#define PHYSDEVOP_manage_pci_add         15
190
0
#define PHYSDEVOP_manage_pci_remove      16
191
struct physdev_manage_pci {
192
    /* IN */
193
    uint8_t bus;
194
    uint8_t devfn;
195
}; 
196
197
typedef struct physdev_manage_pci physdev_manage_pci_t;
198
DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_t);
199
200
0
#define PHYSDEVOP_restore_msi            19
201
struct physdev_restore_msi {
202
    /* IN */
203
    uint8_t bus;
204
    uint8_t devfn;
205
};
206
typedef struct physdev_restore_msi physdev_restore_msi_t;
207
DEFINE_XEN_GUEST_HANDLE(physdev_restore_msi_t);
208
209
0
#define PHYSDEVOP_manage_pci_add_ext     20
210
struct physdev_manage_pci_ext {
211
    /* IN */
212
    uint8_t bus;
213
    uint8_t devfn;
214
    unsigned is_extfn;
215
    unsigned is_virtfn;
216
    struct {
217
        uint8_t bus;
218
        uint8_t devfn;
219
    } physfn;
220
};
221
222
typedef struct physdev_manage_pci_ext physdev_manage_pci_ext_t;
223
DEFINE_XEN_GUEST_HANDLE(physdev_manage_pci_ext_t);
224
225
/*
226
 * Argument to physdev_op_compat() hypercall. Superceded by new physdev_op()
227
 * hypercall since 0x00030202.
228
 */
229
struct physdev_op {
230
    uint32_t cmd;
231
    union {
232
        struct physdev_irq_status_query      irq_status_query;
233
        struct physdev_set_iopl              set_iopl;
234
        struct physdev_set_iobitmap          set_iobitmap;
235
        struct physdev_apic                  apic_op;
236
        struct physdev_irq                   irq_op;
237
    } u;
238
};
239
typedef struct physdev_op physdev_op_t;
240
DEFINE_XEN_GUEST_HANDLE(physdev_op_t);
241
242
0
#define PHYSDEVOP_setup_gsi    21
243
struct physdev_setup_gsi {
244
    int gsi;
245
    /* IN */
246
    uint8_t triggering;
247
    /* IN */
248
    uint8_t polarity;
249
    /* IN */
250
};
251
252
typedef struct physdev_setup_gsi physdev_setup_gsi_t;
253
DEFINE_XEN_GUEST_HANDLE(physdev_setup_gsi_t);
254
255
/* leave PHYSDEVOP 22 free */
256
257
/* type is MAP_PIRQ_TYPE_GSI or MAP_PIRQ_TYPE_MSI
258
 * the hypercall returns a free pirq */
259
69
#define PHYSDEVOP_get_free_pirq    23
260
struct physdev_get_free_pirq {
261
    /* IN */ 
262
    int type;
263
    /* OUT */
264
    uint32_t pirq;
265
};
266
267
typedef struct physdev_get_free_pirq physdev_get_free_pirq_t;
268
DEFINE_XEN_GUEST_HANDLE(physdev_get_free_pirq_t);
269
270
0
#define XEN_PCI_MMCFG_RESERVED         0x1
271
272
0
#define PHYSDEVOP_pci_mmcfg_reserved    24
273
struct physdev_pci_mmcfg_reserved {
274
    uint64_t address;
275
    uint16_t segment;
276
    uint8_t start_bus;
277
    uint8_t end_bus;
278
    uint32_t flags;
279
};
280
typedef struct physdev_pci_mmcfg_reserved physdev_pci_mmcfg_reserved_t;
281
DEFINE_XEN_GUEST_HANDLE(physdev_pci_mmcfg_reserved_t);
282
283
0
#define XEN_PCI_DEV_EXTFN              0x1
284
0
#define XEN_PCI_DEV_VIRTFN             0x2
285
0
#define XEN_PCI_DEV_PXM                0x4
286
287
0
#define PHYSDEVOP_pci_device_add        25
288
struct physdev_pci_device_add {
289
    /* IN */
290
    uint16_t seg;
291
    uint8_t bus;
292
    uint8_t devfn;
293
    uint32_t flags;
294
    struct {
295
        uint8_t bus;
296
        uint8_t devfn;
297
    } physfn;
298
    /*
299
     * Optional parameters array.
300
     * First element ([0]) is PXM domain associated with the device (if
301
     * XEN_PCI_DEV_PXM is set)
302
     */
303
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
304
    uint32_t optarr[];
305
#elif defined(__GNUC__)
306
    uint32_t optarr[0];
307
#endif
308
};
309
typedef struct physdev_pci_device_add physdev_pci_device_add_t;
310
DEFINE_XEN_GUEST_HANDLE(physdev_pci_device_add_t);
311
312
0
#define PHYSDEVOP_pci_device_remove     26
313
0
#define PHYSDEVOP_restore_msi_ext       27
314
/*
315
 * Dom0 should use these two to announce MMIO resources assigned to
316
 * MSI-X capable devices won't (prepare) or may (release) change.
317
 */
318
0
#define PHYSDEVOP_prepare_msix          30
319
0
#define PHYSDEVOP_release_msix          31
320
struct physdev_pci_device {
321
    /* IN */
322
    uint16_t seg;
323
    uint8_t bus;
324
    uint8_t devfn;
325
};
326
typedef struct physdev_pci_device physdev_pci_device_t;
327
DEFINE_XEN_GUEST_HANDLE(physdev_pci_device_t);
328
329
0
#define PHYSDEVOP_DBGP_RESET_PREPARE    1
330
0
#define PHYSDEVOP_DBGP_RESET_DONE       2
331
332
0
#define PHYSDEVOP_DBGP_BUS_UNKNOWN      0
333
0
#define PHYSDEVOP_DBGP_BUS_PCI          1
334
335
0
#define PHYSDEVOP_dbgp_op               29
336
struct physdev_dbgp_op {
337
    /* IN */
338
    uint8_t op;
339
    uint8_t bus;
340
    union {
341
        struct physdev_pci_device pci;
342
    } u;
343
};
344
typedef struct physdev_dbgp_op physdev_dbgp_op_t;
345
DEFINE_XEN_GUEST_HANDLE(physdev_dbgp_op_t);
346
347
/*
348
 * Notify that some PIRQ-bound event channels have been unmasked.
349
 * ** This command is obsolete since interface version 0x00030202 and is **
350
 * ** unsupported by newer versions of Xen.                              **
351
 */
352
0
#define PHYSDEVOP_IRQ_UNMASK_NOTIFY      4
353
354
#if __XEN_INTERFACE_VERSION__ < 0x00040600
355
/*
356
 * These all-capitals physdev operation names are superceded by the new names
357
 * (defined above) since interface version 0x00030202. The guard above was
358
 * added post-4.5 only though and hence shouldn't check for 0x00030202.
359
 */
360
#define PHYSDEVOP_IRQ_STATUS_QUERY       PHYSDEVOP_irq_status_query
361
#define PHYSDEVOP_SET_IOPL               PHYSDEVOP_set_iopl
362
#define PHYSDEVOP_SET_IOBITMAP           PHYSDEVOP_set_iobitmap
363
#define PHYSDEVOP_APIC_READ              PHYSDEVOP_apic_read
364
#define PHYSDEVOP_APIC_WRITE             PHYSDEVOP_apic_write
365
#define PHYSDEVOP_ASSIGN_VECTOR          PHYSDEVOP_alloc_irq_vector
366
#define PHYSDEVOP_FREE_VECTOR            PHYSDEVOP_free_irq_vector
367
#define PHYSDEVOP_IRQ_NEEDS_UNMASK_NOTIFY XENIRQSTAT_needs_eoi
368
#define PHYSDEVOP_IRQ_SHARED             XENIRQSTAT_shared
369
#endif
370
371
#if __XEN_INTERFACE_VERSION__ < 0x00040200
372
#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v1
373
#else
374
#define PHYSDEVOP_pirq_eoi_gmfn PHYSDEVOP_pirq_eoi_gmfn_v2
375
#endif
376
377
#endif /* __XEN_PUBLIC_PHYSDEV_H__ */
378
379
/*
380
 * Local variables:
381
 * mode: C
382
 * c-file-style: "BSD"
383
 * c-basic-offset: 4
384
 * tab-width: 4
385
 * indent-tabs-mode: nil
386
 * End:
387
 */