@@ -101,5 +101,7 @@ typedef struct privcmd_dm_op {
_IOC(_IOC_NONE, 'P', 4, sizeof(privcmd_mmapbatch_v2_t))
#define IOCTL_PRIVCMD_DM_OP \
_IOC(_IOC_NONE, 'P', 5, sizeof(privcmd_dm_op_t))
+#define IOCTL_PRIVCMD_RESTRICT \
+ _IOC(_IOC_NONE, 'P', 6, sizeof(domid_t))
#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
@@ -15,6 +15,8 @@
* License along with this library; If not, see <http://www.gnu.org/licenses/>.
*/
+#include <errno.h>
+
#include "private.h"
int osdep_xendevicemodel_open(xendevicemodel_handle *dmod)
@@ -34,6 +36,13 @@ int osdep_xendevicemodel_op(xendevicemodel_handle *dmod,
return xendevicemodel_xcall(dmod, domid, nr_bufs, bufs);
}
+int osdep_xendevicemodel_restrict(xendevicemodel_handle *dmod,
+ domid_t domid)
+{
+ errno = EOPNOTSUPP;
+ return -1;
+}
+
/*
* Local variables:
* mode: C
@@ -492,6 +492,11 @@ int xendevicemodel_inject_event(
return xendevicemodel_op(dmod, domid, 1, &op, sizeof(op));
}
+int xendevicemodel_restrict(xendevicemodel_handle *dmod, domid_t domid)
+{
+ return osdep_xendevicemodel_restrict(dmod, domid);
+}
+
/*
* Local variables:
* mode: C
@@ -283,6 +283,16 @@ int xendevicemodel_inject_event(
xendevicemodel_handle *dmod, domid_t domid, int vcpu, uint8_t vector,
uint8_t type, uint32_t error_code, uint8_t insn_len, uint64_t cr2);
+/**
+ * This function restricts the use of this handle to the specified
+ * domain.
+ *
+ * @parm dmod handle to the open devicemodel interface
+ * @parm domid the domain id
+ * @return 0 on success, -1 on failure.
+ */
+int xendevicemodel_restrict(xendevicemodel_handle *dmod, domid_t domid);
+
#endif /* __XEN_TOOLS__ */
#endif /* XENDEVICEMODEL_H */
@@ -17,6 +17,7 @@ VERS_1.0 {
xendevicemodel_modified_memory;
xendevicemodel_set_mem_type;
xendevicemodel_inject_event;
+ xendevicemodel_restrict;
xendevicemodel_close;
local: *; /* Do not expose anything by default */
};
@@ -112,6 +112,17 @@ int osdep_xendevicemodel_op(xendevicemodel_handle *dmod,
return 0;
}
+int osdep_xendevicemodel_restrict(xendevicemodel_handle *dmod,
+ domid_t domid)
+{
+ if (dmod->fd < 0) {
+ errno = EOPNOTSUPP;
+ return -1;
+ }
+
+ return ioctl(dmod->fd, IOCTL_PRIVCMD_RESTRICT, &domid);
+}
+
/*
* Local variables:
* mode: C
@@ -29,6 +29,9 @@ int osdep_xendevicemodel_op(xendevicemodel_handle *dmod,
domid_t domid, unsigned int nr_bufs,
struct xendevicemodel_buf bufs[]);
+int osdep_xendevicemodel_restrict(
+ xendevicemodel_handle *dmod, domid_t domid);
+
#define PERROR(_f...) \
xtl_log(dmod->logger, XTL_ERROR, errno, "xendevicemodel", _f)