performed on restricted domains.
#include <asm/tlb.h>
#include <asm/hypervisor.h>
#include <xen/interface/xen.h>
+#include <xen/interface/hvm/hvm_op.h>
#include <xen/public/privcmd.h>
#include <xen/xen_proc.h>
#include <xen/features.h>
}
break;
+ case IOCTL_PRIVCMD_HVMOP: {
+ privcmd_hvmop_t pht;
+
+ if (copy_from_user(&pht, udata, sizeof(pht)))
+ return -EFAULT;
+
+ if (fdata->restrict_domid != UNRESTRICTED_DOMID) {
+ switch (pht.cmd) {
+ case HVMOP_set_param:
+ case HVMOP_get_param:
+ if (pht.u.param.domid !=
+ fdata->restrict_domid)
+ return -EACCES;
+ break;
+ case HVMOP_set_pci_intx_level:
+ if (pht.u.set_pci_intx_level.domid !=
+ fdata->restrict_domid)
+ return -EACCES;
+ break;
+ case HVMOP_set_isa_irq_level:
+ if (pht.u.set_isa_irq_level.domid !=
+ fdata->restrict_domid)
+ return -EACCES;
+ break;
+ case HVMOP_set_pci_link_route:
+ if (pht.u.set_isa_irq_level.domid !=
+ fdata->restrict_domid)
+ return -EACCES;
+ break;
+ case HVMOP_modified_memory:
+ if (pht.u.modified_memory.domid !=
+ fdata->restrict_domid)
+ return -EACCES;
+ break;
+ case HVMOP_set_mem_type:
+ if (pht.u.set_mem_type.domid !=
+ fdata->restrict_domid)
+ return -EACCES;
+ break;
+ case HVMOP_track_dirty_vram:
+ if (pht.u.track_dirty_vram.domid !=
+ fdata->restrict_domid)
+ return -EACCES;
+ break;
+ default:
+ return -EACCES;
+ }
+ }
+
+ ret = HYPERVISOR_hvm_op(pht.cmd, &pht.u);
+ if (ret >= 0) {
+ if (copy_to_user(udata, &pht, sizeof(pht)))
+ ret = -EFAULT;
+ }
+ break;
+ }
+ break;
+
default:
ret = -EINVAL;
break;
}
#endif
-#ifndef CONFIG_XEN
static inline unsigned long __must_check
HYPERVISOR_hvm_op(
int op, void *arg)
{
return _hypercall2(unsigned long, hvm_op, op, arg);
}
-#endif
static inline int __must_check
HYPERVISOR_callback_op(
}
#endif
-#ifndef CONFIG_XEN
static inline unsigned long __must_check
HYPERVISOR_hvm_op(
int op, void *arg)
{
return _hypercall2(unsigned long, hvm_op, op, arg);
}
-#endif
static inline int __must_check
HYPERVISOR_callback_op(
/* Hint from PV drivers for process destruction. */
#define HVMOP_process_dying 7
-/* Following tools-only interfaces may change in future. */
-#if defined(__XEN__) || defined(__XEN_TOOLS__)
-
/* Track dirty VRAM. */
#define HVMOP_track_dirty_vram 128
struct xen_hvm_track_dirty_vram {
typedef struct xen_hvm_set_mem_type xen_hvm_set_mem_type_t;
DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_type_t);
-
-#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
-
#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
#define __LINUX_PUBLIC_PRIVCMD_H__
#include <linux/types.h>
+#ifdef __KERNEL__
+#include <xen/hvm.h>
+#else
+#include <xen/hvm/hvm_op.h>
+#endif
#ifndef __user
#define __user
domid_t domid;
} privcmd_restrict_domid_t;
+typedef struct privcmd_hvmop {
+ unsigned cmd;
+ union {
+ xen_hvm_param_t param;
+ xen_hvm_set_pci_intx_level_t set_pci_intx_level;
+ xen_hvm_set_isa_irq_level_t set_isa_irq_level;
+ xen_hvm_set_pci_link_route_t set_pci_link_route;
+ xen_hvm_modified_memory_t modified_memory;
+ xen_hvm_set_mem_type_t set_mem_type;
+ xen_hvm_track_dirty_vram_t track_dirty_vram;
+ } u;
+} privcmd_hvmop_t;
+
/*
* @cmd: IOCTL_PRIVCMD_HYPERCALL
* @arg: &privcmd_hypercall_t
_IOC(_IOC_NONE, 'P', 4, sizeof(privcmd_restrict_domid_t))
#define IOCTL_PRIVCMD_DOMCTL \
_IOC(_IOC_NONE, 'P', 5, sizeof(xen_domctl_t))
+#define IOCTL_PRIVCMD_HVMOP \
+ _IOC(_IOC_NONE, 'P', 6, sizeof(privcmd_hvmop_t))
#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */