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

Re: [PATCH] xen/arm: pci: fix check in pci_check_bar()


  • To: Roger Pau Monné <roger.pau@xxxxxxxxxx>
  • From: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
  • Date: Tue, 11 Jul 2023 14:53:41 -0400
  • Arc-authentication-results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 165.204.84.17) smtp.rcpttodomain=citrix.com smtp.mailfrom=amd.com; dmarc=pass (p=quarantine sp=quarantine pct=100) action=none header.from=amd.com; dkim=none (message not signed); arc=none
  • Arc-message-signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=4H3bOjTKZb5489DnRXo1iL//HFnO6Y4ttyhtW93iCPc=; b=MFHSXuOSS1NkNp0UcO1WwWVxQM9o06tS0XX2MU3JLULLEcglso11QuAqmdHN6OaHPhHjSJk1Vw9poSBIXhsgWaSxsAdoSlfVZmPNzynd5fcHgRfkwjdc0nTKZsGlszCTW+CmuN5AKK6vI2damNzyV3crPoidI7tyPXbUvAjt1sB26zg8Ncq10bLxjr+1Jd5iX9veDK9lefJ58ejghuIVR6jl/QeQj3CMFq5qPuDuU9XkAK0CkYhcso2jNtZRXk+PNGeO6T+eIxrQdnpQSJINiV0BssInK5sLNOkwl2PCcfzbFZK3JyTbkPE+zvwsHTWvNyZRfvIFdbq53UnQweD/EQ==
  • Arc-seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hAxJ1AFu+fLKtlTYYczF1KEIosAnsqDhRrmT8EdXpneSo9vUtOcSHcQljsrqKJB4tNY4YD7jy09f2d7FZthTX42dzUBZie/kxAo2MqQKdQLcav7Zk4xWwPWXuS+28Cp/QxF8NYdn1fvnbBBZUGQOALCed9Ez4SQNX8VtW2CpEkCt/ielfNTYddyz4S30sSUXG3U6+KgF8u8J7IXgGfCmpNzbrUcq713Ml1THzNkdmSKuSv+P+P68+QFXhGL9xa1TgWkWkTMWh2D6T0bLYNLvFj/FFjEFuO8/GL0jUPakXHVuFzs8G8dwxnJfE5bkTFmrKlYTsGtGbLvewTmBooNNmA==
  • Cc: <xen-devel@xxxxxxxxxxxxxxxxxxxx>, Stefano Stabellini <sstabellini@xxxxxxxxxx>, Julien Grall <julien@xxxxxxx>, Bertrand Marquis <bertrand.marquis@xxxxxxx>, Volodymyr Babchuk <Volodymyr_Babchuk@xxxxxxxx>, Rahul Singh <rahul.singh@xxxxxxx>
  • Delivery-date: Tue, 11 Jul 2023 18:54:03 +0000
  • List-id: Xen developer discussion <xen-devel.lists.xenproject.org>

On 7/11/23 12:04, Roger Pau Monné wrote:
> On Tue, Jul 11, 2023 at 11:46:47AM -0400, Stewart Hildebrand wrote:
>> When mapping BARs for vPCI, it's valid for a BAR start address to equal the 
>> BAR
>> end address (i.e. s == e). However, pci_check_bar() currently returns false 
>> in
>> this case, which results in Xen not mapping the BAR. In this example boot 
>> log,
>> Linux has mapped the BARs, but since Xen did not map them, Linux encounters a
>> data abort and panics:
>>
>> [    2.593300] pci 0000:00:00.0: BAR 0: assigned [mem 0x50008000-0x50008fff]
>> [    2.593682] pci 0000:00:00.0: BAR 2: assigned [mem 0x50009000-0x50009fff]
>> [    2.594066] pci 0000:00:00.0: BAR 4: assigned [mem 0x5000a000-0x5000afff]
>> ...
>> [    2.810502] virtio-pci 0000:00:00.0: enabling device (0000 -> 0002)
>> (XEN) 0000:00:00.0: not mapping BAR [50008, 50008] invalid position
>> (XEN) 0000:00:00.0: not mapping BAR [50009, 50009] invalid position
>> (XEN) 0000:00:00.0: not mapping BAR [5000a, 5000a] invalid position
>> [    2.817502] virtio-pci 0000:00:00.0: virtio_pci: leaving for legacy driver
>> [    2.817853] virtio-pci 0000:00:00.0: enabling bus mastering
>> (XEN) arch/arm/traps.c:1992:d0v0 HSR=0x00000093010045 pc=0xffff8000089507d4 
>> gva=0xffff80000c46d012 gpa=0x00000050008012
>> [    2.818397] Unable to handle kernel ttbr address size fault at virtual 
>> address ffff80000c46d012
>> ...
>>
>> Fix this by changing the condition in pci_check_bar().
>>
>> Fixes: cc80e2bab0d0 ("xen/pci: replace call to is_memory_hole to 
>> pci_check_bar")
>> Signed-off-by: Stewart Hildebrand <stewart.hildebrand@xxxxxxx>
>> ---
>>  xen/arch/arm/pci/pci-host-common.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/xen/arch/arm/pci/pci-host-common.c 
>> b/xen/arch/arm/pci/pci-host-common.c
>> index 7cdfc89e5211..e0ec526f9776 100644
>> --- a/xen/arch/arm/pci/pci-host-common.c
>> +++ b/xen/arch/arm/pci/pci-host-common.c
>> @@ -406,7 +406,7 @@ bool pci_check_bar(const struct pci_dev *pdev, mfn_t 
>> start, mfn_t end)
>>          .is_valid = false
>>      };
>>
>> -    if ( s >= e )
>> +    if ( s > e )
> 
> I think you want to adjust e to include the full page, ie:
> 
> paddr_t e = mfn_to_maddr(end + 1) - 1;
> 
> As passing start == end should be assumed to cover a full page, and s
> == e won't be possible anymore.

Yes, I will do this. This will also increase the accuracy of the subsequent 
is_bar_valid check. Since can't add directly to a mfn_t, it will actually look 
like this:

paddr_t e = mfn_to_maddr(mfn_add(end, 1)) - 1;

> Adjusting the check to drop the equal is still good IMO.

Agreed, since e is still inclusive after applying your suggested math.



 


Rackspace

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