|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: [XEN PATCH v5] hvmloader: Enable MMIO and I/O decode, after all resource allocation
> -----Original Message-----
> From: Xen-devel <xen-devel-bounces@xxxxxxxxxxxxxxxxxxxx> On Behalf Of Harsha
> Shamsundara Havanur
> Sent: 15 April 2020 13:28
> To: xen-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Wei Liu <wl@xxxxxxx>; Andrew Cooper <andrew.cooper3@xxxxxxxxxx>; Ian
> Jackson
> <ian.jackson@xxxxxxxxxxxxx>; Jan Beulich <jbeulich@xxxxxxxx>; Harsha
> Shamsundara Havanur
> <havanur@xxxxxxxxxx>; Roger Pau Monné <roger.pau@xxxxxxxxxx>
> Subject: [XEN PATCH v5] hvmloader: Enable MMIO and I/O decode, after all
> resource allocation
>
> It was observed that PCI MMIO and/or IO BARs were programmed with
> memory and I/O decodes (bits 0 and 1 of PCI COMMAND register) enabled,
> during PCI setup phase. This resulted in incorrect memory mapping as
> soon as the lower half of the 64 bit bar is programmed.
> This displaced any RAM mappings under 4G. After the
> upper half is programmed PCI memory mapping is restored to its
> intended high mem location, but the RAM displaced is not restored.
> The OS then continues to boot and function until it tries to access
> the displaced RAM at which point it suffers a page fault and crashes.
>
> This patch address the issue by deferring enablement of memory and
> I/O decode in command register until all the resources, like interrupts
> I/O and/or MMIO BARs for all the PCI device functions are programmed,
> in the descending order of memory requested.
>
> Signed-off-by: Harsha Shamsundara Havanur <havanur@xxxxxxxxxx>
>
> ---
> Changes in v5:
> - Fix style and comment
> - Enable Bus master for all valid device functions
>
> Changes in v4:
> Addressed review comments from Jan Beulich <jbeulich@xxxxxxxx>
> - Disable decodes before writing ~0 to BARs
> - Enable BUS MASTER at the end along with decode bits
>
> Changes in v3:
> - Retained enabling of BUS master for all device functions as
> was in original commit
>
> Changes in v2:
> - BUS MASTER state was captured and restored to the same state
> while enabling decode bits.
> ---
> ---
> tools/firmware/hvmloader/pci.c | 49
> +++++++++++++++++++++++++++++++-----------
> 1 file changed, 36 insertions(+), 13 deletions(-)
>
> diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
> index 0b708bf578..47cba69ce4 100644
> --- a/tools/firmware/hvmloader/pci.c
> +++ b/tools/firmware/hvmloader/pci.c
> @@ -84,6 +84,7 @@ void pci_setup(void)
> uint32_t vga_devfn = 256;
> uint16_t class, vendor_id, device_id;
> unsigned int bar, pin, link, isa_irq;
> + uint8_t pci_devfn_decode_type[256] = {};
>
> /* Resources assignable to PCI devices via BARs. */
> struct resource {
> @@ -120,6 +121,13 @@ void pci_setup(void)
> */
> bool allow_memory_relocate = 1;
>
> + BUILD_BUG_ON((typeof(*pci_devfn_decode_type))PCI_COMMAND_IO !=
> + PCI_COMMAND_IO);
> + BUILD_BUG_ON((typeof(*pci_devfn_decode_type))PCI_COMMAND_MEMORY !=
> + PCI_COMMAND_MEMORY);
> + BUILD_BUG_ON((typeof(*pci_devfn_decode_type))PCI_COMMAND_MASTER !=
> + PCI_COMMAND_MASTER);
> +
These don't align. Looks like you used an indent of 8 which seems entirely
arbitrary.
The rest LGTM.
Paul
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |