return -1;
}
+int xtf_probe_domctl_interface_version(void)
+{
+ int i;
+ struct xen_domctl op = { .cmd = 0 };
+
+ for ( i = 0; i < 128; i++ )
+ {
+ op.interface_version = i;
+ if ( hypercall_domctl(&op) != -EACCES )
+ return i;
+ }
+
+ return -1;
+}
+
int xtf_get_domid(void)
{
int rc = xenstore_init();
#endif
};
+/*
+ * struct xen_arch_domainconfig's ABI is covered by
+ * XEN_DOMCTL_INTERFACE_VERSION.
+ */
+struct xen_arch_domainconfig {
+#define _XEN_X86_EMU_LAPIC 0
+#define XEN_X86_EMU_LAPIC (1U<<_XEN_X86_EMU_LAPIC)
+#define _XEN_X86_EMU_HPET 1
+#define XEN_X86_EMU_HPET (1U<<_XEN_X86_EMU_HPET)
+#define _XEN_X86_EMU_PM 2
+#define XEN_X86_EMU_PM (1U<<_XEN_X86_EMU_PM)
+#define _XEN_X86_EMU_RTC 3
+#define XEN_X86_EMU_RTC (1U<<_XEN_X86_EMU_RTC)
+#define _XEN_X86_EMU_IOAPIC 4
+#define XEN_X86_EMU_IOAPIC (1U<<_XEN_X86_EMU_IOAPIC)
+#define _XEN_X86_EMU_PIC 5
+#define XEN_X86_EMU_PIC (1U<<_XEN_X86_EMU_PIC)
+#define _XEN_X86_EMU_VGA 6
+#define XEN_X86_EMU_VGA (1U<<_XEN_X86_EMU_VGA)
+#define _XEN_X86_EMU_IOMMU 7
+#define XEN_X86_EMU_IOMMU (1U<<_XEN_X86_EMU_IOMMU)
+#define _XEN_X86_EMU_PIT 8
+#define XEN_X86_EMU_PIT (1U<<_XEN_X86_EMU_PIT)
+#define _XEN_X86_EMU_USE_PIRQ 9
+#define XEN_X86_EMU_USE_PIRQ (1U<<_XEN_X86_EMU_USE_PIRQ)
+#define _XEN_X86_EMU_VPCI 10
+#define XEN_X86_EMU_VPCI (1U<<_XEN_X86_EMU_VPCI)
+
+#define XEN_X86_EMU_ALL (XEN_X86_EMU_LAPIC | XEN_X86_EMU_HPET | \
+ XEN_X86_EMU_PM | XEN_X86_EMU_RTC | \
+ XEN_X86_EMU_IOAPIC | XEN_X86_EMU_PIC | \
+ XEN_X86_EMU_VGA | XEN_X86_EMU_IOMMU | \
+ XEN_X86_EMU_PIT | XEN_X86_EMU_USE_PIRQ |\
+ XEN_X86_EMU_VPCI)
+ uint32_t emulation_flags;
+};
+
#endif
/**
--- /dev/null
+/*
+ * Xen public domctl hypercall interface
+ */
+
+#ifndef XEN_PUBLIC_DOMCTL_H
+#define XEN_PUBLIC_DOMCTL_H
+
+struct xen_domctl_createdomain {
+ /* IN parameters */
+ uint32_t ssidref;
+ uint8_t handle[16];
+ /* Is this an HVM guest (as opposed to a PVH or PV guest)? */
+#define _XEN_DOMCTL_CDF_hvm_guest 0
+#define XEN_DOMCTL_CDF_hvm_guest (1U<<_XEN_DOMCTL_CDF_hvm_guest)
+ /* Use hardware-assisted paging if available? */
+#define _XEN_DOMCTL_CDF_hap 1
+#define XEN_DOMCTL_CDF_hap (1U<<_XEN_DOMCTL_CDF_hap)
+ /* Should domain memory integrity be verifed by tboot during Sx? */
+#define _XEN_DOMCTL_CDF_s3_integrity 2
+#define XEN_DOMCTL_CDF_s3_integrity (1U<<_XEN_DOMCTL_CDF_s3_integrity)
+ /* Disable out-of-sync shadow page tables? */
+#define _XEN_DOMCTL_CDF_oos_off 3
+#define XEN_DOMCTL_CDF_oos_off (1U<<_XEN_DOMCTL_CDF_oos_off)
+ /* Is this a xenstore domain? */
+#define _XEN_DOMCTL_CDF_xs_domain 4
+#define XEN_DOMCTL_CDF_xs_domain (1U<<_XEN_DOMCTL_CDF_xs_domain)
+ uint32_t flags;
+
+ /*
+ * Various domain limits, which impact the quantity of resources (global
+ * mapping space, xenheap, etc) a guest may consume.
+ */
+ uint32_t max_vcpus;
+ uint32_t max_evtchn_port;
+ uint32_t max_grant_frames;
+ uint32_t max_maptrack_frames;
+
+ struct xen_arch_domainconfig arch;
+};
+
+struct xen_domctl {
+ uint32_t cmd;
+#define XEN_DOMCTL_createdomain 1
+#define XEN_DOMCTL_destroydomain 2
+ uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
+ domid_t domain;
+ union {
+ struct xen_domctl_createdomain createdomain;
+ uint8_t pad[128];
+ } u;
+};
+typedef struct xen_domctl xen_domctl_t;
+
+#endif /* XEN_PUBLIC_DOMCTL_H */
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * tab-width: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
/* All Xen ABI for includers convenience .*/
#include <xen/callback.h>
+#include <xen/domctl.h>
#include <xen/elfnote.h>
#include <xen/errno.h>
#include <xen/event_channel.h>
return HYPERCALL1(long, __HYPERVISOR_sysctl, arg);
}
+static inline long hypercall_domctl(xen_domctl_t *arg)
+{
+ return HYPERCALL1(long, __HYPERVISOR_domctl, arg);
+}
+
/*
* Higher level hypercall helpers
*/
*/
int xtf_probe_sysctl_interface_version(void);
+/**
+ * Probe for the DOMCTL_INTERFACE_VERSION in use by the hypervisor
+ * @returns version, or -1 on failure.
+ */
+int xtf_probe_domctl_interface_version(void);
+
/**
* Obtain the current domid.
* @returns domid, or -1 on failure.