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

[Xen-devel] [PATCH v10 03/10] tools: Add vmware_hwver support



This is used to set xen_arch_domainconfig vmware_hw. It is set to
the emulated VMware virtual hardware version.

Currently 0, 3-4, 6-11 are good values.  However the code only
checks for == 0, != 0, or < 7.

If non-zero then
  default VGA to VMware's VGA.

Signed-off-by: Don Slutz <dslutz@xxxxxxxxxxx>
---
v10:
    LIBXL_HAVE_LIBXL_VGA_INTERFACE_TYPE_VMWARE &
    LIBXL_HAVE_BUILDINFO_HVM_VMWARE_HWVER are arriving together
    a single umbrella could be used.
      Since I split the LIBXL_VGA_INTERFACE_TYPE_VMWARE into
      it's own patch, this is not longer true.
      But I did use 1 for the 2 c_info changes.
    Please use GCSPRINTF.
  Remove vga=vmware from here.

v9:
      I assumed that s/vmware_hw/vmware_hwver/ is not a big enough
      change to drop the Reviewed-by.  Did a minor edit to the
      commit message to add 7 to the list of values checked.

v7:
    Default handling of hvm.vga.kind bad.
      Fixed.
    Default of vmware_port should be based on vmware_hw.
      Done. 

v5:
      Anything looking for Xen according to the Xen cpuid instructions...
        Adjusted doc to new wording.

 docs/man/xl.cfg.pod.5        | 25 ++++++++++++++++++++++++-
 tools/libxc/xc_domain.c      |  2 +-
 tools/libxl/libxl.c          |  4 +++-
 tools/libxl/libxl.h          |  1 +
 tools/libxl/libxl_create.c   | 18 +++++++++++++-----
 tools/libxl/libxl_dm.c       |  2 +-
 tools/libxl/libxl_dom.c      |  7 ++++---
 tools/libxl/libxl_internal.h |  3 ++-
 tools/libxl/libxl_types.idl  |  1 +
 tools/libxl/libxl_x86.c      |  3 +--
 tools/libxl/xl_cmdimpl.c     |  9 ++++++---
 11 files changed, 57 insertions(+), 18 deletions(-)

diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5
index ba78374..f62d9f2 100644
--- a/docs/man/xl.cfg.pod.5
+++ b/docs/man/xl.cfg.pod.5
@@ -1333,6 +1333,25 @@ The viridian option can be specified as a boolean. A 
value of true (1)
 is equivalent to the list [ "defaults" ], and a value of false (0) is
 equivalent to an empty list.
 
+=item B<vmware_hwver=NUMBER>
+
+Turns on or off the exposure of VMware cpuid.  The number is
+VMware's hardware version number, where 0 is off.  A number >= 7
+is needed to enable exposure of VMware cpuid.
+
+If not zero it changes the default VGA to VMware's VGA.
+
+The hardware version number (vmware_hwver) come from VMware config files.
+
+=over 4
+
+In a .vmx it is virtualHW.version
+
+In a .ovf it is part of the value of vssd:VirtualSystemType.
+For vssd:VirtualSystemType == vmx-07, vmware_hwver = 7.
+
+=back
+
 =back
 
 =head3 Emulated VGA Graphics Device
@@ -1372,10 +1391,14 @@ later (e.g. Windows XP onwards) then you should enable 
this.
 stdvga supports more video ram and bigger resolutions than Cirrus.
 This option is deprecated, use vga="stdvga" instead.
 
+The deprecated B<stdvga=0> prevents the usage of vmware by default
+if B<vmware_hwver> is non-zero.
+
 =item B<vga="STRING">
 
 Selects the emulated video card (none|stdvga|cirrus|qxl|vmware).
-The default is cirrus.
+The default is cirrus unless B<vmware_hwver> is non-zero in which case it
+is vmware.
 
 In general, QXL should work with the Spice remote display protocol
 for acceleration, and QXL driver is necessary in guest in this case.
diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c
index a7079a1..40ff6ba 100644
--- a/tools/libxc/xc_domain.c
+++ b/tools/libxc/xc_domain.c
@@ -64,7 +64,7 @@ int xc_domain_create(xc_interface *xch,
     memset(&config, 0, sizeof(config));
 
 #if defined (__i386) || defined(__x86_64__)
-    /* No arch-specific configuration for now */
+    /* No arch-specific default configuration for now */
 #elif defined (__arm__) || defined(__aarch64__)
     config.gic_version = XEN_DOMCTL_CONFIG_GIC_DEFAULT;
     config.nr_spis = 0;
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index a6eb2df..c154246 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -4930,12 +4930,14 @@ int libxl_get_memory_target(libxl_ctx *ctx, uint32_t 
domid,
 }
 
 int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
+                             libxl_domain_create_info *c_info,
                              uint32_t *need_memkb)
 {
     GC_INIT(ctx);
     int rc;
 
-    rc = libxl__domain_build_info_setdefault(gc, b_info);
+    rc = libxl__domain_build_info_setdefault(gc, b_info,
+                                             c_info->vmware_hwver != 0);
     if (rc) goto out;
 
     *need_memkb = b_info->target_memkb;
diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 007a211..61d89be 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -1099,6 +1099,7 @@ int libxl_get_memory_target(libxl_ctx *ctx, uint32_t 
domid, uint32_t *out_target
  */
 /* how much free memory in the system a domain needs to be built */
 int libxl_domain_need_memory(libxl_ctx *ctx, libxl_domain_build_info *b_info,
+                             libxl_domain_create_info *c_info,
                              uint32_t *need_memkb);
 /* how much free memory is available in the system */
 int libxl_get_free_memory(libxl_ctx *ctx, uint32_t *memkb);
diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c
index f0da7dc..b7818bc 100644
--- a/tools/libxl/libxl_create.c
+++ b/tools/libxl/libxl_create.c
@@ -101,7 +101,8 @@ static int sched_params_valid(libxl__gc *gc,
 }
 
 int libxl__domain_build_info_setdefault(libxl__gc *gc,
-                                        libxl_domain_build_info *b_info)
+                                        libxl_domain_build_info *b_info,
+                                        bool vmware_vga_default)
 {
     int i;
 
@@ -238,8 +239,12 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc,
         if (b_info->u.hvm.mmio_hole_memkb == LIBXL_MEMKB_DEFAULT)
             b_info->u.hvm.mmio_hole_memkb = 0;
 
-        if (!b_info->u.hvm.vga.kind)
-            b_info->u.hvm.vga.kind = LIBXL_VGA_INTERFACE_TYPE_CIRRUS;
+        if (!b_info->u.hvm.vga.kind) {
+            if (vmware_vga_default)
+                b_info->u.hvm.vga.kind = LIBXL_VGA_INTERFACE_TYPE_VMWARE;
+            else
+                b_info->u.hvm.vga.kind = LIBXL_VGA_INTERFACE_TYPE_CIRRUS;
+        }
 
         switch (b_info->device_model_version) {
         case LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN_TRADITIONAL:
@@ -455,7 +460,7 @@ int libxl__domain_build(libxl__gc *gc,
         vments[4] = "start_time";
         vments[5] = libxl__sprintf(gc, "%lu.%02d", 
start_time.tv_sec,(int)start_time.tv_usec/10000);
 
-        localents = libxl__calloc(gc, 9, sizeof(char *));
+        localents = libxl__calloc(gc, 11, sizeof(char *));
         i = 0;
         localents[i++] = "platform/acpi";
         localents[i++] = libxl_defbool_val(info->u.hvm.acpi) ? "1" : "0";
@@ -463,6 +468,8 @@ int libxl__domain_build(libxl__gc *gc,
         localents[i++] = libxl_defbool_val(info->u.hvm.acpi_s3) ? "1" : "0";
         localents[i++] = "platform/acpi_s4";
         localents[i++] = libxl_defbool_val(info->u.hvm.acpi_s4) ? "1" : "0";
+        localents[i++] = "platform/vmware_hwver";
+        localents[i++] = GCSPRINTF("%"PRId64, d_config->c_info.vmware_hwver);
         if (info->u.hvm.mmio_hole_memkb) {
             uint64_t max_ram_below_4g =
                 (1ULL << 32) - (info->u.hvm.mmio_hole_memkb << 10);
@@ -901,7 +908,8 @@ static void initiate_domain_create(libxl__egc *egc,
     dcs->guest_domid = domid;
     dcs->dmss.dm.guest_domid = 0; /* means we haven't spawned */
 
-    ret = libxl__domain_build_info_setdefault(gc, &d_config->b_info);
+    ret = libxl__domain_build_info_setdefault(gc, &d_config->b_info,
+                                   d_config->c_info.vmware_hwver != 0);
     if (ret) goto error_out;
 
     if (!sched_params_valid(gc, domid, &d_config->b_info.sched_params)) {
diff --git a/tools/libxl/libxl_dm.c b/tools/libxl/libxl_dm.c
index 9a06f9b..c04fa0d 100644
--- a/tools/libxl/libxl_dm.c
+++ b/tools/libxl/libxl_dm.c
@@ -1099,7 +1099,7 @@ void libxl__spawn_stub_dm(libxl__egc *egc, 
libxl__stub_dm_spawn_state *sdss)
 
     ret = libxl__domain_create_info_setdefault(gc, &dm_config->c_info);
     if (ret) goto out;
-    ret = libxl__domain_build_info_setdefault(gc, &dm_config->b_info);
+    ret = libxl__domain_build_info_setdefault(gc, &dm_config->b_info, false);
     if (ret) goto out;
 
     GCNEW(vfb);
diff --git a/tools/libxl/libxl_dom.c b/tools/libxl/libxl_dom.c
index a0c9850..f7add33 100644
--- a/tools/libxl/libxl_dom.c
+++ b/tools/libxl/libxl_dom.c
@@ -131,7 +131,8 @@ static int numa_cmpf(const libxl__numa_candidate *c1,
 
 /* The actual automatic NUMA placement routine */
 static int numa_place_domain(libxl__gc *gc, uint32_t domid,
-                             libxl_domain_build_info *info)
+                             libxl_domain_build_info *info,
+                             libxl_domain_create_info *c_info)
 {
     int found;
     libxl__numa_candidate candidate;
@@ -155,7 +156,7 @@ static int numa_place_domain(libxl__gc *gc, uint32_t domid,
     if (rc)
         return rc;
 
-    rc = libxl_domain_need_memory(CTX, info, &memkb);
+    rc = libxl_domain_need_memory(CTX, info, c_info, &memkb);
     if (rc)
         goto out;
     if (libxl_node_bitmap_alloc(CTX, &cpupool_nodemap, 0)) {
@@ -353,7 +354,7 @@ int libxl__build_pre(libxl__gc *gc, uint32_t domid,
         if (rc)
             return rc;
 
-        rc = numa_place_domain(gc, domid, info);
+        rc = numa_place_domain(gc, domid, info, &d_config->c_info);
         if (rc) {
             libxl_bitmap_dispose(&cpumap_soft);
             return rc;
diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h
index 057fd0f..eff6bc0 100644
--- a/tools/libxl/libxl_internal.h
+++ b/tools/libxl/libxl_internal.h
@@ -1099,7 +1099,8 @@ _hidden int libxl__init_console_from_channel(libxl__gc 
*gc,
 _hidden int libxl__domain_create_info_setdefault(libxl__gc *gc,
                                         libxl_domain_create_info *c_info);
 _hidden int libxl__domain_build_info_setdefault(libxl__gc *gc,
-                                        libxl_domain_build_info *b_info);
+                                        libxl_domain_build_info *b_info,
+                                        bool vmware_vga_default);
 _hidden int libxl__device_disk_setdefault(libxl__gc *gc,
                                           libxl_device_disk *disk);
 _hidden int libxl__device_nic_setdefault(libxl__gc *gc, libxl_device_nic *nic,
diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl
index 9d6ca45..501bb48 100644
--- a/tools/libxl/libxl_types.idl
+++ b/tools/libxl/libxl_types.idl
@@ -343,6 +343,7 @@ libxl_domain_create_info = Struct("domain_create_info",[
     ("run_hotplug_scripts",libxl_defbool),
     ("pvh",          libxl_defbool),
     ("driver_domain",libxl_defbool),
+    ("vmware_hwver", uint64),
     ], dir=DIR_IN)
 
 libxl_domain_restore_params = Struct("domain_restore_params", [
diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c
index ed2bd38..fd7dafa 100644
--- a/tools/libxl/libxl_x86.c
+++ b/tools/libxl/libxl_x86.c
@@ -5,8 +5,7 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc,
                                       libxl_domain_config *d_config,
                                       xc_domain_configuration_t *xc_config)
 {
-    /* No specific configuration right now */
-
+    xc_config->vmware_hwver = d_config->c_info.vmware_hwver;
     return 0;
 }
 
diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c
index 0e44b12..18ba70f 100644
--- a/tools/libxl/xl_cmdimpl.c
+++ b/tools/libxl/xl_cmdimpl.c
@@ -1382,6 +1382,8 @@ static void parse_config_data(const char *config_source,
     b_info->cmdline = parse_cmdline(config);
 
     xlu_cfg_get_defbool(config, "driver_domain", &c_info->driver_domain, 0);
+    if (!xlu_cfg_get_long(config, "vmware_hwver",  &l, 1))
+        c_info->vmware_hwver = l;
 
     switch(b_info->type) {
     case LIBXL_DOMAIN_TYPE_HVM:
@@ -2395,7 +2397,8 @@ static int preserve_domain(uint32_t *r_domid, libxl_event 
*event,
     return rc == 0 ? 1 : 0;
 }
 
-static int freemem(uint32_t domid, libxl_domain_build_info *b_info)
+static int freemem(uint32_t domid, libxl_domain_build_info *b_info,
+                   libxl_domain_create_info *c_info)
 {
     int rc, retries = 3;
     uint32_t need_memkb, free_memkb;
@@ -2403,7 +2406,7 @@ static int freemem(uint32_t domid, 
libxl_domain_build_info *b_info)
     if (!autoballoon)
         return 0;
 
-    rc = libxl_domain_need_memory(ctx, b_info, &need_memkb);
+    rc = libxl_domain_need_memory(ctx, b_info, c_info, &need_memkb);
     if (rc < 0)
         return rc;
 
@@ -2683,7 +2686,7 @@ start:
     if (rc < 0)
         goto error_out;
 
-    ret = freemem(domid, &d_config.b_info);
+    ret = freemem(domid, &d_config.b_info, &d_config.c_info);
     if (ret < 0) {
         fprintf(stderr, "failed to free memory for the domain\n");
         ret = ERROR_FAIL;
-- 
1.8.4


_______________________________________________
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®.