|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] x86/HVM: Merge HVM and PVH hypercall tables
The tables are almost identical and therefore there is little reason to
keep both sets.
PVH needs 3 extra hypercalls:
* mmuext_op. PVH uses MMUEXT_TLB_FLUSH_MULTI and MMUEXT_INVLPG_MULTI to
optimize TLB flushing. Since HVMlite guests may decide to use them as
well we can allow these two commands for all guests in an HVM container.
* platform_op. These are only available to privileged domains. We will
(eventually) have privileged HVMlite guests and therefore shouldn't
limit this to PVH only.
* xenpmu_op. any guest with !has_vlapic() (i.e. PV, PVH and HVMlite)
should be able to use it.
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
---
This patch is intended to go on top of Roger's HVMlite series
xen/arch/x86/hvm/hvm.c | 65 ++++++++++-------------------------------------
xen/arch/x86/mm.c | 9 ++++++
2 files changed, 23 insertions(+), 51 deletions(-)
diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
index 08cef1f..38293d1 100644
--- a/xen/arch/x86/hvm/hvm.c
+++ b/xen/arch/x86/hvm/hvm.c
@@ -5173,12 +5173,21 @@ static hvm_hypercall_t *const
hvm_hypercall64_table[NR_hypercalls] = {
HYPERCALL(sysctl),
HYPERCALL(domctl),
HYPERCALL(tmem_op),
+ HYPERCALL(platform_op),
+ HYPERCALL(mmuext_op),
+ HYPERCALL(xenpmu_op),
[ __HYPERVISOR_arch_1 ] = (hvm_hypercall_t *)paging_domctl_continuation
};
#define COMPAT_CALL(x) \
[ __HYPERVISOR_ ## x ] = (hvm_hypercall_t *) compat_ ## x
+extern int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(void) cmp_uops,
+ unsigned int count,
+ XEN_GUEST_HANDLE_PARAM(uint) pdone,
+ unsigned int foreigndom);
+extern int compat_platform_op(XEN_GUEST_HANDLE_PARAM(void) u_xenpf_op);
+
static hvm_hypercall_t *const hvm_hypercall32_table[NR_hypercalls] = {
[ __HYPERVISOR_memory_op ] = (hvm_hypercall_t *)hvm_memory_op_compat32,
[ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t
*)hvm_grant_table_op_compat32,
@@ -5194,48 +5203,8 @@ static hvm_hypercall_t *const
hvm_hypercall32_table[NR_hypercalls] = {
HYPERCALL(sysctl),
HYPERCALL(domctl),
HYPERCALL(tmem_op),
- [ __HYPERVISOR_arch_1 ] = (hvm_hypercall_t *)paging_domctl_continuation
-};
-
-static hvm_hypercall_t *const pvh_hypercall64_table[NR_hypercalls] = {
- HYPERCALL(platform_op),
- HYPERCALL(memory_op),
- HYPERCALL(xen_version),
- HYPERCALL(console_io),
- [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op,
- HYPERCALL(vcpu_op),
- HYPERCALL(mmuext_op),
- HYPERCALL(xsm_op),
- HYPERCALL(sched_op),
- HYPERCALL(event_channel_op),
- [ __HYPERVISOR_physdev_op ] = (hvm_hypercall_t *)hvm_physdev_op,
- HYPERCALL(hvm_op),
- HYPERCALL(sysctl),
- HYPERCALL(domctl),
- HYPERCALL(xenpmu_op),
- [ __HYPERVISOR_arch_1 ] = (hvm_hypercall_t *)paging_domctl_continuation
-};
-
-extern int compat_mmuext_op(XEN_GUEST_HANDLE_PARAM(void) cmp_uops,
- unsigned int count,
- XEN_GUEST_HANDLE_PARAM(uint) pdone,
- unsigned int foreigndom);
-static hvm_hypercall_t *const pvh_hypercall32_table[NR_hypercalls] = {
- HYPERCALL(platform_op),
- COMPAT_CALL(memory_op),
- HYPERCALL(xen_version),
- HYPERCALL(console_io),
- [ __HYPERVISOR_grant_table_op ] =
- (hvm_hypercall_t *)hvm_grant_table_op_compat32,
- COMPAT_CALL(vcpu_op),
+ COMPAT_CALL(platform_op),
COMPAT_CALL(mmuext_op),
- HYPERCALL(xsm_op),
- COMPAT_CALL(sched_op),
- HYPERCALL(event_channel_op),
- [ __HYPERVISOR_physdev_op ] = (hvm_hypercall_t *)hvm_physdev_op_compat32,
- HYPERCALL(hvm_op),
- HYPERCALL(sysctl),
- HYPERCALL(domctl),
HYPERCALL(xenpmu_op),
[ __HYPERVISOR_arch_1 ] = (hvm_hypercall_t *)paging_domctl_continuation
};
@@ -5269,9 +5238,7 @@ int hvm_do_hypercall(struct cpu_user_regs *regs)
if ( (eax & 0x80000000) && is_viridian_domain(currd) )
return viridian_hypercall(regs);
- if ( (eax >= NR_hypercalls) ||
- !(is_pvh_domain(currd) ? pvh_hypercall32_table[eax]
- : hvm_hypercall32_table[eax]) )
+ if ( (eax >= NR_hypercalls) || !hvm_hypercall32_table[eax] )
{
regs->eax = -ENOSYS;
return HVM_HCALL_completed;
@@ -5305,9 +5272,8 @@ int hvm_do_hypercall(struct cpu_user_regs *regs)
#endif
curr->arch.hvm_vcpu.hcall_64bit = 1;
- regs->rax = (is_pvh_domain(currd)
- ? pvh_hypercall64_table
- : hvm_hypercall64_table)[eax](rdi, rsi, rdx, r10, r8, r9);
+ regs->rax = hvm_hypercall64_table[eax](rdi, rsi, rdx, r10, r8, r9);
+
curr->arch.hvm_vcpu.hcall_64bit = 0;
#ifndef NDEBUG
@@ -5351,10 +5317,7 @@ int hvm_do_hypercall(struct cpu_user_regs *regs)
}
#endif
- regs->_eax = (is_pvh_vcpu(curr)
- ? pvh_hypercall32_table
- : hvm_hypercall32_table)[eax](ebx, ecx, edx,
- esi, edi, ebp);
+ regs->_eax = hvm_hypercall32_table[eax](ebx, ecx, edx, esi, edi, ebp);
#ifndef NDEBUG
if ( !curr->arch.hvm_vcpu.hcall_preempted )
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index 92df36f..f3700f5 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -3019,6 +3019,15 @@ long do_mmuext_op(
break;
}
+ if ( has_hvm_container_domain(d) &&
+ (op.cmd != MMUEXT_TLB_FLUSH_MULTI) &&
+ (op.cmd != MMUEXT_INVLPG_MULTI) )
+ {
+ MEM_LOG("Unsupported mmuext cmd %u", op.cmd);
+ rc = -ENOSYS;
+ break;
+ }
+
okay = 1;
switch ( op.cmd )
--
1.7.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |