From: Julien Grall Date: Wed, 20 Jul 2016 16:10:44 +0000 (+0100) Subject: xen/arm: p2m: Pass the vCPU in parameter to get_page_from_gva X-Git-Tag: RELEASE-4.6.4~53 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=ad0e68e1524421f897b69b916fe900e6cf57c489;p=xen.git xen/arm: p2m: Pass the vCPU in parameter to get_page_from_gva The function get_page_from_gva translates a guest virtual address to a machine address. The translation involves the register VTTBR_EL2, TTBR0_EL1, TTBR1_EL1 and SCTLR_EL1. Whilst the first register is per domain (the p2m is common to every vCPUs), the last 3 are per-vCPU. Therefore, the function should take the vCPU in parameter and not the domain. Fixing the actual code path will be done a separate patch. Signed-off-by: Julien Grall Reviewed-by: Stefano Stabellini --- diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c index ce1c3c3dff..413125f02b 100644 --- a/xen/arch/arm/guestcopy.c +++ b/xen/arch/arm/guestcopy.c @@ -17,7 +17,7 @@ static unsigned long raw_copy_to_guest_helper(void *to, const void *from, unsigned size = min(len, (unsigned)PAGE_SIZE - offset); struct page_info *page; - page = get_page_from_gva(current->domain, (vaddr_t) to, GV2M_WRITE); + page = get_page_from_gva(current, (vaddr_t) to, GV2M_WRITE); if ( page == NULL ) return len; @@ -64,7 +64,7 @@ unsigned long raw_clear_guest(void *to, unsigned len) unsigned size = min(len, (unsigned)PAGE_SIZE - offset); struct page_info *page; - page = get_page_from_gva(current->domain, (vaddr_t) to, GV2M_WRITE); + page = get_page_from_gva(current, (vaddr_t) to, GV2M_WRITE); if ( page == NULL ) return len; @@ -96,7 +96,7 @@ unsigned long raw_copy_from_guest(void *to, const void __user *from, unsigned le unsigned size = min(len, (unsigned)(PAGE_SIZE - offset)); struct page_info *page; - page = get_page_from_gva(current->domain, (vaddr_t) from, GV2M_READ); + page = get_page_from_gva(current, (vaddr_t) from, GV2M_READ); if ( page == NULL ) return len; diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index 063505c028..d08ecc61da 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -1456,9 +1456,10 @@ err: return page; } -struct page_info *get_page_from_gva(struct domain *d, vaddr_t va, +struct page_info *get_page_from_gva(struct vcpu *v, vaddr_t va, unsigned long flags) { + struct domain *d = v->domain; struct p2m_domain *p2m = &d->arch.p2m; struct page_info *page = NULL; paddr_t maddr = 0; diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index c8b27babcf..6c1b9dc524 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -917,7 +917,7 @@ static void show_guest_stack(struct vcpu *v, struct cpu_user_regs *regs) return; } - page = get_page_from_gva(v->domain, sp, GV2M_READ); + page = get_page_from_gva(v, sp, GV2M_READ); if ( page == NULL ) { printk("Failed to convert stack to physical address\n"); diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h index a95082e500..c5f6e8e383 100644 --- a/xen/include/asm-arm/mm.h +++ b/xen/include/asm-arm/mm.h @@ -275,7 +275,7 @@ static inline void *page_to_virt(const struct page_info *pg) return mfn_to_virt(page_to_mfn(pg)); } -struct page_info *get_page_from_gva(struct domain *d, vaddr_t va, +struct page_info *get_page_from_gva(struct vcpu *v, vaddr_t va, unsigned long flags); /*