1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
| /* SPDX-License-Identifier: GPL-2.0 */
| /* Simple wrappers around HVM functions */
| #ifndef XEN_HVM_H__
| #define XEN_HVM_H__
|
| #include <xen/interface/hvm/params.h>
| #include <asm/xen/hypercall.h>
|
| static const char *param_name(int op)
| {
| #define PARAM(x) [HVM_PARAM_##x] = #x
| static const char *const names[] = {
| PARAM(CALLBACK_IRQ),
| PARAM(STORE_PFN),
| PARAM(STORE_EVTCHN),
| PARAM(PAE_ENABLED),
| PARAM(IOREQ_PFN),
| PARAM(BUFIOREQ_PFN),
| PARAM(TIMER_MODE),
| PARAM(HPET_ENABLED),
| PARAM(IDENT_PT),
| PARAM(DM_DOMAIN),
| PARAM(ACPI_S_STATE),
| PARAM(VM86_TSS),
| PARAM(VPT_ALIGN),
| PARAM(CONSOLE_PFN),
| PARAM(CONSOLE_EVTCHN),
| };
| #undef PARAM
|
| if (op >= ARRAY_SIZE(names))
| return "unknown";
|
| if (!names[op])
| return "reserved";
|
| return names[op];
| }
| static inline int hvm_get_parameter(int idx, uint64_t *value)
| {
| struct xen_hvm_param xhv;
| int r;
|
| xhv.domid = DOMID_SELF;
| xhv.index = idx;
| r = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
| if (r < 0) {
| pr_err("Cannot get hvm parameter %s (%d): %d!\n",
| param_name(idx), idx, r);
| return r;
| }
| *value = xhv.value;
| return r;
| }
|
| #define HVM_CALLBACK_VIA_TYPE_VECTOR 0x2
| #define HVM_CALLBACK_VIA_TYPE_SHIFT 56
| #define HVM_CALLBACK_VECTOR(x) (((uint64_t)HVM_CALLBACK_VIA_TYPE_VECTOR)<<\
| HVM_CALLBACK_VIA_TYPE_SHIFT | (x))
|
| void xen_setup_callback_vector(void);
|
| #endif /* XEN_HVM_H__ */
|
|