WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

Re: [Xen-devel] [PATCH 01/14] Nested Virtualization: tools

To: "Dong, Eddie" <eddie.dong@xxxxxxxxx>
Subject: Re: [Xen-devel] [PATCH 01/14] Nested Virtualization: tools
From: Christoph Egger <Christoph.Egger@xxxxxxx>
Date: Tue, 17 Aug 2010 13:01:57 +0200
Cc: "xen-devel@xxxxxxxxxxxxxxxxxxx" <xen-devel@xxxxxxxxxxxxxxxxxxx>
Delivery-date: Tue, 17 Aug 2010 04:03:57 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <1A42CE6F5F474C41B63392A5F80372B2291436C6@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
References: <1A42CE6F5F474C41B63392A5F80372B2291436C6@xxxxxxxxxxxxxxxxxxxxxxxxxxxx>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: KMail/1.9.10
On Tuesday 17 August 2010 09:19:20 Dong, Eddie wrote:
> > # HG changeset patch
> > # User cegger
> > # Date 1280925492 -7200
> > tools: Add nestedhvm guest config option
> >
> > diff -r 3d0c15fe28db -r b13ace9a80d8 tools/libxc/xc_cpuid_x86.c
> > --- a/tools/libxc/xc_cpuid_x86.c
> > +++ b/tools/libxc/xc_cpuid_x86.c
> > @@ -29,7 +29,7 @@
> >  #define set_bit(idx, dst)   ((dst) |= (1u << ((idx) & 31)))
> >
> >  #define DEF_MAX_BASE 0x0000000du
> > -#define DEF_MAX_EXT  0x80000008u
> > +#define DEF_MAX_EXT  0x8000000au
>
> An real Intel HW only have max leaf of 80000008, I am not sure if renaming
> it to 8000000A will cause potential issues.

The leave 8000000A is needed for SVM. Does this change cause any problems on 
Intel CPUs ?

