mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
tools/libxendevicemodel: add a call to restrict the handle
My recent patch [1] to the Linux privcmd module introduced a mechanism to restrict an open file handle to subsequently only accept operations for a specified domain. This patch extends the libxendevicemodel API and make use of the mechanism in the Linux-specific code to restrict operations on the interface handle. [1] https://git.kernel.org/cgit/linux/kernel/git/ostr/linux.git/commit/?id=4610d240 Signed-off-by: Paul Durrant <paul.durrant@citrix.com> Acked-by: Wei Liu <wei.liu2@citrix.com> Acked-by: Ian Jackson <ian.jackson@eu.citrix.com>
This commit is contained in:
1 parent
e7745d8ef5
commit
8ef5f344d0
7 files changed
+41
No files matched your search
@@ -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)
|
||||
|
||||
|
||||