[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] 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. MMUEXT_PIN_L<x>_TABLE are required by control domain (dom0) when building guests. * 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. Note that until recently PVH guests used mmuext_op's MMUEXT_INVLPG_MULTI and MMUEXT_TLB_FLUSH_MULTI commands but it has been determined that using the former was incorrect and using the latter is correct for now but is not guaranteed to work in the future. Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx> --- v2: Add MMUEXT_PIN_L<x>_TABLE handling, disallow MMUEXT_INVLPG_MULTI and MMUEXT_TLB_FLUSH_MULTI for PVH xen/arch/x86/hvm/hvm.c | 65 ++++++++++------------------------------------- xen/arch/x86/mm.c | 20 ++++++++++++++ 2 files changed, 34 insertions(+), 51 deletions(-) diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index ae3abb6..d01b4b4 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -5188,12 +5188,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, @@ -5209,48 +5218,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 }; @@ -5284,9 +5253,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; @@ -5320,9 +5287,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 @@ -5366,10 +5332,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 506ee41..bcf5294 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -3019,6 +3019,25 @@ long do_mmuext_op( break; } + if ( has_hvm_container_domain(d) ) + { + switch ( op.cmd ) + { + case MMUEXT_PIN_L1_TABLE: + case MMUEXT_PIN_L2_TABLE: + case MMUEXT_PIN_L3_TABLE: + case MMUEXT_PIN_L4_TABLE: + if ( is_control_domain(d) ) + break; + /* fallthrough */ + default: + MEM_LOG("Invalid extended pt command %#x", op.cmd); + okay = 0; + rc = -ENOSYS; + goto done; + } + } + okay = 1; switch ( op.cmd ) @@ -3448,6 +3467,7 @@ long do_mmuext_op( break; } + done: if ( unlikely(!okay) && !rc ) rc = -EINVAL; if ( unlikely(rc) ) -- 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 |