[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH 1/4] xen/uart: be more careful with changes to the PCI command register


  • To: Jan Beulich <jbeulich@xxxxxxxx>
  • From: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • Date: Fri, 27 Mar 2026 09:14:15 +0100
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=citrix.com; dmarc=pass action=none header.from=citrix.com; dkim=pass header.d=citrix.com; arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=HjdDxTpWumEmfH0pI7JNY96NwPFteWjL7Ie4XZQQ3ww=; b=Tx3rjqu4Lde2E8e88IsAlORaukQ+nuSMj/5/78YO5NrZLSqioa9fV8/XPRKDfcZYjexUoipNF5qDu4wZmLrg5+vgc5twlrJ9rzUyjFEEXjNwE09EhDnpmXifTkFL2FHc5+Lbq8bxDih6WaBWUV5YXuiJ6Rf1W+32OJmFQuHx8CmMA9EwdkDFVN9mexocRmYRwYIfb9P5hpc3ycsXgTYa8zLO37u5SKqQH3nmCXzwGS12em+krJWnTGkrq8H/92YajnnA/zgiINsHstvB13HCvLJAsWTCyC5DKfkSsK+9nTloGO/4aNny8xa5nUpCvPd1lio0fGxlx/1qBJi1HzTGFQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=oa28S9416hr+vkBHwh1d0+0A5g+ZSafZa+wWGmI4mGW/uzQQxad/ahQIrDJnau8nhLNlE3mZ/mvo3tCMgJ+10kgYJ0PgOqb698rGFAV6i0lyI196YyP1EnYrI7VuUI205+2b5Vd9ZZMhrPaNCrLleRpDASXkaKfNWwTMk70Fs1AlPnDMn8rEFlvdBxqKlSCLHv1WdckHTrIG+S6bIMSHzxDsGlFhGFOuuJ8nKGS0r9siy5/9NYXzoAHXtdkOd0XxzK2r2QzZsHMyRGWuzhfIlLGkO0myuqdgOPIScbT8GPNXJRhtdsIvAEUHVHFRipD0jCY9mS4URWa240TkHCNYZw==
  • Authentication-results: eu.smtp.expurgate.cloud; dkim=pass header.s=selector1 header.d=citrix.com header.i="@citrix.com" header.h="From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck"
  • Authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=citrix.com;
  • Cc: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>, Anthony PERARD <anthony.perard@xxxxxxxxxx>, Michal Orzel <michal.orzel@xxxxxxx>, Julien Grall <julien@xxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, xen-devel@xxxxxxxxxxxxxxxxxxxx
  • Delivery-date: Fri, 27 Mar 2026 08:14:33 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On Fri, Mar 27, 2026 at 08:59:29AM +0100, Jan Beulich wrote:
