mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 18:50:05 +01:00
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>
This commit is contained in:
1 parent
40e5c12bcf
commit
4d4e656f02
4 files changed
+69
No files matched your search
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
/*
|
||||
|
||||