Mailing List Archive

[xen-unstable] hvm: Allow GNTTABOP_query_size.
# HG changeset patch
# User kfraser@localhost.localdomain
# Date 1180605191 -3600
# Node ID 4c2b8ca4842cd584102bdf98a24d9e26642228ad
# Parent d1d5ceb3c3ffe80da13a38a30a721fb5049e53e0
hvm: Allow GNTTABOP_query_size.
Signed-off-by: Takanori Kasai <kasai.takanori@jp.fujitsu.com>
Signed-off-by: Tsunehisa Doi <Doi.Tsunehisa@jp.fujitsu.com>
Signed-off-by: Keir Fraser <keir@xensource.com>
---
xen/arch/x86/hvm/hvm.c | 27 +++++++++++++++++++--------
1 files changed, 19 insertions(+), 8 deletions(-)

diff -r d1d5ceb3c3ff -r 4c2b8ca4842c xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c Thu May 31 10:42:34 2007 +0100
+++ b/xen/arch/x86/hvm/hvm.c Thu May 31 10:53:11 2007 +0100
@@ -662,20 +662,28 @@ void hvm_cpuid(unsigned int input, unsig
}
}

+static long hvm_grant_table_op(
+ unsigned int cmd, XEN_GUEST_HANDLE(void) uop, unsigned int count)
+{
+ if ( cmd != GNTTABOP_query_size )
+ return -ENOSYS; /* all other commands need auditing */
+ return do_grant_table_op(cmd, uop, count);
+}
+
typedef unsigned long hvm_hypercall_t(
unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);

#define HYPERCALL(x) \
[ __HYPERVISOR_ ## x ] = (hvm_hypercall_t *) do_ ## x
-#define HYPERCALL_COMPAT32(x) \
- [ __HYPERVISOR_ ## x ] = (hvm_hypercall_t *) do_ ## x ## _compat32

#if defined(__i386__)

static hvm_hypercall_t *hvm_hypercall32_table[NR_hypercalls] = {
HYPERCALL(memory_op),
+ [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op,
HYPERCALL(multicall),
HYPERCALL(xen_version),
+ HYPERCALL(grant_table_op),
HYPERCALL(event_channel_op),
HYPERCALL(sched_op),
HYPERCALL(hvm_op)
@@ -726,15 +734,19 @@ static long do_memory_op_compat32(int cm

static hvm_hypercall_t *hvm_hypercall64_table[NR_hypercalls] = {
HYPERCALL(memory_op),
+ [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op,
HYPERCALL(xen_version),
+ HYPERCALL(grant_table_op),
HYPERCALL(event_channel_op),
HYPERCALL(sched_op),
HYPERCALL(hvm_op)
};

static hvm_hypercall_t *hvm_hypercall32_table[NR_hypercalls] = {
- HYPERCALL_COMPAT32(memory_op),
+ [ __HYPERVISOR_memory_op ] = (hvm_hypercall_t *)do_memory_op_compat32,
+ [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op,
HYPERCALL(xen_version),
+ HYPERCALL(grant_table_op),
HYPERCALL(event_channel_op),
HYPERCALL(sched_op),
HYPERCALL(hvm_op)
@@ -767,9 +779,6 @@ int hvm_do_hypercall(struct cpu_user_reg

if ( (eax >= NR_hypercalls) || !hvm_hypercall32_table[eax] )
{
- if ( eax != __HYPERVISOR_grant_table_op )
- gdprintk(XENLOG_WARNING, "HVM vcpu %d:%d bad hypercall %u.\n",
- current->domain->domain_id, current->vcpu_id, eax);
regs->eax = -ENOSYS;
return HVM_HCALL_completed;
}
@@ -779,7 +788,8 @@ int hvm_do_hypercall(struct cpu_user_reg
* For now we also need to flush when pages are added, as qemu-dm is not
* yet capable of faulting pages into an existing valid mapcache bucket.
*/
- flush = (eax == __HYPERVISOR_memory_op);
+ flush = ((eax == __HYPERVISOR_memory_op) ||
+ (eax == __HYPERVISOR_grant_table_op)); /* needed ? */
this_cpu(hc_preempted) = 0;

#ifdef __x86_64__
@@ -809,7 +819,8 @@ int hvm_do_hypercall(struct cpu_user_reg
(uint32_t)regs->edi);
}

- HVM_DBG_LOG(DBG_LEVEL_HCALL, "hcall%u -> %lx", eax, (unsigned long)regs->eax);
+ HVM_DBG_LOG(DBG_LEVEL_HCALL, "hcall%u -> %lx",
+ eax, (unsigned long)regs->eax);

return (this_cpu(hc_preempted) ? HVM_HCALL_preempted :
flush ? HVM_HCALL_invalidate : HVM_HCALL_completed);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@lists.xensource.com
http://lists.xensource.com/xen-changelog