|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 11/11] drivers/char: allow driving the rest of XHCI by a domain while Xen uses DbC
On 13.08.2022 03:39, Marek Marczykowski-Górecki wrote:
> --- a/docs/misc/xen-command-line.pandoc
> +++ b/docs/misc/xen-command-line.pandoc
> @@ -724,7 +724,7 @@ Available alternatives, with their meaning, are:
>
> ### dbgp
> > `= ehci[ <integer> | @pci<bus>:<slot>.<func> ]`
> -> `= xhci[ <integer> | @pci<bus>:<slot>.<func> ]`
> +> `= xhci[ <integer> | @pci<bus>:<slot>.<func> ][,share=<bool>|hwdom]`
>
> Specify the USB controller to use, either by instance number (when going
> over the PCI busses sequentially) or by PCI device (must be on segment 0).
> @@ -732,6 +732,19 @@ over the PCI busses sequentially) or by PCI device (must
> be on segment 0).
> Use `ehci` for EHCI debug port, use `xhci` for XHCI debug capability.
> XHCI driver will wait indefinitely for the debug host to connect - make
> sure the cable is connected.
> +The `share` option for xhci controls who else can use the controller:
> +* `no`: use the controller exclusively for console, even hardware domain
> + (dom0) cannot use it
> +* `hwdom`: hardware domain may use the controller too, ports not used for
> debug
> + console will be available for normal devices; this is the default
> +* `yes`: the controller can be assigned to any domain; it is not safe to
> assign
> + the controller to untrusted domain
> +
> +Choosing `share=hwdom` (the default) or `share=no` allows a domain to reset
> the
DYM "... or `share=yes` ..." here?
> --- a/xen/drivers/char/xhci-dbc.c
> +++ b/xen/drivers/char/xhci-dbc.c
> @@ -23,6 +23,7 @@
> #include <xen/iommu.h>
> #include <xen/mm.h>
> #include <xen/param.h>
> +#include <xen/rangeset.h>
> #include <xen/serial.h>
> #include <xen/timer.h>
> #include <xen/types.h>
> @@ -232,6 +233,14 @@ struct dbc_work_ring {
> uint64_t dma;
> };
>
> +enum xhci_share {
> + XHCI_SHARE_NONE = 0,
> +#ifdef CONFIG_XHCI_SHARE
> + XHCI_SHARE_HWDOM,
> + XHCI_SHARE_ANY
> +#endif
> +};
Hmm, this suggests that Dom0 cannot use the controller without the Kconfig
enabled, which I hope is not the case. But I notice that patch 1, which
was committed already, still uses pci_ro_device() rather than
pci_hide_device() (like ehci-dbgp.c does).
> @@ -1128,10 +1181,34 @@ static void __init cf_check
> dbc_uart_init_postirq(struct serial_port *port)
> init_timer(&uart->timer, dbc_uart_poll, port, 0);
> set_timer(&uart->timer, NOW() + MILLISECS(1));
>
> - if ( pci_ro_device(0, uart->dbc.sbdf.bus, uart->dbc.sbdf.devfn) )
> - printk(XENLOG_WARNING
> - "Failed to mark read-only %pp used for XHCI console\n",
> - &uart->dbc.sbdf);
> + switch ( uart->dbc.share )
> + {
> + case XHCI_SHARE_NONE:
> + if ( pci_ro_device(0, uart->dbc.sbdf.bus, uart->dbc.sbdf.devfn) )
> + printk(XENLOG_WARNING
> + "Failed to mark read-only %pp used for XHCI console\n",
> + &uart->dbc.sbdf);
> + break;
> +#ifdef CONFIG_XHCI_SHARE
> + case XHCI_SHARE_HWDOM:
> + if ( pci_hide_device(0, uart->dbc.sbdf.bus, uart->dbc.sbdf.devfn) )
> + printk(XENLOG_WARNING
> + "Failed to hide %pp used for XHCI console\n",
> + &uart->dbc.sbdf);
> + break;
> + case XHCI_SHARE_ANY:
> + /* Do not hide. */
> + break;
> +#endif
> + }
> +#ifdef CONFIG_X86
> + if ( rangeset_add_range(mmio_ro_ranges,
> + PFN_DOWN(uart->dbc.xhc_mmio_phys + uart->dbc.xhc_dbc_offset),
> + PFN_UP(uart->dbc.xhc_mmio_phys + uart->dbc.xhc_dbc_offset +
> + sizeof(*uart->dbc.dbc_reg)) - 1) )
> + printk(XENLOG_INFO
> + "Error while adding MMIO range of device to
> mmio_ro_ranges\n");
> +#endif
I did comment on this last part before. There very minimum that I'd expect
to appear here is a comment as to the issue with other elements living on
the same page which a domain's driver may actually find a need to write to.
As said before - as soon as such a report would surface, we'd likely need
to add write emulation support for the leading/traling parts of the page(s)
that Xen doesn't use itself.
> @@ -1202,13 +1279,18 @@ void __init xhci_dbc_uart_init(void)
> {
> struct dbc_uart *uart = &dbc_uart;
> struct dbc *dbc = &uart->dbc;
> - const char *e;
> + const char *e, *opt;
>
> if ( strncmp(opt_dbgp, "xhci", 4) )
> return;
>
> memset(dbc, 0, sizeof(*dbc));
>
> +#ifdef CONFIG_XHCI_SHARE
> + dbc->share = XHCI_SHARE_HWDOM;
> +#endif
I think it would be best if the default value was "0"; I can see though
that "NONE" being zero also makse sense, if the enum was to be used in
boolean context (which afaics it currently isn't).
> + e = &opt_dbgp[4];
> if ( isdigit(opt_dbgp[4]) )
> {
> dbc->xhc_num = simple_strtoul(opt_dbgp + 4, &e, 10);
> @@ -1218,7 +1300,7 @@ void __init xhci_dbc_uart_init(void)
> unsigned int bus, slot, func;
>
> e = parse_pci(opt_dbgp + 8, NULL, &bus, &slot, &func);
> - if ( !e || *e )
> + if ( !e || (*e && *e != ',') )
> {
> printk(XENLOG_ERR
> "Invalid dbgp= PCI device spec: '%s'\n",
> @@ -1228,6 +1310,41 @@ void __init xhci_dbc_uart_init(void)
>
> dbc->sbdf = PCI_SBDF(0, bus, slot, func);
> }
> + opt = e;
> +
> +#ifdef CONFIG_XHCI_SHARE
> + /* other options */
> + while ( *opt == ',' )
> + {
> + opt++;
> + e = strchr(opt, ',');
> + if ( !e )
> + e = strchr(opt, '\0');
> +
> + if ( !strncmp(opt, "share=", 6) )
> + {
> + int val = parse_bool(opt + 6, e);
> + if ( val == -1 && !cmdline_strcmp(opt + 6, "hwdom") )
Nit: Blank line please between declaration(s) and statement(s).
Any reason you're using parse_bool() and not parse_boolean() here?
That would save you the open-coded strncmp() afaict.
Finally a remark seeing the opt_dbgp use here and the identically
named option in ehci-dbgp.c, taken together with your multiple-
serial-consoles patch: Since the two option consumers are now
different, they can't sensibly coexist anymore. There were issues
already before - it doesn't seem to be possible this way to run
EHCI and XHCI based consoles in parallel. (An exceptional case
would be if <integer> for both was intended to be same number.)
IOW I think one of the options needs renaming; it was a mistake of
mine to not have pointed this out before committing patch 1.
Following the name of the source file as well as e.g. the title
here - maybe "dbc="?
Jan
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |