[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v2] x86/HVM: Merge HVM and PVH hypercall tables



On Wed, Dec 16, 2015 at 11:34:07AM -0500, Boris Ostrovsky wrote:
> 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>

Since I raised the big 'oh what if'  - I would like to mention that Boris
has show me the light and it is OK.

> ---
> 
> 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

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.