> >  static int hypervisor_is_64bit(xc_interface *xch)
> >  {
> > @@ -77,7 +77,7 @@ static void xc_cpuid_brand_get(char *str
> >  static void amd_xc_cpuid_policy(
> >      xc_interface *xch, domid_t domid,
> >      const unsigned int *input, unsigned int *regs,
> > -    int is_pae)
> > +    int is_pae, int is_nestedhvm)
> >  {
> >      switch ( input[0] )
> >      {
> > @@ -96,6 +96,7 @@ static void amd_xc_cpuid_policy(
> >          /* Filter all other features according to a whitelist. */
> >          regs[2] &= ((is_64bit ? bitmaskof(X86_FEATURE_LAHF_LM) : 0) |
> >                      bitmaskof(X86_FEATURE_CMP_LEGACY) |
> > +                    (is_nestedhvm ? bitmaskof(X86_FEATURE_SVME) : 0)
> >
> >                      | bitmaskof(X86_FEATURE_ALTMOVCR) |
> >
> >                      bitmaskof(X86_FEATURE_ABM) |
> >                      bitmaskof(X86_FEATURE_SSE4A) |
> > @@ -120,13 +121,43 @@ static void amd_xc_cpuid_policy(
> >           */
> >          regs[2] = ((regs[2] & 0xf000u) + 1) | ((regs[2] & 0xffu) <<
> >          1) | 1u; break;
> > +
> > +    case 0x8000000a: {
> > +        uint32_t edx;
> > +
> > +        if (!is_nestedhvm) {
> > +            regs[0] = regs[1] = regs[2] = regs[3] = 0;
> > +            break;
> > +        }
> > +
> > +#define SVM_FEATURE_NPT            0x00000001
> > +#define SVM_FEATURE_LBRV           0x00000002
> > +#define SVM_FEATURE_SVML           0x00000004
> > +#define SVM_FEATURE_NRIPS          0x00000008
> > +#define SVM_FEATURE_PAUSEFILTER    0x00000400
>
> Should those MACROs go to head file?

They are only used right below and exist for readability.
Do you see whereelse they can be used?

>
> > +
> > +        /* Only passthrough SVM features which are implemented */
> > +        edx = 0;
> > +        if (regs[3] & SVM_FEATURE_NPT)
> > +            edx |= SVM_FEATURE_NPT;
> > +        if (regs[3] & SVM_FEATURE_LBRV)
> > +            edx |= SVM_FEATURE_LBRV;
> > +        if (regs[3] & SVM_FEATURE_NRIPS)
> > +            edx |= SVM_FEATURE_NRIPS;
> > +        if (regs[3] & SVM_FEATURE_PAUSEFILTER)
> > +            edx |= SVM_FEATURE_PAUSEFILTER;
> > +
> > +        regs[3] = edx;
> > +        break;
> > +    }
> > +
> >      }
> >  }
> >
> >  static void intel_xc_cpuid_policy(
> >      xc_interface *xch, domid_t domid,
> >      const unsigned int *input, unsigned int *regs,
> > -    int is_pae)
> > +    int is_pae, int is_nestedhvm)
> >  {
> >      switch ( input[0] )
> >      {
> > @@ -160,6 +191,11 @@ static void intel_xc_cpuid_policy(
> >          /* Mask AMD Number of Cores information. */
> >          regs[2] = 0;
> >          break;
> > +
> > +    case 0x8000000a:
> > +        /* Clear AMD SVM feature bits */
> > +        regs[0] = regs[1] = regs[2] = regs[3] = 0;
> > +        break;
>
> How do you expect an L1 guest running on top of virtual Intel processor
> will try to detect AMD feature (CPUID leaf 0x8000000a) when it knows
> running on top of Intel processor? Leaf 8000000a is not existed in native
> Intel processor, or do you expect to paravirtualize the L1 guest? Note:
> Intel processor detect VMX feature in CPUID.1:ECX.VMX[bit 5], and most of
> rest capability in MSRs.

Fine. I just want to make sure that the variables are initialized and don't
contain garbage.

>
> Further more, if a future Intel processor defines CPUID 8000000A, how can
> both of them be accomodated? This is one example of difficulty to support
> SVM-on-VMX, although it is not a deadset, or do you expect to modify L1
> guest for this (kind of PV solution).

If I were implementing SVM-on-VMX then I wouldn't do that here.

> >      }
> >  }
> >
> > @@ -168,12 +204,17 @@ static void xc_cpuid_hvm_policy(
> >      const unsigned int *input, unsigned int *regs)
> >  {
> >      char brand[13];
> > +    unsigned long nestedhvm;
> >      unsigned long pae;
> >      int is_pae;
> > +    int is_nestedhvm;
> >
> >      xc_get_hvm_param(xch, domid, HVM_PARAM_PAE_ENABLED, &pae);
> >      is_pae = !!pae;
> >
> > +    xc_get_hvm_param(xch, domid, HVM_PARAM_NESTEDHVM, &nestedhvm);
>
> If you insist to support cross vendor nested virtualization, I would like
> to suggest we have multiple options for configuration: VMX, SVM, or HW. VMX
> and SVM option is for what situation that the user want to enforce the
> guest VMX/SVM features regardless of underlying hardware, while HW means to
> implements same with underlying virtualization feature in guest. In this
> way, it provides room for either cross vendor nested virtualization or
> natively virtualization.

No, I don't insist on cross vendor nested virtualization. I just 
followed "pae" here. You see the analogy in the code lines?

Christoph

>
> > +    is_nestedhvm = !!nestedhvm;
> > +
> >      switch ( input[0] )
> >      {
> >      case 0x00000000:
> > @@ -259,6 +300,7 @@ static void xc_cpuid_hvm_policy(
> >      case 0x80000004: /* ... continued         */
> >      case 0x80000005: /* AMD L1 cache/TLB info (dumped by Intel
> >      policy) */ case 0x80000006: /* AMD L2/3 cache/TLB info ; Intel
> > L2 cache features */ +    case 0x8000000a: /* AMD SVM feature bits */
> >          break;
> >
> >      default:
> > @@ -268,9 +310,9 @@ static void xc_cpuid_hvm_policy(
> >
> >      xc_cpuid_brand_get(brand);
> >      if ( strstr(brand, "AMD") )
> > -        amd_xc_cpuid_policy(xch, domid, input, regs, is_pae);
> > +        amd_xc_cpuid_policy(xch, domid, input, regs, is_pae,
> >      is_nestedhvm); else
> > -        intel_xc_cpuid_policy(xch, domid, input, regs, is_pae);
> > +        intel_xc_cpuid_policy(xch, domid, input, regs, is_pae,
> > is_nestedhvm);
> >
> >  }
> >
> > diff -r 3d0c15fe28db -r b13ace9a80d8
> > tools/python/xen/xend/XendConfig.py ---
> > a/tools/python/xen/xend/XendConfig.py +++
> > b/tools/python/xen/xend/XendConfig.py @@ -185,6 +185,7 @@
> >      XENAPI_PLATFORM_CFG_TYPES = { 'vhpt': int,
> >      'guest_os_type': str,
> >      'hap': int,
> > +    'nestedhvm' : int,
> >      'xen_extended_power_mgmt': int,
> >      'pci_msitranslate': int,
> >      'pci_power_mgmt': int,
> > diff -r 3d0c15fe28db -r b13ace9a80d8
> > tools/python/xen/xend/XendConstants.py ---
> > a/tools/python/xen/xend/XendConstants.py +++
> > b/tools/python/xen/xend/XendConstants.py @@ -52,6 +52,7 @@
> >  HVM_PARAM_TIMER_MODE   = 10 HVM_PARAM_HPET_ENABLED = 11
> >  HVM_PARAM_ACPI_S_STATE = 14
> >  HVM_PARAM_VPT_ALIGN    = 16
> > +HVM_PARAM_NESTEDHVM    = 17 # x86
> >
> >  restart_modes = [
> >      "restart",
> > diff -r 3d0c15fe28db -r b13ace9a80d8
> > tools/python/xen/xend/XendDomainInfo.py ---
> > a/tools/python/xen/xend/XendDomainInfo.py +++
> > b/tools/python/xen/xend/XendDomainInfo.py @@ -2585,10 +2585,15 @@
> >              class XendDomainInfo: xc.hvm_set_param(self.domid,
> >                               HVM_PARAM_TIMER_MODE, long(timer_mode))
> >
> > -        # Set Viridian interface configuration of domain
> > -        viridian = self.info["platform"].get("viridian")
> > -        if arch.type == "x86" and hvm and viridian is not None:
> > -            xc.hvm_set_param(self.domid, HVM_PARAM_VIRIDIAN,
> > long(viridian)) +        if arch.type == "x86" and hvm:
> > +            # Set Viridian interface configuration of domain
> > +            viridian = self.info["platform"].get("viridian")
> > +            if viridian is not None:
> > +                xc.hvm_set_param(self.domid, HVM_PARAM_VIRIDIAN,
> > long(viridian)) +            # Set nestedhvm of domain
> > +            nestedhvm = self.info["platform"].get("nestedhvm")
> > +            if nestedhvm is not None:
> > +                xc.hvm_set_param(self.domid, HVM_PARAM_NESTEDHVM,
> > long(nestedhvm))
> >
> >          # If nomigrate is set, disable migration
> >          nomigrate = self.info["platform"].get("nomigrate")
> > diff -r 3d0c15fe28db -r b13ace9a80d8 tools/python/xen/xm/create.py
> > --- a/tools/python/xen/xm/create.py
> > +++ b/tools/python/xen/xm/create.py
> > @@ -633,6 +633,11 @@ gopts.var('hap', val='HAP',
> >            use="""Hap status (0=hap is disabled;
> >            1=hap is enabled.""")
> >
> > +gopts.var('nestedhvm', val='NESTEDHVM',
> > +          fn=set_int, default=0,
> > +          use="""Nested HVM status (0=Nested HVM is disabled;
> > +          1=Nested HVM is enabled.""")
> > +
> >  gopts.var('s3_integrity', val='TBOOT_MEMORY_PROTECT',
> >            fn=set_int, default=1,
> >            use="""Should domain memory integrity be verified during
> > S3? @@ -1083,7 +1088,7 @@ def configure_hvm(config_image, vals):
> >               'isa',
> >               'keymap',
> >               'localtime',
> > -             'nographic',
> > +             'nestedhvm', 'nographic',
> >               'opengl', 'oos',
> >               'pae', 'pci', 'pci_msitranslate', 'pci_power_mgmt',
> >               'rtc_timeoffset',
> > diff -r 3d0c15fe28db -r b13ace9a80d8 xen/include/public/hvm/params.h
> > --- a/xen/include/public/hvm/params.h
> > +++ b/xen/include/public/hvm/params.h
> > @@ -109,6 +109,9 @@
> >  /* Boolean: Enable aligning all periodic vpts to reduce interrupts */
> >  #define HVM_PARAM_VPT_ALIGN    16
> >
> > -#define HVM_NR_PARAMS          17
> > +/* Boolean: Enable nestedhvm */
> > +#define HVM_PARAM_NESTEDHVM    17
> > +
> > +#define HVM_NR_PARAMS          18
> >
> >  #endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
>
> Thx, Eddie



-- 
---to satisfy European Law for business letters:
Advanced Micro Devices GmbH
Einsteinring 24, 85609 Dornach b. Muenchen
Geschaeftsfuehrer: Alberto Bozzo, Andrew Bowd
Sitz: Dornach, Gemeinde Aschheim, Landkreis Muenchen
Registergericht Muenchen, HRB Nr. 43632


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