Re: [PATCH 1/3] PCI: iproc: fix out of bound array access

From: Bjorn Helgaas
Date: Thu Mar 26 2020 - 16:48:11 EST


On Thu, Mar 26, 2020 at 01:27:36PM -0700, Ray Jui wrote:
> On 3/26/2020 12:48 PM, Bjorn Helgaas wrote:
> > ...
> > It's outside the scope of this patch, but I'm not really a fan of the
> > pcie->reg_offsets[] scheme this driver uses to deal with these
> > differences. There usually seems to be *something* that keeps the
> > driver from referencing registers that don't exist, but it doesn't
> > seem like the mechanism is very consistent or robust:
> >
> > - IPROC_PCIE_LINK_STATUS is implemented by PAXB but not PAXC.
> > iproc_pcie_check_link() avoids using it if "ep_is_internal", which
> > is set for PAXC and PAXC_V2. Not an obvious connection.
> >
> > - IPROC_PCIE_CLK_CTRL is implemented for PAXB and PAXC_V1, but not
> > PAXC_V2. iproc_pcie_perst_ctrl() avoids using it ep_is_internal",
> > so it *doesn't* use it for PAXC_V1, which does implement it.
> > Maybe a bug, maybe intentional; I can't tell.
> >
> > - IPROC_PCIE_INTX_EN is only implemented by PAXB (not PAXC), but
> > AFAICT, we always call iproc_pcie_enable() and rely on
> > iproc_pcie_write_reg() silently drop the write to it on PAXC.
> >
> > - IPROC_PCIE_OARR0 is implemented by PAXB and PAXB_V2 and used by
> > iproc_pcie_map_ranges(), which is called if "need_ob_cfg", which
> > is set if there's a "brcm,pcie-ob" DT property. No clear
> > connection to PAXB.
> >
> > I think it would be more readable if we used a single variant
> > identifier consistently, e.g., the "pcie->type" already used in
> > iproc_pcie_msi_steer(), or maybe a set of variant-specific function
> > pointers as pcie-qcom.c does.
>
> It is not possible to use a single variant identifier consistently,
> i.e., 'pcie->type'. Many of these features are controller revision
> specific, and certain revisions of the controllers may all have a
> certain feature, while other revisions of the controllers do not. In
> addition, there are overlap in features across different controllers.
>
> IMO, it makes sense to have feature specific flags or booleans, and have
> those features enabled or disabled based on 'pcie->type', which is what
> the current driver does, but like you pointed out, what the driver
> failed is to do this consistently.

There are several drivers that have the same problem of dealing with
different revisions of hardware. It would be nice to do it in a
consistent style, whatever that is.

> The IPROC_PCIE_INTX_EN example you pointed out is a good example. I
> agree with you that we shouldn't rely on iproc_pcie_write_reg to
> silently drop the operation for PAXC. We should add code to make it
> explictly obvious that legacy interrupt is not supported in all PAXC
> controllers.
>
> pcie->pcie->reg_offsets[] scheme was not intended to be used to silently
> drop register access that are activated based on features. It's a
> mistake that should be fixed if some code in the driver is done that
> way, as you pointed out.

That's actually why I dug into this a bit -- the
iproc_pcie_reg_is_invalid() case is really a design-time error, so it
seemed like there should be a WARN() there instead of silently
returning 0 or ignoring a write.

Bjorn