DECLARE_HYPERCALL(console_io)
DECLARE_HYPERCALL(sched_op)
DECLARE_HYPERCALL(event_channel_op)
+DECLARE_HYPERCALL(hvm_op)
--- /dev/null
+/*
+ * Xen x86 public cpuid interface
+ */
+
+#ifndef XEN_PUBLIC_ARCH_X86_CPUID_H
+#define XEN_PUBLIC_ARCH_X86_CPUID_H
+
+/*
+ * For compatibility with other hypervisor interfaces, the Xen cpuid leaves
+ * can be found at the first otherwise unused 0x100 aligned boundary starting
+ * from 0x40000000.
+ *
+ * e.g If viridian extensions are enabled for an HVM domain, the Xen cpuid
+ * leaves will start at 0x40000100
+ */
+
+#define XEN_CPUID_FIRST_LEAF 0x40000000
+
+/*
+ * Leaf 1 (0x40000x00)
+ * EAX: Largest Xen-information leaf. All leaves up to an including @EAX
+ * are supported by the Xen host.
+ * EBX-EDX: "XenVMMXenVMM" signature, allowing positive identification
+ * of a Xen host.
+ */
+#define XEN_CPUID_SIGNATURE_EBX 0x566e6558 /* "XenV" */
+#define XEN_CPUID_SIGNATURE_ECX 0x65584d4d /* "MMXe" */
+#define XEN_CPUID_SIGNATURE_EDX 0x4d4d566e /* "nVMM" */
+
+/*
+ * Leaf 3 (0x40000x02)
+ * EAX: Number of hypercall transfer pages. This register is always guaranteed
+ * to specify one hypercall page.
+ * EBX: Base address of Xen-specific MSRs.
+ * ECX: Features 1. Unused bits are set to zero.
+ * EDX: Features 2. Unused bits are set to zero.
+ */
+
+#endif /* XEN_PUBLIC_ARCH_X86_CPUID_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
# error Bad architecture
#endif
+#include "cpuid.h"
+
#ifndef __ASSEMBLY__
typedef unsigned long xen_pfn_t;
#endif
--- /dev/null
+/*
+ * Xen public hvmop interface
+ */
+
+#ifndef XEN_PUBLIC_HVM_HVM_OP_H
+#define XEN_PUBLIC_HVM_HVM_OP_H
+
+/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
+#define HVMOP_set_param 0
+#define HVMOP_get_param 1
+struct xen_hvm_param {
+ domid_t domid;
+ uint32_t index;
+ uint64_t value;
+};
+typedef struct xen_hvm_param xen_hvm_param_t;
+
+#endif /* XEN_PUBLIC_HVM_HVM_OP_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
--- /dev/null
+/*
+ * Xen public hvm paramter index
+ */
+
+#ifndef XEN_PUBLIC_HVM_PARAMS_H
+#define XEN_PUBLIC_HVM_PARAMS_H
+
+#define HVM_PARAM_CONSOLE_PFN 17
+#define HVM_PARAM_CONSOLE_EVTCHN 18
+
+#endif /* XEN_PUBLIC_HVM_PARAMS_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
#define __HYPERVISOR_console_io 18
#define __HYPERVISOR_sched_op 29
#define __HYPERVISOR_event_channel_op 32
+#define __HYPERVISOR_hvm_op 34
+
+#ifndef __ASSEMBLY__
+typedef uint16_t domid_t;
+#endif
+
+#define DOMID_SELF (0x7ff0U)
/* Commands to HYPERVISOR_console_io */
#define CONSOLEIO_write 0
#include <xen/xen.h>
#include <xen/sched.h>
#include <xen/event_channel.h>
+#include <xen/hvm/hvm_op.h>
+#include <xen/hvm/params.h>
/*
* Hypercall primatives, compiled for the correct bitness
return HYPERCALL2(long, event_channel_op, cmd, arg);
}
+static inline long hypercall_hvm_op(unsigned int cmd, void *arg)
+{
+ return HYPERCALL2(long, hvm_op, cmd, arg);
+}
+
/*
* Higher level hypercall helpers
*/
return hypercall_event_channel_op(EVTCHNOP_send, &port);
}
+static inline int hvm_set_param(unsigned int idx, uint64_t value)
+{
+ xen_hvm_param_t p = { .domid = DOMID_SELF, .index = idx, .value = value };
+
+ return hypercall_hvm_op(HVMOP_set_param, &p);
+}
+
+static inline int hvm_get_param(unsigned int idx, uint64_t *value)
+{
+ xen_hvm_param_t p = { .domid = DOMID_SELF, .index = idx };
+ int rc = hypercall_hvm_op(HVMOP_get_param, &p);
+
+ if ( rc == 0 )
+ *value = p.value;
+ return rc;
+}
+
#endif /* XTF_HYPERCALL_H */
/*