Message ID | 1491484718-5048-4-git-send-email-yu.c.zhang@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Sorry, forgot cc. Please ignore this thread. Yu On 4/6/2017 9:18 PM, Yu Zhang wrote: > A new device model wrapper is added for the newly introduced > DMOP - XEN_DMOP_map_mem_type_to_ioreq_server. > > Since currently this DMOP only supports the emulation of write > operations, attempts to trigger the DMOP with values other than > XEN_DMOP_IOREQ_MEM_ACCESS_WRITE or 0(to unmap the ioreq server) > shall fail. The wrapper shall be updated once read operations > are also to be emulated in the future. > > Also note currently this DMOP only supports one memory type, > and can be extended in the future to map multiple memory types > to multiple ioreq servers, e.g. mapping HVMMEM_ioreq_serverX to > ioreq server X, This wrapper shall be updated when such change > is made. > > Signed-off-by: Yu Zhang <yu.c.zhang@linux.intel.com> > Reviewed-by: Paul Durrant <paul.durrant@citrix.com> > --- > Cc: Paul Durrant <paul.durrant@citrix.com> > Cc: Ian Jackson <ian.jackson@eu.citrix.com> > Cc: Wei Liu <wei.liu2@citrix.com> > > changes in v2: > - According to Paul and Wei's comments: drop the compat wrapper changes. > - Added "Reviewed-by: Paul Durrant <paul.durrant@citrix.com>". > --- > tools/libs/devicemodel/core.c | 25 +++++++++++++++++++++++++ > tools/libs/devicemodel/include/xendevicemodel.h | 18 ++++++++++++++++++ > tools/libs/devicemodel/libxendevicemodel.map | 1 + > 3 files changed, 44 insertions(+) > > diff --git a/tools/libs/devicemodel/core.c b/tools/libs/devicemodel/core.c > index a85cb49..ff09819 100644 > --- a/tools/libs/devicemodel/core.c > +++ b/tools/libs/devicemodel/core.c > @@ -244,6 +244,31 @@ int xendevicemodel_unmap_io_range_from_ioreq_server( > return xendevicemodel_op(dmod, domid, 1, &op, sizeof(op)); > } > > +int xendevicemodel_map_mem_type_to_ioreq_server( > + xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, uint16_t type, > + uint32_t flags) > +{ > + struct xen_dm_op op; > + struct xen_dm_op_map_mem_type_to_ioreq_server *data; > + > + if (type != HVMMEM_ioreq_server || > + flags & ~XEN_DMOP_IOREQ_MEM_ACCESS_WRITE) { > + errno = EINVAL; > + return -1; > + } > + > + memset(&op, 0, sizeof(op)); > + > + op.op = XEN_DMOP_map_mem_type_to_ioreq_server; > + data = &op.u.map_mem_type_to_ioreq_server; > + > + data->id = id; > + data->type = type; > + data->flags = flags; > + > + return xendevicemodel_op(dmod, domid, 1, &op, sizeof(op)); > +} > + > int xendevicemodel_map_pcidev_to_ioreq_server( > xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, > uint16_t segment, uint8_t bus, uint8_t device, uint8_t function) > diff --git a/tools/libs/devicemodel/include/xendevicemodel.h b/tools/libs/devicemodel/include/xendevicemodel.h > index b3f600e..1da216f 100644 > --- a/tools/libs/devicemodel/include/xendevicemodel.h > +++ b/tools/libs/devicemodel/include/xendevicemodel.h > @@ -104,6 +104,24 @@ int xendevicemodel_unmap_io_range_from_ioreq_server( > uint64_t start, uint64_t end); > > /** > + * This function registers/deregisters a memory type for emulation. > + * > + * @parm dmod a handle to an open devicemodel interface. > + * @parm domid the domain id to be serviced. > + * @parm id the IOREQ Server id. > + * @parm type the memory type to be emulated. For now, only HVMMEM_ioreq_server > + * is supported, and in the future new types can be introduced, e.g. > + * HVMMEM_ioreq_serverX mapped to ioreq server X. > + * @parm flags operations to be emulated; 0 for unmap. For now, only write > + * operations will be emulated and can be extended to emulate > + * read ones in the future. > + * @return 0 on success, -1 on failure. > + */ > +int xendevicemodel_map_mem_type_to_ioreq_server( > + xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, uint16_t type, > + uint32_t flags); > + > +/** > * This function registers a PCI device for config space emulation. > * > * @parm dmod a handle to an open devicemodel interface. > diff --git a/tools/libs/devicemodel/libxendevicemodel.map b/tools/libs/devicemodel/libxendevicemodel.map > index 45c773e..130222c 100644 > --- a/tools/libs/devicemodel/libxendevicemodel.map > +++ b/tools/libs/devicemodel/libxendevicemodel.map > @@ -5,6 +5,7 @@ VERS_1.0 { > xendevicemodel_get_ioreq_server_info; > xendevicemodel_map_io_range_to_ioreq_server; > xendevicemodel_unmap_io_range_from_ioreq_server; > + xendevicemodel_map_mem_type_to_ioreq_server; > xendevicemodel_map_pcidev_to_ioreq_server; > xendevicemodel_unmap_pcidev_from_ioreq_server; > xendevicemodel_destroy_ioreq_server;
diff --git a/tools/libs/devicemodel/core.c b/tools/libs/devicemodel/core.c index a85cb49..ff09819 100644 --- a/tools/libs/devicemodel/core.c +++ b/tools/libs/devicemodel/core.c @@ -244,6 +244,31 @@ int xendevicemodel_unmap_io_range_from_ioreq_server( return xendevicemodel_op(dmod, domid, 1, &op, sizeof(op)); } +int xendevicemodel_map_mem_type_to_ioreq_server( + xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, uint16_t type, + uint32_t flags) +{ + struct xen_dm_op op; + struct xen_dm_op_map_mem_type_to_ioreq_server *data; + + if (type != HVMMEM_ioreq_server || + flags & ~XEN_DMOP_IOREQ_MEM_ACCESS_WRITE) { + errno = EINVAL; + return -1; + } + + memset(&op, 0, sizeof(op)); + + op.op = XEN_DMOP_map_mem_type_to_ioreq_server; + data = &op.u.map_mem_type_to_ioreq_server; + + data->id = id; + data->type = type; + data->flags = flags; + + return xendevicemodel_op(dmod, domid, 1, &op, sizeof(op)); +} + int xendevicemodel_map_pcidev_to_ioreq_server( xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, uint16_t segment, uint8_t bus, uint8_t device, uint8_t function) diff --git a/tools/libs/devicemodel/include/xendevicemodel.h b/tools/libs/devicemodel/include/xendevicemodel.h index b3f600e..1da216f 100644 --- a/tools/libs/devicemodel/include/xendevicemodel.h +++ b/tools/libs/devicemodel/include/xendevicemodel.h @@ -104,6 +104,24 @@ int xendevicemodel_unmap_io_range_from_ioreq_server( uint64_t start, uint64_t end); /** + * This function registers/deregisters a memory type for emulation. + * + * @parm dmod a handle to an open devicemodel interface. + * @parm domid the domain id to be serviced. + * @parm id the IOREQ Server id. + * @parm type the memory type to be emulated. For now, only HVMMEM_ioreq_server + * is supported, and in the future new types can be introduced, e.g. + * HVMMEM_ioreq_serverX mapped to ioreq server X. + * @parm flags operations to be emulated; 0 for unmap. For now, only write + * operations will be emulated and can be extended to emulate + * read ones in the future. + * @return 0 on success, -1 on failure. + */ +int xendevicemodel_map_mem_type_to_ioreq_server( + xendevicemodel_handle *dmod, domid_t domid, ioservid_t id, uint16_t type, + uint32_t flags); + +/** * This function registers a PCI device for config space emulation. * * @parm dmod a handle to an open devicemodel interface. diff --git a/tools/libs/devicemodel/libxendevicemodel.map b/tools/libs/devicemodel/libxendevicemodel.map index 45c773e..130222c 100644 --- a/tools/libs/devicemodel/libxendevicemodel.map +++ b/tools/libs/devicemodel/libxendevicemodel.map @@ -5,6 +5,7 @@ VERS_1.0 { xendevicemodel_get_ioreq_server_info; xendevicemodel_map_io_range_to_ioreq_server; xendevicemodel_unmap_io_range_from_ioreq_server; + xendevicemodel_map_mem_type_to_ioreq_server; xendevicemodel_map_pcidev_to_ioreq_server; xendevicemodel_unmap_pcidev_from_ioreq_server; xendevicemodel_destroy_ioreq_server;