|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/3] xen/vpci: msix: move x86 specific code to x86 file
Hi Roger,
> On 9 Mar 2022, at 10:16 am, Roger Pau Monné <roger.pau@xxxxxxxxxx> wrote:
>
> On Wed, Mar 09, 2022 at 10:08:12AM +0000, Rahul Singh wrote:
>> Hi Jan,
>>
>>> On 4 Mar 2022, at 7:23 am, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>>>
>>> On 03.03.2022 17:31, Rahul Singh wrote:
>>>>> On 1 Mar 2022, at 1:55 pm, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>>>>> On 01.03.2022 14:34, Rahul Singh wrote:
>>>>>>> On 24 Feb 2022, at 2:57 pm, Jan Beulich <jbeulich@xxxxxxxx> wrote:
>>>>>>> On 15.02.2022 16:25, Rahul Singh wrote:
>>>>>>>> --- a/xen/arch/x86/hvm/vmsi.c
>>>>>>>> +++ b/xen/arch/x86/hvm/vmsi.c
>>>>>>>> @@ -925,4 +925,106 @@ int vpci_msix_arch_print(const struct vpci_msix
>>>>>>>> *msix)
>>>>>>>>
>>>>>>>> return 0;
>>>>>>>> }
>>>>>>>> +
>>>>>>>> +int vpci_make_msix_hole(const struct pci_dev *pdev)
>>>>>>>> +{
>>>>>>>> + struct domain *d = pdev->domain;
>>>>>>>> + unsigned int i;
>>>>>>>> +
>>>>>>>> + if ( !pdev->vpci->msix )
>>>>>>>> + return 0;
>>>>>>>> +
>>>>>>>> + /* Make sure there's a hole for the MSIX table/PBA in the p2m. */
>>>>>>>> + for ( i = 0; i < ARRAY_SIZE(pdev->vpci->msix->tables); i++ )
>>>>>>>> + {
>>>>>>>> + unsigned long start = PFN_DOWN(vmsix_table_addr(pdev->vpci,
>>>>>>>> i));
>>>>>>>> + unsigned long end = PFN_DOWN(vmsix_table_addr(pdev->vpci, i) +
>>>>>>>> + vmsix_table_size(pdev->vpci, i)
>>>>>>>> - 1);
>>>>>>>> +
>>>>>>>> + for ( ; start <= end; start++ )
>>>>>>>> + {
>>>>>>>> + p2m_type_t t;
>>>>>>>> + mfn_t mfn = get_gfn_query(d, start, &t);
>>>>>>>> +
>>>>>>>> + switch ( t )
>>>>>>>> + {
>>>>>>>> + case p2m_mmio_dm:
>>>>>>>> + case p2m_invalid:
>>>>>>>> + break;
>>>>>>>> + case p2m_mmio_direct:
>>>>>>>> + if ( mfn_x(mfn) == start )
>>>>>>>> + {
>>>>>>>> + clear_identity_p2m_entry(d, start);
>>>>>>>> + break;
>>>>>>>> + }
>>>>>>>> + /* fallthrough. */
>>>>>>>> + default:
>>>>>>>> + put_gfn(d, start);
>>>>>>>> + gprintk(XENLOG_WARNING,
>>>>>>>> + "%pp: existing mapping (mfn: %" PRI_mfn
>>>>>>>> + "type: %d) at %#lx clobbers MSIX MMIO area\n",
>>>>>>>> + &pdev->sbdf, mfn_x(mfn), t, start);
>>>>>>>> + return -EEXIST;
>>>>>>>> + }
>>>>>>>> + put_gfn(d, start);
>>>>>>>> + }
>>>>>>>> + }
>>>>>>>> +
>>>>>>>> + return 0;
>>>>>>>> +}
>>>>>>>
>>>>>>> ... nothing in this function looks to be x86-specific, except maybe
>>>>>>> functions like clear_identity_p2m_entry() may not currently be available
>>>>>>> on Arm. But this doesn't make the code x86-specific.
>>>>>>
>>>>>> I will maybe be wrong but what I understand from the code is that for
>>>>>> x86
>>>>>> if there is no p2m entries setup for the region, accesses to them will
>>>>>> be trapped
>>>>>> into the hypervisor and can be handled by specific MMIO handler.
>>>>>>
>>>>>> But for ARM when we are registering the MMIO handler we have to provide
>>>>>> the GPA also for the MMIO handler.
>
> Right, but you still need those regions to not be mapped on the second
> stage translation, or else no trap will be triggered and thus the
> handlers won't run?
>
> Regardless of whether the way to register the handlers is different on
> Arm and x86, you still need to assure that the MSI-X related tables
> are not mapped on the guest second stage translation, or else you are
> just allowing guest access to the native ones.
What I understand from the VPCI code we are not mapping the MSI-X related
tables/BAR
to Stage-2 translation therefore no need to remove the mapping.
http://xenbits.xen.org/gitweb/?p=xen.git;a=blob;f=xen/drivers/vpci/header.c;h=a1c928a0d26f5cefd98727ee37f5dc43ceba80a6;hb=HEAD#l248
>
> So you do need this function on Arm in order to prevent hardware MSI-X
> tables being accessed by the guest. Or are you suggesting it's
> intended for Arm guest to access the native MSI-X tables?
On ARM also access to the MSI-X tables will be trapped and physical MSI-X table
will be updated accordingly.
Regards,
Rahul
>
> Thanks, Roger.
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |