mirror of https://github.com/xqemu/xqemu.git
usb: add xen pvUSB backend, add num-ports check to ohci.
-----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJXQv9hAAoJEEy22O7T6HE4OYAP/060jKX9OMBDYS1JtHuwwR1s 62UIGKAIv1pidoHL3v0H3eq0Mtr/P16Rb7fCkmTlfccC++tc0S7BR7HqlQhrAJPB YYWCLnvj8tVAON6sb+ohsarVqTCmu4g2n+VfIShFne7yEUitsSBbXHOvsWn5gST8 QjteOFkWZ6GDQ96hgoOadA0SiyoE77wuvYDI/Fn7mbgLKrBbGLekiGAjQ0GeCEBA 0te+HKhR/k+2ZmSpQK5JswAr8gfA/pOIi7hwD6s45AIPpHGvw9MfKBMzFTHCBWeH lPsKNA0h24yOZfZVfs3z7DE93jJIsgpayNjHpp/cEojoKXdLii8637YMGO8vh00m zeCDqb1MGOAa3XcDG8JZHAUHAU8ya9spOCX36heDAqLdOaWNcstCNgHTlPpSl/NF esf/zHB0nDtbjEFqvEC0ewFENAgzR3VWr7n2KvJFsfYaFigdWO4ebI7xlNq+Jf0h O1rl6kowm4o8nrzgpKS+oNO4uTdB64gFDvcSdo1hI3XluiY/9ZIkp2rE3KbCCLQm Fk8m74+CvmpTH8vHj3TYW+gebP1Ov4ioGrnzYGfr0hQdOeb5BkW3h8Fm8acAfCE2 tVd/Z1iQEqUvDwRpyEp5pOzv/dZQGFHrL8xhdyXdE55UzZXCNgtHJoIufvcxJDzf rHNMGiS/Z58nkoVjnzWp =qLbp -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kraxel/tags/pull-usb-20160523-1' into staging usb: add xen pvUSB backend, add num-ports check to ohci. # gpg: Signature made Mon 23 May 2016 14:02:25 BST using RSA key ID D3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" * remotes/kraxel/tags/pull-usb-20160523-1: usb/ohci: Fix crash with when specifying too many num-ports xen: add pvUSB backend xen: write information about supported backends xen: introduce dummy system device Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
2b5f477789
|
@ -38,3 +38,7 @@ common-obj-$(CONFIG_USB_REDIR) += redirect.o quirks.o
|
|||
|
||||
# usb pass-through
|
||||
common-obj-y += $(patsubst %,host-%.o,$(HOST_USB))
|
||||
|
||||
ifeq ($(CONFIG_USB_LIBUSB),y)
|
||||
common-obj-$(CONFIG_XEN_BACKEND) += xen-usb.o
|
||||
endif
|
||||
|
|
|
@ -1848,6 +1848,12 @@ static void usb_ohci_init(OHCIState *ohci, DeviceState *dev,
|
|||
|
||||
ohci->as = as;
|
||||
|
||||
if (num_ports > OHCI_MAX_PORTS) {
|
||||
error_setg(errp, "OHCI num-ports=%d is too big (limit is %d ports)",
|
||||
num_ports, OHCI_MAX_PORTS);
|
||||
return;
|
||||
}
|
||||
|
||||
if (usb_frame_time == 0) {
|
||||
#ifdef OHCI_TIME_WARP
|
||||
usb_frame_time = NANOSECONDS_PER_SECOND;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -42,11 +42,36 @@ struct xs_handle *xenstore = NULL;
|
|||
const char *xen_protocol;
|
||||
|
||||
/* private */
|
||||
struct xs_dirs {
|
||||
char *xs_dir;
|
||||
QTAILQ_ENTRY(xs_dirs) list;
|
||||
};
|
||||
static QTAILQ_HEAD(xs_dirs_head, xs_dirs) xs_cleanup =
|
||||
QTAILQ_HEAD_INITIALIZER(xs_cleanup);
|
||||
|
||||
static QTAILQ_HEAD(XenDeviceHead, XenDevice) xendevs = QTAILQ_HEAD_INITIALIZER(xendevs);
|
||||
static int debug = 0;
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
static void xenstore_cleanup_dir(char *dir)
|
||||
{
|
||||
struct xs_dirs *d;
|
||||
|
||||
d = g_malloc(sizeof(*d));
|
||||
d->xs_dir = dir;
|
||||
QTAILQ_INSERT_TAIL(&xs_cleanup, d, list);
|
||||
}
|
||||
|
||||
void xen_config_cleanup(void)
|
||||
{
|
||||
struct xs_dirs *d;
|
||||
|
||||
QTAILQ_FOREACH(d, &xs_cleanup, list) {
|
||||
xs_rm(xenstore, 0, d->xs_dir);
|
||||
}
|
||||
}
|
||||
|
||||
int xenstore_write_str(const char *base, const char *node, const char *val)
|
||||
{
|
||||
char abspath[XEN_BUFSIZE];
|
||||
|
@ -75,6 +100,30 @@ char *xenstore_read_str(const char *base, const char *node)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int xenstore_mkdir(char *path, int p)
|
||||
{
|
||||
struct xs_permissions perms[2] = {
|
||||
{
|
||||
.id = 0, /* set owner: dom0 */
|
||||
}, {
|
||||
.id = xen_domid,
|
||||
.perms = p,
|
||||
}
|
||||
};
|
||||
|
||||
if (!xs_mkdir(xenstore, 0, path)) {
|
||||
xen_be_printf(NULL, 0, "xs_mkdir %s: failed\n", path);
|
||||
return -1;
|
||||
}
|
||||
xenstore_cleanup_dir(g_strdup(path));
|
||||
|
||||
if (!xs_set_permissions(xenstore, 0, path, perms, 2)) {
|
||||
xen_be_printf(NULL, 0, "xs_set_permissions %s: failed\n", path);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int xenstore_write_int(const char *base, const char *node, int ival)
|
||||
{
|
||||
char val[12];
|
||||
|
@ -726,6 +775,20 @@ err:
|
|||
|
||||
int xen_be_register(const char *type, struct XenDevOps *ops)
|
||||
{
|
||||
char path[50];
|
||||
int rc;
|
||||
|
||||
if (ops->backend_register) {
|
||||
rc = ops->backend_register();
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(path, sizeof(path), "device-model/%u/backends/%s", xen_domid,
|
||||
type);
|
||||
xenstore_mkdir(path, XS_PERM_NONE);
|
||||
|
||||
return xenstore_scan(type, xen_domid, ops);
|
||||
}
|
||||
|
||||
|
|
|
@ -5,54 +5,6 @@
|
|||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
struct xs_dirs {
|
||||
char *xs_dir;
|
||||
QTAILQ_ENTRY(xs_dirs) list;
|
||||
};
|
||||
static QTAILQ_HEAD(xs_dirs_head, xs_dirs) xs_cleanup = QTAILQ_HEAD_INITIALIZER(xs_cleanup);
|
||||
|
||||
static void xen_config_cleanup_dir(char *dir)
|
||||
{
|
||||
struct xs_dirs *d;
|
||||
|
||||
d = g_malloc(sizeof(*d));
|
||||
d->xs_dir = dir;
|
||||
QTAILQ_INSERT_TAIL(&xs_cleanup, d, list);
|
||||
}
|
||||
|
||||
void xen_config_cleanup(void)
|
||||
{
|
||||
struct xs_dirs *d;
|
||||
|
||||
QTAILQ_FOREACH(d, &xs_cleanup, list) {
|
||||
xs_rm(xenstore, 0, d->xs_dir);
|
||||
}
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------- */
|
||||
|
||||
static int xen_config_dev_mkdir(char *dev, int p)
|
||||
{
|
||||
struct xs_permissions perms[2] = {{
|
||||
.id = 0, /* set owner: dom0 */
|
||||
},{
|
||||
.id = xen_domid,
|
||||
.perms = p,
|
||||
}};
|
||||
|
||||
if (!xs_mkdir(xenstore, 0, dev)) {
|
||||
xen_be_printf(NULL, 0, "xs_mkdir %s: failed\n", dev);
|
||||
return -1;
|
||||
}
|
||||
xen_config_cleanup_dir(g_strdup(dev));
|
||||
|
||||
if (!xs_set_permissions(xenstore, 0, dev, perms, 2)) {
|
||||
xen_be_printf(NULL, 0, "xs_set_permissions %s: failed\n", dev);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int xen_config_dev_dirs(const char *ftype, const char *btype, int vdev,
|
||||
char *fe, char *be, int len)
|
||||
{
|
||||
|
@ -66,8 +18,8 @@ static int xen_config_dev_dirs(const char *ftype, const char *btype, int vdev,
|
|||
snprintf(be, len, "%s/backend/%s/%d/%d", dom, btype, xen_domid, vdev);
|
||||
free(dom);
|
||||
|
||||
xen_config_dev_mkdir(fe, XS_PERM_READ | XS_PERM_WRITE);
|
||||
xen_config_dev_mkdir(be, XS_PERM_READ);
|
||||
xenstore_mkdir(fe, XS_PERM_READ | XS_PERM_WRITE);
|
||||
xenstore_mkdir(be, XS_PERM_READ);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -25,10 +25,15 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "hw/hw.h"
|
||||
#include "hw/boards.h"
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/xen/xen_backend.h"
|
||||
#include "xen_domainbuild.h"
|
||||
#include "sysemu/block-backend.h"
|
||||
|
||||
#define TYPE_XENSYSDEV "xensysdev"
|
||||
|
||||
DeviceState *xen_sysdev;
|
||||
|
||||
static void xen_init_pv(MachineState *machine)
|
||||
{
|
||||
DriveInfo *dinfo;
|
||||
|
@ -67,11 +72,17 @@ static void xen_init_pv(MachineState *machine)
|
|||
break;
|
||||
}
|
||||
|
||||
xen_sysdev = qdev_create(NULL, TYPE_XENSYSDEV);
|
||||
qdev_init_nofail(xen_sysdev);
|
||||
|
||||
xen_be_register("console", &xen_console_ops);
|
||||
xen_be_register("vkbd", &xen_kbdmouse_ops);
|
||||
xen_be_register("vfb", &xen_framebuffer_ops);
|
||||
xen_be_register("qdisk", &xen_blkdev_ops);
|
||||
xen_be_register("qnic", &xen_netdev_ops);
|
||||
#ifdef CONFIG_USB_LIBUSB
|
||||
xen_be_register("qusb", &xen_usb_ops);
|
||||
#endif
|
||||
|
||||
/* configure framebuffer */
|
||||
if (xenfb_enabled) {
|
||||
|
@ -101,6 +112,38 @@ static void xen_init_pv(MachineState *machine)
|
|||
xen_init_display(xen_domid);
|
||||
}
|
||||
|
||||
static int xen_sysdev_init(SysBusDevice *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Property xen_sysdev_properties[] = {
|
||||
{/* end of property list */},
|
||||
};
|
||||
|
||||
static void xen_sysdev_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
|
||||
|
||||
k->init = xen_sysdev_init;
|
||||
dc->props = xen_sysdev_properties;
|
||||
}
|
||||
|
||||
static const TypeInfo xensysdev_info = {
|
||||
.name = TYPE_XENSYSDEV,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(SysBusDevice),
|
||||
.class_init = xen_sysdev_class_init,
|
||||
};
|
||||
|
||||
static void xenpv_register_types(void)
|
||||
{
|
||||
type_register_static(&xensysdev_info);
|
||||
}
|
||||
|
||||
type_init(xenpv_register_types);
|
||||
|
||||
static void xenpv_machine_init(MachineClass *mc)
|
||||
{
|
||||
mc->desc = "Xen Para-virtualized PC";
|
||||
|
|
|
@ -28,6 +28,7 @@ struct XenDevOps {
|
|||
int (*free)(struct XenDevice *xendev);
|
||||
void (*backend_changed)(struct XenDevice *xendev, const char *node);
|
||||
void (*frontend_changed)(struct XenDevice *xendev, const char *node);
|
||||
int (*backend_register)(void);
|
||||
};
|
||||
|
||||
struct XenDevice {
|
||||
|
@ -60,8 +61,10 @@ extern xc_interface *xen_xc;
|
|||
extern xenforeignmemory_handle *xen_fmem;
|
||||
extern struct xs_handle *xenstore;
|
||||
extern const char *xen_protocol;
|
||||
extern DeviceState *xen_sysdev;
|
||||
|
||||
/* xenstore helper functions */
|
||||
int xenstore_mkdir(char *path, int p);
|
||||
int xenstore_write_str(const char *base, const char *node, const char *val);
|
||||
int xenstore_write_int(const char *base, const char *node, int ival);
|
||||
int xenstore_write_int64(const char *base, const char *node, int64_t ival);
|
||||
|
@ -98,6 +101,9 @@ extern struct XenDevOps xen_kbdmouse_ops; /* xen_framebuffer.c */
|
|||
extern struct XenDevOps xen_framebuffer_ops; /* xen_framebuffer.c */
|
||||
extern struct XenDevOps xen_blkdev_ops; /* xen_disk.c */
|
||||
extern struct XenDevOps xen_netdev_ops; /* xen_nic.c */
|
||||
#ifdef CONFIG_USB_LIBUSB
|
||||
extern struct XenDevOps xen_usb_ops; /* xen-usb.c */
|
||||
#endif
|
||||
|
||||
void xen_init_display(int domid);
|
||||
|
||||
|
|
|
@ -49,6 +49,8 @@ typedef xc_gnttab xengnttab_handle;
|
|||
#define xengnttab_unmap(h, a, n) xc_gnttab_munmap(h, a, n)
|
||||
#define xengnttab_map_grant_refs(h, c, d, r, p) \
|
||||
xc_gnttab_map_grant_refs(h, c, d, r, p)
|
||||
#define xengnttab_map_domain_grant_refs(h, c, d, r, p) \
|
||||
xc_gnttab_map_domain_grant_refs(h, c, d, r, p)
|
||||
|
||||
#define xenforeignmemory_open(l, f) xen_xc
|
||||
|
||||
|
|
Loading…
Reference in New Issue