|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 15/25] arm/altp2m: Extend __p2m_lookup.
Hi Julien,
On 08/04/2016 02:04 PM, Julien Grall wrote:
> Hello Sergej,
>
> On 01/08/16 18:10, Sergej Proskurin wrote:
>> This commit extends the functionality of the function "__p2m_lookup".
>> The function "__p2m_lookup" performs the necessary steps gathering
>> information concerning memory attributes and the p2m table level a
>> specific gfn is mapped to. Thus, we extend the function's prototype so
>> that the caller can optionally get these information for further
>> processing.
>>
>> Also, we extend the function prototype of "__p2m_lookup" to hold an
>> argument of type "struct p2m_domain*", as we need to distinguish between
>> the host's p2m and different altp2m views. While doing so, we needed to
>> extend the function's prototypes of the following functions:
>>
>> * __p2m_get_mem_access
>> * p2m_mem_access_and_get_page
>>
>> Signed-off-by: Sergej Proskurin <proskurin@xxxxxxxxxxxxx>
>> ---
>> Cc: Stefano Stabellini <sstabellini@xxxxxxxxxx>
>> Cc: Julien Grall <julien.grall@xxxxxxx>
>> ---
>> xen/arch/arm/p2m.c | 59
>> ++++++++++++++++++++++++++++++++++++------------------
>> 1 file changed, 39 insertions(+), 20 deletions(-)
>>
>> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
>> index 784f8da..326e343 100644
>> --- a/xen/arch/arm/p2m.c
>> +++ b/xen/arch/arm/p2m.c
>> @@ -168,15 +168,22 @@ void p2m_flush_tlb(struct p2m_domain *p2m)
>> }
>> }
>>
>> +static int __p2m_get_mem_access(struct p2m_domain*, gfn_t,
>> xenmem_access_t*);
>> +
>> /*
>> * Lookup the MFN corresponding to a domain's GFN.
>> *
>> * There are no processor functions to do a stage 2 only lookup
>> therefore we
>> * do a a software walk.
>> + *
>> + * Optionally, __p2m_lookup takes arguments to provide information
>> about the
>> + * p2m type, the p2m table level the paddr is mapped to, associated mem
>> + * attributes, and memory access rights.
>> */
>> -static mfn_t __p2m_lookup(struct domain *d, gfn_t gfn, p2m_type_t *t)
>> +static mfn_t __p2m_lookup(struct p2m_domain *p2m, gfn_t gfn,
>> p2m_type_t *t,
>> + unsigned int *level, unsigned int *mattr,
>> + xenmem_access_t *xma)
>
> Please give a look at my series "xen/arm: Rework the P2M code to
> follow break-before-make sequence" [1], it will expose a clean
> interface to retrieve all the necessary information.
>
Alright, thank you.
>> mfn_t p2m_lookup(struct domain *d, gfn_t gfn, p2m_type_t *t)
>> {
>> mfn_t ret;
>> - struct p2m_domain *p2m = &d->arch.p2m;
>> + struct p2m_domain *p2m = p2m_get_hostp2m(d);
>>
>> p2m_read_lock(p2m);
>> - ret = __p2m_lookup(d, gfn, t);
>> + ret = __p2m_lookup(p2m, gfn, t, NULL, NULL, NULL);
>> p2m_read_unlock(p2m);
>>
>> return ret;
>> @@ -479,10 +499,9 @@ static int p2m_create_table(struct p2m_domain
>> *p2m, lpae_t *entry,
>> return 0;
>> }
>>
>> -static int __p2m_get_mem_access(struct domain *d, gfn_t gfn,
>> +static int __p2m_get_mem_access(struct p2m_domain *p2m, gfn_t gfn,
>> xenmem_access_t *access)
>> {
>> - struct p2m_domain *p2m = p2m_get_hostp2m(d);
>> void *i;
>> unsigned int index;
>>
>> @@ -525,7 +544,7 @@ static int __p2m_get_mem_access(struct domain *d,
>> gfn_t gfn,
>> * No setting was found in the Radix tree. Check if the
>> * entry exists in the page-tables.
>> */
>> - mfn_t mfn = __p2m_lookup(d, gfn, NULL);
>> + mfn_t mfn = __p2m_lookup(p2m, gfn, NULL, NULL, NULL, NULL);
>>
>> if ( mfn_eq(mfn, INVALID_MFN) )
>> return -ESRCH;
>> @@ -1519,7 +1538,7 @@ mfn_t gfn_to_mfn(struct domain *d, gfn_t gfn)
>> * we indeed found a conflicting mem_access setting.
>> */
>> static struct page_info*
>> -p2m_mem_access_check_and_get_page(vaddr_t gva, unsigned long flag)
>> +p2m_mem_access_check_and_get_page(struct p2m_domain *p2m, vaddr_t
>> gva, unsigned long flag)
>> {
>> long rc;
>> paddr_t ipa;
>> @@ -1539,7 +1558,7 @@ p2m_mem_access_check_and_get_page(vaddr_t gva,
>> unsigned long flag)
>> * We do this first as this is faster in the default case when no
>> * permission is set on the page.
>> */
>> - rc = __p2m_get_mem_access(current->domain, gfn, &xma);
>> + rc = __p2m_get_mem_access(p2m, gfn, &xma);
>> if ( rc < 0 )
>> goto err;
>>
>> @@ -1588,7 +1607,7 @@ p2m_mem_access_check_and_get_page(vaddr_t gva,
>> unsigned long flag)
>> * We had a mem_access permission limiting the access, but the
>> page type
>> * could also be limiting, so we need to check that as well.
>> */
>> - mfn = __p2m_lookup(current->domain, gfn, &t);
>> + mfn = __p2m_lookup(p2m, gfn, &t, NULL, NULL, NULL);
>> if ( mfn_eq(mfn, INVALID_MFN) )
>> goto err;
>>
>> @@ -1671,7 +1690,7 @@ struct page_info *get_page_from_gva(struct vcpu
>> *v, vaddr_t va,
>>
>> err:
>> if ( !page && p2m->mem_access_enabled )
>> - page = p2m_mem_access_check_and_get_page(va, flags);
>> + page = p2m_mem_access_check_and_get_page(p2m, va, flags);
>
> p2m_mem_access_check_and_get_page should take a vCPU in parameter and
> not a p2m.
>
> I know the function is already buggy because it assumes that the vCPU
> == current. But let's not broken more this function.
>
Alright.
>>
>> p2m_read_unlock(p2m);
>>
>> @@ -1948,7 +1967,7 @@ int p2m_get_mem_access(struct domain *d, gfn_t
>> gfn,
>> struct p2m_domain *p2m = p2m_get_hostp2m(d);
>>
>> p2m_read_lock(p2m);
>> - ret = __p2m_get_mem_access(d, gfn, access);
>> + ret = __p2m_get_mem_access(p2m, gfn, access);
>> p2m_read_unlock(p2m);
>>
>> return ret;
>>
>
> Regards,
>
> [1]
> https://lists.xenproject.org/archives/html/xen-devel/2016-07/msg02952.html
>
Best regards,
~Sergej
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |