#define KVM_CAP_HYPERV_CPUID 167
#define KVM_CAP_XEN_HVM_GUEST 168
#define KVM_CAP_XEN_HVM_EVTCHN 169
+#define KVM_CAP_XEN_HVM_DOM0 170
#ifdef KVM_CAP_IRQ_ROUTING
__u32 padding[2];
};
} evtchn;
+ struct {
+ __s32 domid;
+ } dom;
} u;
};
#define KVM_XEN_ATTR_TYPE_VCPU_RUNSTATE 0x3
/* Available with KVM_CAP_XEN_HVM_EVTCHN */
#define KVM_XEN_ATTR_TYPE_EVTCHN 0x4
+/* Available with KVM_CAP_XEN_HVM_DOM0 */
+#define KVM_XEN_ATTR_TYPE_DOMID 0x5
/* Secure Encrypted Virtualization command */
enum sev_cmd_id {
kvm_xen_set_callback(int cpu, int virq, int vector, int via) "callback vcpu %d virq %d vector %d via %d"
kvm_xen_evtchn_set(int flags, unsigned int port, int port_type) "flags 0x%x port %u port_type %d"
kvm_xen_evtchn_send(int cpu, int dest, unsigned int port) "cpu %d notify_cpu %d port %u"
+kvm_xen_set_domid(unsigned int domid) "assigned with domid %u"
#include "qemu/osdep.h"
#include "qemu/main-loop.h"
#include "qemu/log.h"
+#include "qemu/error-report.h"
#include "linux/kvm.h"
#include "exec/address-spaces.h"
#include "cpu.h"
#include "monitor/monitor.h"
#include "qapi/qmp/qdict.h"
#include "qom/cpu.h"
+#include "hw/xen/xen.h"
#define __XEN_INTERFACE_VERSION__ 0x00040400
void kvm_xen_init(XenState *xen)
{
+ kvm_xen_set_domid(kvm_state, xen);
+
qemu_mutex_init(&xen_global_mutex);
qemu_mutex_init(&xen->port_lock);
kvm_xen_evtchn_init(xen);
}
+int kvm_xen_set_domid(KVMState *kvm_state, XenState *xen)
+{
+ struct kvm_xen_hvm_attr xhd;
+ int r;
+
+ if (xen->domid != 0) {
+ return -EEXIST;
+ }
+
+ /* Domid 0 means invalid */
+ xen->domid = 0;
+
+ xhd.type = KVM_XEN_ATTR_TYPE_DOMID;
+ if (!xen_domid)
+ xhd.u.dom.domid = -1;
+ else
+ xhd.u.dom.domid = xen_domid;
+ r = kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_SET_ATTR, &xhd);
+ if (r) {
+ return -EFAULT;
+ }
+
+ r = kvm_vm_ioctl(kvm_state, KVM_XEN_HVM_GET_ATTR, &xhd);
+ if (r || !xhd.u.dom.domid) {
+ return -EFAULT;
+ }
+
+ xen->domid = xhd.u.dom.domid;
+ trace_kvm_xen_set_domid(xen->domid);
+ xen_domid = xen->domid;
+ return r;
+}
+
void kvm_xen_run_on_cpu(CPUState *cpu, run_on_cpu_func func, void *data)
{
do_run_on_cpu(cpu, func, RUN_ON_CPU_HOST_PTR(data), &xen_global_mutex);
#define XEN_CPUID_TIME 0x40000003
#define XEN_CPUID_HVM 0x40000004
+int kvm_xen_set_domid(KVMState *kvm_state, XenState *xen);
int kvm_xen_set_hypercall_page(CPUState *env);
int kvm_xen_vcpu_init(CPUState *cs);
int kvm_xen_handle_exit(X86CPU *cpu, struct kvm_xen_exit *exit);