diff mbox

[v2,8/8] xen/arm: p2m_cache_flush: Use the correct terminology and typesafe gfn

Message ID 1466429845-28240-9-git-send-email-julien.grall@arm.com (mailing list archive)
State New, archived
Headers show

Commit Message

Julien Grall June 20, 2016, 1:37 p.m. UTC
p2m_cache_flush is expecting GFNs in parameter and not MFNs. Rename
the variable to *gfn* and use typesafe to avoid possible misusage.

Signed-off-by: Julien Grall <julien.grall@arm.com>

---
    Changes in v2:
        - Drop _gfn suffix
---
 xen/arch/arm/domctl.c     |  2 +-
 xen/arch/arm/p2m.c        | 10 +++++-----
 xen/include/asm-arm/p2m.h |  2 +-
 3 files changed, 7 insertions(+), 7 deletions(-)

Comments

Andrew Cooper June 20, 2016, 2:53 p.m. UTC | #1
On 20/06/16 14:37, Julien Grall wrote:
> p2m_cache_flush is expecting GFNs in parameter and not MFNs. Rename
> the variable to *gfn* and use typesafe to avoid possible misusage.
>
> Signed-off-by: Julien Grall <julien.grall@arm.com>

On arm32, xen_pfn_t was uint64_t, but gfn_t is unsigned long.

Is the truncation ok?

~Andrew
Julien Grall June 20, 2016, 3:03 p.m. UTC | #2
Hi Andrew,

On 20/06/16 15:53, Andrew Cooper wrote:
> On 20/06/16 14:37, Julien Grall wrote:
>> p2m_cache_flush is expecting GFNs in parameter and not MFNs. Rename
>> the variable to *gfn* and use typesafe to avoid possible misusage.
>>
>> Signed-off-by: Julien Grall <julien.grall@arm.com>
>
> On arm32, xen_pfn_t was uint64_t, but gfn_t is unsigned long.
>
> Is the truncation ok?

The PFN will be encoded on 28 bits maximum (40 bits address). Unless we 
want to check that the guest effectively zeroed the unused bits, I think 
the truncation is fine.

FWIW, this is not the only place where the truncation xen_pfn_t  (aka 
uin64_t) -> unsigned long happens.

Regards,
Andrew Cooper June 20, 2016, 3:36 p.m. UTC | #3
On 20/06/16 16:03, Julien Grall wrote:
> Hi Andrew,
>
> On 20/06/16 15:53, Andrew Cooper wrote:
>> On 20/06/16 14:37, Julien Grall wrote:
>>> p2m_cache_flush is expecting GFNs in parameter and not MFNs. Rename
>>> the variable to *gfn* and use typesafe to avoid possible misusage.
>>>
>>> Signed-off-by: Julien Grall <julien.grall@arm.com>
>>
>> On arm32, xen_pfn_t was uint64_t, but gfn_t is unsigned long.
>>
>> Is the truncation ok?
>
> The PFN will be encoded on 28 bits maximum (40 bits address). Unless
> we want to check that the guest effectively zeroed the unused bits, I
> think the truncation is fine.

Ok - I was just checking that it wasn't happening accidentally.

~Andrew
Julien Grall June 20, 2016, 3:37 p.m. UTC | #4
On 20/06/16 16:36, Andrew Cooper wrote:
> On 20/06/16 16:03, Julien Grall wrote:
>> Hi Andrew,
>>
>> On 20/06/16 15:53, Andrew Cooper wrote:
>>> On 20/06/16 14:37, Julien Grall wrote:
>>>> p2m_cache_flush is expecting GFNs in parameter and not MFNs. Rename
>>>> the variable to *gfn* and use typesafe to avoid possible misusage.
>>>>
>>>> Signed-off-by: Julien Grall <julien.grall@arm.com>
>>>
>>> On arm32, xen_pfn_t was uint64_t, but gfn_t is unsigned long.
>>>
>>> Is the truncation ok?
>>
>> The PFN will be encoded on 28 bits maximum (40 bits address). Unless
>> we want to check that the guest effectively zeroed the unused bits, I
>> think the truncation is fine.
>
> Ok - I was just checking that it wasn't happening accidentally.

I will mention it in the commit message.

Cheers,
diff mbox

Patch

diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c
index 30453d8..b94e97c 100644
--- a/xen/arch/arm/domctl.c
+++ b/xen/arch/arm/domctl.c
@@ -30,7 +30,7 @@  long arch_do_domctl(struct xen_domctl *domctl, struct domain *d,
         if ( e < s )
             return -EINVAL;
 
-        return p2m_cache_flush(d, s, e);
+        return p2m_cache_flush(d, _gfn(s), _gfn(e));
     }
     case XEN_DOMCTL_bind_pt_irq:
     {
diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index f3330dd..9149981 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -1469,16 +1469,16 @@  int relinquish_p2m_mapping(struct domain *d)
                               d->arch.p2m.default_access);
 }
 
-int p2m_cache_flush(struct domain *d, xen_pfn_t start_mfn, xen_pfn_t end_mfn)
+int p2m_cache_flush(struct domain *d, gfn_t start, gfn_t end)
 {
     struct p2m_domain *p2m = &d->arch.p2m;
 
-    start_mfn = MAX(start_mfn, p2m->lowest_mapped_gfn);
-    end_mfn = MIN(end_mfn, p2m->max_mapped_gfn);
+    start = gfn_max(start, _gfn(p2m->lowest_mapped_gfn));
+    end = gfn_min(end, _gfn(p2m->max_mapped_gfn));
 
     return apply_p2m_changes(d, CACHEFLUSH,
-                             pfn_to_paddr(start_mfn),
-                             pfn_to_paddr(end_mfn),
+                             pfn_to_paddr(gfn_x(start)),
+                             pfn_to_paddr(gfn_x(end)),
                              pfn_to_paddr(INVALID_MFN),
                              MATTR_MEM, 0, p2m_invalid,
                              d->arch.p2m.default_access);
diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
index f204482..976e51e 100644
--- a/xen/include/asm-arm/p2m.h
+++ b/xen/include/asm-arm/p2m.h
@@ -139,7 +139,7 @@  void p2m_dump_info(struct domain *d);
 mfn_t p2m_lookup(struct domain *d, gfn_t gfn, p2m_type_t *t);
 
 /* Clean & invalidate caches corresponding to a region of guest address space */
-int p2m_cache_flush(struct domain *d, xen_pfn_t start_mfn, xen_pfn_t end_mfn);
+int p2m_cache_flush(struct domain *d, gfn_t start, gfn_t end);
 
 /* Setup p2m RAM mapping for domain d from start-end. */
 int p2m_populate_ram(struct domain *d, paddr_t start, paddr_t end);