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