> On 26.03.2026 18:02, Roger Pau Monné wrote:
> > On Thu, Mar 26, 2026 at 05:00:15PM +0100, Jan Beulich wrote:
> >> On 26.03.2026 16:13, Roger Pau Monné wrote:
> >>> On Thu, Mar 26, 2026 at 01:02:22PM +0100, Jan Beulich wrote:
> >>>> On 25.03.2026 15:58, Roger Pau Monne wrote:
> >>>>> Read the existing PCI command register and only add the required bits to
> >>>>> it, as to avoid clearing bits that might be possibly set by the firmware
> >>>>> already.
> >>>>>
> >>>>> This fixes serial output when booting with `com1=device=amt` on a system
> >>>>> using an "Alder Lake AMT SOL Redirection" PCI device (Vendor ID 0x8086 
> >>>>> and
> >>>>> Device ID 0x51e3).  That device has both IO and memory decoding enabled 
> >>>>> by
> >>>>> the firmware, and disabling memory decoding causes the serial to stop
> >>>>> working (even when the serial register BAR is in the IO space).
> >>>>>
> >>>>> Fixes: f2ff5d6628b3 ("ns16550: enable PCI serial card usage")
> >>>>> Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
> >>>>
> >>>> I'm not convinced Fixes: is appropriate here. There's nothing wrong with 
> >>>> that
> >>>> commit, aiui. What's bogus is the device behavior.
> >>>
> >>> Hm, I would argue that disabling command register bits for devices
> >>> that have those enabled is in general dangerous.  What about device
> >>> RMRR or similar residing in BARs, and Xen disabling memory decoding
> >>> unintentionally while attempting to enable IO decoding?
> >>
> >> RMRRs in BARs seems unlikely (as BARs can be moved), but you have a
> >> point in general. Otoh devices are fully under our (later under Dom0's)
> >> control, so we may clear (or set) bits as we see fit to get a device
> >> to function. FTAOD, I'm not outright objecting to the tag, I'm merely
> >> questioning it some.
> >>
> >>>>> --- a/xen/drivers/char/ns16550.c
> >>>>> +++ b/xen/drivers/char/ns16550.c
> >>>>> @@ -283,11 +283,17 @@ static int cf_check ns16550_getc(struct 
> >>>>> serial_port *port, char *pc)
> >>>>>  static void pci_serial_early_init(struct ns16550 *uart)
> >>>>>  {
> >>>>>  #ifdef NS16550_PCI
> >>>>> +    uint16_t cmd = 0;
> >>>>> +
> >>>>> +    if ( uart->ps_bdf_enable )
> >>>>> +        cmd = pci_conf_read16(PCI_SBDF(0, uart->ps_bdf[0], 
> >>>>> uart->ps_bdf[1],
> >>>>> +                                       uart->ps_bdf[2]), PCI_COMMAND);
> >>>>
> >>>> Why is this conditional? While fine for the use at the bottom, ...
> >>>
> >>> The comment next to the field states:
> >>>
> >>>     bool ps_bdf_enable;     /* if =1, ps_bdf effective, port on pci card 
> >>> */
> >>>
> >>> So it didn't seem like further checking was needed and that was the
> >>> sole filed to decide whether ps_bdf is populated or not.
> >>>
> >>> However, I also found that when using device=amt|pci ps_bdf_enable
> >>> doesn't get set, and hence I'm not sure if that's intended or not.
> >>> Shouldn't ps_bdf_enable get set unconditionally when the serial device
> >>> is a PCI one?
> >>
> >> I think this was deliberate, hence why ...
> >>
> >>>>>      if ( uart->bar && uart->io_base >= 0x10000 )
> >>>>>      {
> >>>>>          pci_conf_write16(PCI_SBDF(0, uart->ps_bdf[0], uart->ps_bdf[1],
> >>>>>                                    uart->ps_bdf[2]),
> >>>>> -                         PCI_COMMAND, PCI_COMMAND_MEMORY);
> >>>>> +                         PCI_COMMAND, cmd | PCI_COMMAND_MEMORY);
> >>>>>          return;
> >>>>>      }
> >>>>
> >>>> ... it looks wrong(ish) for this path. Actually, in 
> >>>> ns16550_init_postirq()
> >>>> we use
> >>>>     if ( uart->bar || uart->ps_bdf_enable )
> >>
> >> ... this conditional is now in use.
> > 
> > Right, but then the logic in pci_serial_early_init() doesn't apply to
> > those devices (device=amt|pci) when the BARs are in IO space?
> > 
> > As uart->ps_bdf_enable == false, and uart->io_base < 0x10000, it will
> > return early from the function without attempting to enable the IO
> > BAR.  Is this really expected?  It looks like Xen should always make
> > sure the respective BARs are enabled if the device is to be used for
> > serial output?
> 
> I agree. Many of the changes were hacked in just to make someone's
> device work, without having general aspects in mind. I expect most if
> not all checks of ->ps_bdf_enable want amending by adding ->bar ones.

Wouldn't it be easier to unconditionally set ->ps_bdf_enable when a
PCI device is being used?  I find it confusing that there are two
different fields (->ps_bdf_enable and ->bar) that signal whether a PCI
device is in-use.

Thanks, Roger.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.