#include <asm/uaccess.h>
#include <asm/tlb.h>
#include <asm/hypervisor.h>
-#include <xen/public/privcmd.h>
#include <xen/interface/xen.h>
+#include <xen/public/privcmd.h>
#include <xen/xen_proc.h>
#include <xen/features.h>
}
break;
+ case IOCTL_PRIVCMD_DOMCTL: {
+ xen_domctl_t xd;
+
+ if (copy_from_user(&xd, udata, sizeof(xd)))
+ return -EFAULT;
+ if (fdata->restrict_domid != UNRESTRICTED_DOMID &&
+ xd.domain != fdata->restrict_domid)
+ return -EACCES;
+ ret = HYPERVISOR_domctl(&xd);
+ if (ret >= 0) {
+ if (copy_to_user(udata, &xd, sizeof(xd)))
+ ret = -EFAULT;
+ }
+ }
+ break;
+
default:
ret = -EINVAL;
break;
return _hypercall2(int, xenoprof_op, op, arg);
}
+static inline int __must_check
+HYPERVISOR_domctl(
+ xen_domctl_t *xd)
+{
+ return _hypercall1(int, domctl, xd);
+}
+
static inline int __must_check
HYPERVISOR_kexec_op(
unsigned long op, void *args)
#include <xen/interface/physdev.h>
#include <xen/interface/sched.h>
#include <xen/interface/nmi.h>
+#include <xen/interface/domctl.h>
#include <asm/ptrace.h>
#include <asm/page.h>
#if defined(__i386__)
return _hypercall2(int, xenoprof_op, op, arg);
}
+static inline int __must_check
+HYPERVISOR_domctl(
+ xen_domctl_t *xd)
+{
+ return _hypercall1(int, domctl, xd);
+}
+
static inline int __must_check
HYPERVISOR_kexec_op(
unsigned long op, void *args)
#define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START)
#endif
-/* 32-/64-bit invariability for control interfaces (domctl/sysctl). */
-#if defined(__XEN__) || defined(__XEN_TOOLS__)
#undef ___DEFINE_XEN_GUEST_HANDLE
-#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
typedef struct { type *p; } \
__guest_handle_ ## name; \
typedef struct { union { type *p; uint64_aligned_t q; }; } \
#define uint64_aligned_t uint64_t __attribute__((aligned(8)))
#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name
#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name)
-#endif
#ifndef __ASSEMBLY__
#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START)
#endif
+#define uint64_aligned_t uint64_t
+#define XEN_GUEST_HANDLE_64(name) XEN_GUEST_HANDLE(name)
+
+
/*
* int HYPERVISOR_set_segment_base(unsigned int which, unsigned long base)
* @which == SEGBASE_* ; @base == 64-bit base address
#ifndef __XEN_PUBLIC_DOMCTL_H__
#define __XEN_PUBLIC_DOMCTL_H__
-#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
-#error "domctl operations are intended for use by node control tools only"
-#endif
-
#include "xen.h"
#define XEN_DOMCTL_INTERFACE_VERSION 0x00000005
#endif /* !__ASSEMBLY__ */
-/* Default definitions for macros used by domctl/sysctl. */
-#if defined(__XEN__) || defined(__XEN_TOOLS__)
-#ifndef uint64_aligned_t
-#define uint64_aligned_t uint64_t
-#endif
-#ifndef XEN_GUEST_HANDLE_64
-#define XEN_GUEST_HANDLE_64(name) XEN_GUEST_HANDLE(name)
-#endif
-#endif
-
#endif /* __XEN_PUBLIC_XEN_H__ */
/*
_IOC(_IOC_NONE, 'P', 3, sizeof(privcmd_mmapbatch_t))
#define IOCTL_PRIVCMD_RESTRICT_DOMID \
_IOC(_IOC_NONE, 'P', 4, sizeof(privcmd_restrict_domid_t))
+#define IOCTL_PRIVCMD_DOMCTL \
+ _IOC(_IOC_NONE, 'P', 5, sizeof(xen_domctl_t))
#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */