[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 2/2] drivers/char: Use sub-page ro API to make just xhci dbc cap RO
On 27.03.2023 12:09, Marek Marczykowski-Górecki wrote: > ... not the whole page, which may contain other registers too. In fact > on Tiger Lake and newer (at least), this page do contain other registers > that Linux tries to use. And with share=yes, a domU would use them too. > Without this patch, PV dom0 would fail to initialize the controller, > while HVM would be killed on EPT violation. > > Signed-off-by: Marek Marczykowski-Górecki <marmarek@xxxxxxxxxxxxxxxxxxxxxx> > --- > xen/drivers/char/xhci-dbc.c | 38 ++++++++++++++++++++++++++++++++++++-- > 1 file changed, 36 insertions(+), 2 deletions(-) > > diff --git a/xen/drivers/char/xhci-dbc.c b/xen/drivers/char/xhci-dbc.c > index 60b781f87202..df2524b0ca18 100644 > --- a/xen/drivers/char/xhci-dbc.c > +++ b/xen/drivers/char/xhci-dbc.c > @@ -1226,9 +1226,43 @@ static void __init cf_check > dbc_uart_init_postirq(struct serial_port *port) > uart->dbc.xhc_dbc_offset), > PFN_UP((uart->dbc.bar_val & PCI_BASE_ADDRESS_MEM_MASK) + > uart->dbc.xhc_dbc_offset + > - sizeof(*uart->dbc.dbc_reg)) - 1) ) > - printk(XENLOG_INFO > + sizeof(*uart->dbc.dbc_reg)) - 1) ) { Nit: No need for a brace here (and certainly not a misplaced one). > + printk(XENLOG_WARNING This log level change looks kind of unrelated. > "Error while adding MMIO range of device to > mmio_ro_ranges\n"); > + } > + else > + { > + unsigned long dbc_regs_start = (uart->dbc.bar_val & > + PCI_BASE_ADDRESS_MEM_MASK) + uart->dbc.xhc_dbc_offset; > + unsigned long dbc_regs_end = dbc_regs_start + > sizeof(*uart->dbc.dbc_reg); > + > + /* This being smaller than a page simplifies conditions below */ > + BUILD_BUG_ON(sizeof(*uart->dbc.dbc_reg) >= PAGE_SIZE - 1); Why PAGE_SIZE - 1 (or why >= instead of > )? If there is a reason, then the comment wants to be in sync. > + if ( dbc_regs_start & (PAGE_SIZE - 1) || Nit: Please parenthesize the & against the || (similarly again below). Like asked by Roger for patch 1 (iirc), here and below please use PAGE_OFFSET() in favor of (kind of) open-coding it. > + PFN_DOWN(dbc_regs_start) == PFN_DOWN(dbc_regs_end) ) Nit: Style (indentation). > + { > + if ( subpage_mmio_ro_add( > + _mfn(PFN_DOWN(dbc_regs_start)), > + dbc_regs_start & (PAGE_SIZE - 1), > + PFN_DOWN(dbc_regs_start) == PFN_DOWN(dbc_regs_end) > + ? dbc_regs_end & (PAGE_SIZE - 1) > + : PAGE_SIZE - 1, > + FIX_XHCI_END) ) Nit: I think this is too deep a level of indentation; it should be a single level (4 blanks) from the start of the function name (also again another time below). > + printk(XENLOG_WARNING > + "Error while adding MMIO range of device to > subpage_mmio_ro\n"); Nit: Style (indentation). > + } > + if ( dbc_regs_end & (PAGE_SIZE - 1) && > + PFN_DOWN(dbc_regs_start) != PFN_DOWN(dbc_regs_end) ) > + { > + if ( subpage_mmio_ro_add( > + _mfn(PFN_DOWN(dbc_regs_end)), > + 0, > + dbc_regs_end & (PAGE_SIZE - 1), > + FIX_XHCI_END + PFN_DOWN(sizeof(*uart->dbc.dbc_reg))) > ) > + printk(XENLOG_WARNING > + "Error while adding MMIO range of device to > subpage_mmio_ro\n"); > + } > + } Seeing the uses it occurs to me that the interface is somewhat odd: It adds a r/o range to a page that is already recorded to be r/o. It would imo be more logical the other way around: To add an exception (writable) range. The only alternative would be to include the call to rangeset_add_range(mmio_ro_ranges, ...) as part of the new function, and reduce accordingly the range passed earlier in the function. But I think this would needlessly complicate the code there. Jan
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |