diff options
author | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2012-07-17 17:33:29 +0100 |
---|---|---|
committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2012-07-17 17:33:29 +0100 |
commit | 4d4e656f02196cc96c6f930970e808e28f7ef873 (patch) | |
tree | da2dd44f6ed1e750f15abbb6bd8813386d657237 | |
parent | 40e5c12bcf8618efcdbcf9799144ac2e1cafdc06 (diff) | |
download | xen-4d4e656f02196cc96c6f930970e808e28f7ef873.tar.gz xen-4d4e656f02196cc96c6f930970e808e28f7ef873.tar.bz2 xen-4d4e656f02196cc96c6f930970e808e28f7ef873.zip |
xen/arm: implement do_hvm_op for ARM
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Acked-by: Tim Deegan <tim@xen.org>
Committed-by: Ian Campbell <ian.campbell@citrix.com>
-rw-r--r-- | xen/arch/arm/Makefile | 1 | ||||
-rw-r--r-- | xen/arch/arm/hvm.c | 60 | ||||
-rw-r--r-- | xen/arch/arm/traps.c | 1 | ||||
-rw-r--r-- | xen/include/asm-arm/domain.h | 7 |
4 files changed, 69 insertions, 0 deletions
diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile index 5a87ba6386..634b620892 100644 --- a/xen/arch/arm/Makefile +++ b/xen/arch/arm/Makefile @@ -26,6 +26,7 @@ obj-y += traps.o obj-y += vgic.o obj-y += vtimer.o obj-y += vpl011.o +obj-y += hvm.o #obj-bin-y += ....o diff --git a/xen/arch/arm/hvm.c b/xen/arch/arm/hvm.c new file mode 100644 index 0000000000..c11378db02 --- /dev/null +++ b/xen/arch/arm/hvm.c @@ -0,0 +1,60 @@ +#include <xen/config.h> +#include <xen/init.h> +#include <xen/lib.h> +#include <xen/errno.h> +#include <xen/guest_access.h> +#include <xen/sched.h> + +#include <public/xen.h> +#include <public/hvm/params.h> +#include <public/hvm/hvm_op.h> + +#include <asm/hypercall.h> + +long do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg) + +{ + long rc = 0; + + switch ( op ) + { + case HVMOP_set_param: + case HVMOP_get_param: + { + struct xen_hvm_param a; + struct domain *d; + + if ( copy_from_guest(&a, arg, 1) ) + return -EFAULT; + + if ( a.index >= HVM_NR_PARAMS ) + return -EINVAL; + + rc = rcu_lock_target_domain_by_id(a.domid, &d); + if ( rc != 0 ) + return rc; + + if ( op == HVMOP_set_param ) + { + d->arch.hvm_domain.params[a.index] = a.value; + } + else + { + a.value = d->arch.hvm_domain.params[a.index]; + rc = copy_to_guest(arg, &a, 1) ? -EFAULT : 0; + } + + rcu_unlock_domain(d); + break; + } + + default: + { + printk("%s: Bad HVM op %ld.\n", __func__, op); + rc = -ENOSYS; + break; + } + } + + return rc; +} diff --git a/xen/arch/arm/traps.c b/xen/arch/arm/traps.c index f5f43dac6b..f6e6807bc8 100644 --- a/xen/arch/arm/traps.c +++ b/xen/arch/arm/traps.c @@ -430,6 +430,7 @@ static arm_hypercall_t *arm_hypercall_table[] = { HYPERCALL(memory_op), HYPERCALL(physdev_op), HYPERCALL(sysctl), + HYPERCALL(hvm_op), }; static void do_debug_trap(struct cpu_user_regs *regs, unsigned int code) diff --git a/xen/include/asm-arm/domain.h b/xen/include/asm-arm/domain.h index 2b1454560c..114a8f6d78 100644 --- a/xen/include/asm-arm/domain.h +++ b/xen/include/asm-arm/domain.h @@ -5,6 +5,7 @@ #include <xen/cache.h> #include <asm/page.h> #include <asm/p2m.h> +#include <public/hvm/params.h> /* Represents state corresponding to a block of 32 interrupts */ struct vgic_irq_rank { @@ -28,9 +29,15 @@ struct pending_irq struct list_head lr_queue; }; +struct hvm_domain +{ + uint64_t params[HVM_NR_PARAMS]; +} __cacheline_aligned; + struct arch_domain { struct p2m_domain p2m; + struct hvm_domain hvm_domain; struct { /* |