[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] arm/guest_access: Move vgic_access_guest_memory to guest_access.h
commit 67b1668de7aacc192d0dc58dcb3ad4fd5358c11a Author: Sergej Proskurin <proskurin@xxxxxxxxxxxxx> AuthorDate: Wed Aug 16 15:17:39 2017 +0200 Commit: Stefano Stabellini <sstabellini@xxxxxxxxxx> CommitDate: Fri Aug 18 10:27:35 2017 -0700 arm/guest_access: Move vgic_access_guest_memory to guest_access.h This commit moves the function vgic_access_guest_memory to guestcopy.c and the header asm/guest_access.h. No functional changes are made. Please note that the function will be renamed in the following commit. Signed-off-by: Sergej Proskurin <proskurin@xxxxxxxxxxxxx> Acked-by: Julien Grall <julien.grall@xxxxxxx> Signed-off-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> --- xen/arch/arm/guestcopy.c | 50 ++++++++++++++++++++++++++++++++++++++ xen/arch/arm/vgic-v3-its.c | 1 + xen/arch/arm/vgic.c | 49 ------------------------------------- xen/include/asm-arm/guest_access.h | 4 +++ xen/include/asm-arm/vgic.h | 3 --- 5 files changed, 55 insertions(+), 52 deletions(-) diff --git a/xen/arch/arm/guestcopy.c b/xen/arch/arm/guestcopy.c index 413125f..938ffe2 100644 --- a/xen/arch/arm/guestcopy.c +++ b/xen/arch/arm/guestcopy.c @@ -118,6 +118,56 @@ unsigned long raw_copy_from_guest(void *to, const void __user *from, unsigned le } return 0; } + +/* + * Temporarily map one physical guest page and copy data to or from it. + * The data to be copied cannot cross a page boundary. + */ +int vgic_access_guest_memory(struct domain *d, paddr_t gpa, void *buf, + uint32_t size, bool is_write) +{ + struct page_info *page; + uint64_t offset = gpa & ~PAGE_MASK; /* Offset within the mapped page */ + p2m_type_t p2mt; + void *p; + + /* Do not cross a page boundary. */ + if ( size > (PAGE_SIZE - offset) ) + { + printk(XENLOG_G_ERR "d%d: vITS: memory access would cross page boundary\n", + d->domain_id); + return -EINVAL; + } + + page = get_page_from_gfn(d, paddr_to_pfn(gpa), &p2mt, P2M_ALLOC); + if ( !page ) + { + printk(XENLOG_G_ERR "d%d: vITS: Failed to get table entry\n", + d->domain_id); + return -EINVAL; + } + + if ( !p2m_is_ram(p2mt) ) + { + put_page(page); + printk(XENLOG_G_ERR "d%d: vITS: memory used by the ITS should be RAM.", + d->domain_id); + return -EINVAL; + } + + p = __map_domain_page(page); + + if ( is_write ) + memcpy(p + offset, buf, size); + else + memcpy(buf, p + offset, size); + + unmap_domain_page(p); + put_page(page); + + return 0; +} + /* * Local variables: * mode: C diff --git a/xen/arch/arm/vgic-v3-its.c b/xen/arch/arm/vgic-v3-its.c index 9ef792f..1af6820 100644 --- a/xen/arch/arm/vgic-v3-its.c +++ b/xen/arch/arm/vgic-v3-its.c @@ -39,6 +39,7 @@ #include <xen/sched.h> #include <xen/sizes.h> #include <asm/current.h> +#include <asm/guest_access.h> #include <asm/mmio.h> #include <asm/gic_v3_defs.h> #include <asm/gic_v3_its.h> diff --git a/xen/arch/arm/vgic.c b/xen/arch/arm/vgic.c index 1e5107b..7a4e3cd 100644 --- a/xen/arch/arm/vgic.c +++ b/xen/arch/arm/vgic.c @@ -638,55 +638,6 @@ void vgic_free_virq(struct domain *d, unsigned int virq) } /* - * Temporarily map one physical guest page and copy data to or from it. - * The data to be copied cannot cross a page boundary. - */ -int vgic_access_guest_memory(struct domain *d, paddr_t gpa, void *buf, - uint32_t size, bool is_write) -{ - struct page_info *page; - uint64_t offset = gpa & ~PAGE_MASK; /* Offset within the mapped page */ - p2m_type_t p2mt; - void *p; - - /* Do not cross a page boundary. */ - if ( size > (PAGE_SIZE - offset) ) - { - printk(XENLOG_G_ERR "d%d: vITS: memory access would cross page boundary\n", - d->domain_id); - return -EINVAL; - } - - page = get_page_from_gfn(d, paddr_to_pfn(gpa), &p2mt, P2M_ALLOC); - if ( !page ) - { - printk(XENLOG_G_ERR "d%d: vITS: Failed to get table entry\n", - d->domain_id); - return -EINVAL; - } - - if ( !p2m_is_ram(p2mt) ) - { - put_page(page); - printk(XENLOG_G_ERR "d%d: vITS: memory used by the ITS should be RAM.", - d->domain_id); - return -EINVAL; - } - - p = __map_domain_page(page); - - if ( is_write ) - memcpy(p + offset, buf, size); - else - memcpy(buf, p + offset, size); - - unmap_domain_page(p); - put_page(page); - - return 0; -} - -/* * Local variables: * mode: C * c-file-style: "BSD" diff --git a/xen/include/asm-arm/guest_access.h b/xen/include/asm-arm/guest_access.h index 251e935..df5737c 100644 --- a/xen/include/asm-arm/guest_access.h +++ b/xen/include/asm-arm/guest_access.h @@ -3,6 +3,7 @@ #include <xen/guest_access.h> #include <xen/errno.h> +#include <xen/sched.h> unsigned long raw_copy_to_guest(void *to, const void *from, unsigned len); unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, @@ -10,6 +11,9 @@ unsigned long raw_copy_to_guest_flush_dcache(void *to, const void *from, unsigned long raw_copy_from_guest(void *to, const void *from, unsigned len); unsigned long raw_clear_guest(void *to, unsigned len); +int vgic_access_guest_memory(struct domain *d, paddr_t gpa, void *buf, + uint32_t size, bool_t is_write); + #define __raw_copy_to_guest raw_copy_to_guest #define __raw_copy_from_guest raw_copy_from_guest #define __raw_clear_guest raw_clear_guest diff --git a/xen/include/asm-arm/vgic.h b/xen/include/asm-arm/vgic.h index d4ed23d..e489d0b 100644 --- a/xen/include/asm-arm/vgic.h +++ b/xen/include/asm-arm/vgic.h @@ -217,9 +217,6 @@ extern void register_vgic_ops(struct domain *d, const struct vgic_ops *ops); int vgic_v2_init(struct domain *d, int *mmio_count); int vgic_v3_init(struct domain *d, int *mmio_count); -int vgic_access_guest_memory(struct domain *d, paddr_t gpa, void *buf, - uint32_t size, bool_t is_write); - extern int domain_vgic_register(struct domain *d, int *mmio_count); extern int vcpu_vgic_free(struct vcpu *v); extern bool vgic_to_sgi(struct vcpu *v, register_t sgir, -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |