Message ID | 20231025145042.627381-15-dwmw2@infradead.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Get Xen PV shim running in QEMU, add net & console | expand |
On 25/10/2023 15:50, David Woodhouse wrote: > From: David Woodhouse <dwmw@amazon.co.uk> > > The primary Xen console is special. The guest's side is set up for it by > the toolstack automatically and not by the standard PV init sequence. > > Accordingly, its *frontend* doesn't appear in …/device/console/0 either; > instead it appears under …/console in the guest's XenStore node. > > To allow the Xen console driver to override the frontend path for the > primary console, add a method to the XenDeviceClass which can be used > instead of the standard xen_device_get_frontend_path() > > Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> > --- > hw/xen/xen-bus.c | 11 ++++++++++- > include/hw/xen/xen-bus.h | 2 ++ > 2 files changed, 12 insertions(+), 1 deletion(-) > Reviewed-by: Paul Durrant <paul@xen.org>
diff --git a/hw/xen/xen-bus.c b/hw/xen/xen-bus.c index ece8ec40cd..12ff782005 100644 --- a/hw/xen/xen-bus.c +++ b/hw/xen/xen-bus.c @@ -711,8 +711,17 @@ static void xen_device_frontend_create(XenDevice *xendev, Error **errp) { ERRP_GUARD(); XenBus *xenbus = XEN_BUS(qdev_get_parent_bus(DEVICE(xendev))); + XenDeviceClass *xendev_class = XEN_DEVICE_GET_CLASS(xendev); - xendev->frontend_path = xen_device_get_frontend_path(xendev); + if (xendev_class->get_frontend_path) { + xendev->frontend_path = xendev_class->get_frontend_path(xendev, errp); + if (!xendev->frontend_path) { + error_prepend(errp, "failed to create frontend: "); + return; + } + } else { + xendev->frontend_path = xen_device_get_frontend_path(xendev); + } /* * The frontend area may have already been created by a legacy diff --git a/include/hw/xen/xen-bus.h b/include/hw/xen/xen-bus.h index f435898164..eb440880b5 100644 --- a/include/hw/xen/xen-bus.h +++ b/include/hw/xen/xen-bus.h @@ -33,6 +33,7 @@ struct XenDevice { }; typedef struct XenDevice XenDevice; +typedef char *(*XenDeviceGetFrontendPath)(XenDevice *xendev, Error **errp); typedef char *(*XenDeviceGetName)(XenDevice *xendev, Error **errp); typedef void (*XenDeviceRealize)(XenDevice *xendev, Error **errp); typedef void (*XenDeviceFrontendChanged)(XenDevice *xendev, @@ -46,6 +47,7 @@ struct XenDeviceClass { /*< public >*/ const char *backend; const char *device; + XenDeviceGetFrontendPath get_frontend_path; XenDeviceGetName get_name; XenDeviceRealize realize; XenDeviceFrontendChanged frontend_changed;