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

Re: [Xen-devel] [PATCH] libxl: fix compilation errors for ia64



Hi Ian,

>>>>> On Mon, 8 Nov 2010 16:17:03 +0000
>>>>> Ian.Jackson@xxxxxxxxxxxxx(Ian Jackson)  said:
> 
> This patch is very nearly perfect but I have one small quibble:
> 
> > diff -r 0dc0bc411035 tools/libxl/libxl_dom.c
> > --- a/tools/libxl/libxl_dom.c       Thu Oct 21 18:51:36 2010 +0100
> > +++ b/tools/libxl/libxl_dom.c       Fri Nov 05 14:45:35 2010 +0900
> > @@ -95,11 +95,11 @@
> >      xs_transaction_t t;
> >      char **ents;
> >      int i;
> > -    char *cpuid_res[4];
> >  
> >  #if defined(__i386__) || defined(__x86_64__)
> >      xc_cpuid_apply_policy(ctx->xch, domid);
> >      if (info->cpuid != NULL) {
> > +        char *cpuid_res[4];
> >          for (i = 0; info->cpuid[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++)
> >              xc_cpuid_set(ctx->xch, domid, info->cpuid[i].input,
> >                           (const char**)(info->cpuid[i].policy), cpuid_res);
> 
> I think that the right fix here is to take the whole of that #ifdef
> section and move it into a small function so that it can go into
> libxl_{no,}cpuid.c.

Ok. I added more two functions:
- libxl_cpuid_apply_policy
- libxl_cpuid_set

I confirmed this patch can be built on both x86_64 and ia64.

> I would have applied the patch apart from that hunk except that you
> didn't provide a Signed-Off-By.  Could you please resubmit which fixes
> up that last bit, and which is properly signed off ?

Signed-off-by: KUWAMURA Shin'ya <kuwa@xxxxxxxxxxxxxx>

Best regards,
-- 
  KUWAMURA Shin'ya
diff -r 0dc0bc411035 tools/libxl/Makefile
--- a/tools/libxl/Makefile      Thu Oct 21 18:51:36 2010 +0100
+++ b/tools/libxl/Makefile      Tue Nov 09 14:35:47 2010 +0900
@@ -26,6 +26,8 @@ LIBXL_OBJS-y += libxl_blktap2.o
 else
 LIBXL_OBJS-y += libxl_noblktap2.o
 endif
+LIBXL_OBJS-$(CONFIG_X86) += libxl_cpuid.o
+LIBXL_OBJS-$(CONFIG_IA64) += libxl_nocpuid.o
 
 LIBXL_OBJS = flexarray.o libxl.o libxl_pci.o libxl_dom.o libxl_exec.o 
libxl_xshelp.o libxl_device.o libxl_internal.o libxl_utils.o $(LIBXL_OBJS-y)
 LIBXL_OBJS += _libxl_types.o
diff -r 0dc0bc411035 tools/libxl/libxl.c
--- a/tools/libxl/libxl.c       Thu Oct 21 18:51:36 2010 +0100
+++ b/tools/libxl/libxl.c       Tue Nov 09 14:35:47 2010 +0900
@@ -102,21 +102,6 @@ void libxl_key_value_list_destroy(libxl_
     free(kvl);
 }
 
-void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
-{
-    int i, j;
-    libxl_cpuid_policy_list cpuid_list = *p_cpuid_list;
-
-    if (cpuid_list == NULL)
-        return;
-    for (i = 0; cpuid_list[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++) {
-        for (j = 0; j < 4; j++)
-            if (cpuid_list[i].policy[j] != NULL)
-                free(cpuid_list[i].policy[j]);
-    }
-    return;
-}
-
 
/******************************************************************************/
 
 int libxl_domain_make(libxl_ctx *ctx, libxl_domain_create_info *info,
@@ -3521,285 +3506,6 @@ uint32_t libxl_vm_get_start_time(libxl_c
     return ret;
 }
 
-#define CPUID_REG_INV 0
-#define CPUID_REG_EAX 1
-#define CPUID_REG_EBX 2
-#define CPUID_REG_ECX 3
-#define CPUID_REG_EDX 4
-
-/* mapping CPUID features to names
- * holds a "name" for each feature, specified by the "leaf" number (and an
- * optional "subleaf" in ECX), the "reg"ister (EAX-EDX) used and a number of
- * bits starting with "bit" and being "length" bits long.
- * Used for the static structure describing all features.
- */
-struct cpuid_flags {
-    char* name;
-    uint32_t leaf;
-    uint32_t subleaf;
-    int reg;
-    int bit;
-    int length;
-};
-
-/* go through the dynamic array finding the entry for a specified leaf.
- * if no entry exists, allocate one and return that.
- */
-static libxl_cpuid_policy_list cpuid_find_match(libxl_cpuid_policy_list *list,
-                                          uint32_t leaf, uint32_t subleaf)
-{
-    int i = 0;
-
-    if (*list != NULL) {
-        for (i = 0; (*list)[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++) {
-            if ((*list)[i].input[0] == leaf && (*list)[i].input[1] == subleaf)
-                return *list + i;
-        }
-    }
-    *list = realloc(*list, sizeof((*list)[0]) * (i + 2));
-    (*list)[i].input[0] = leaf;
-    (*list)[i].input[1] = subleaf;
-    memset((*list)[i].policy, 0, 4 * sizeof(char*));
-    (*list)[i + 1].input[0] = XEN_CPUID_INPUT_UNUSED;
-    return *list + i;
-}
-
-/* parse a single key=value pair and translate it into the libxc
- * used interface using 32-characters strings for each register.
- * Will overwrite earlier entries and thus can be called multiple
- * times.
- */
-int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str)
-{
-#define NA XEN_CPUID_INPUT_UNUSED
-    struct cpuid_flags cpuid_flags[] = {
-        {"maxleaf",      0x00000000, NA, CPUID_REG_EAX,  0, 32},
-      /* the following two entries are subject to tweaking later in the code */
-        {"family",       0x00000001, NA, CPUID_REG_EAX,  8,  8},
-        {"model",        0x00000001, NA, CPUID_REG_EAX,  4,  8},
-        {"stepping",     0x00000001, NA, CPUID_REG_EAX,  0,  4},
-        {"localapicid",  0x00000001, NA, CPUID_REG_EBX, 24,  8},
-        {"proccount",    0x00000001, NA, CPUID_REG_EBX, 16,  8},
-        {"clflush",      0x00000001, NA, CPUID_REG_EBX,  8,  8},
-        {"brandid",      0x00000001, NA, CPUID_REG_EBX,  0,  8},
-        {"f16c",         0x00000001, NA, CPUID_REG_ECX, 29,  1},
-        {"avx",          0x00000001, NA, CPUID_REG_ECX, 28,  1},
-        {"osxsave",      0x00000001, NA, CPUID_REG_ECX, 27,  1},
-        {"xsave",        0x00000001, NA, CPUID_REG_ECX, 26,  1},
-        {"aes",          0x00000001, NA, CPUID_REG_ECX, 25,  1},
-        {"popcnt",       0x00000001, NA, CPUID_REG_ECX, 23,  1},
-        {"movbe",        0x00000001, NA, CPUID_REG_ECX, 22,  1},
-        {"x2apic",       0x00000001, NA, CPUID_REG_ECX, 21,  1},
-        {"sse4.2",       0x00000001, NA, CPUID_REG_ECX, 20,  1},
-        {"sse4.1",       0x00000001, NA, CPUID_REG_ECX, 19,  1},
-        {"dca",          0x00000001, NA, CPUID_REG_ECX, 18,  1},
-        {"pdcm",         0x00000001, NA, CPUID_REG_ECX, 15,  1},
-        {"xtpr",         0x00000001, NA, CPUID_REG_ECX, 14,  1},
-        {"cmpxchg16",    0x00000001, NA, CPUID_REG_ECX, 13,  1},
-        {"cntxid",       0x00000001, NA, CPUID_REG_ECX, 10,  1},
-        {"ssse3",        0x00000001, NA, CPUID_REG_ECX,  9,  1},
-        {"tm2",          0x00000001, NA, CPUID_REG_ECX,  8,  1},
-        {"est",          0x00000001, NA, CPUID_REG_ECX,  7,  1},
-        {"smx",          0x00000001, NA, CPUID_REG_ECX,  6,  1},
-        {"vmx",          0x00000001, NA, CPUID_REG_ECX,  5,  1},
-        {"dscpl",        0x00000001, NA, CPUID_REG_ECX,  4,  1},
-        {"monitor",      0x00000001, NA, CPUID_REG_ECX,  3,  1},
-        {"dtes64",       0x00000001, NA, CPUID_REG_ECX,  2,  1},
-        {"sse3",         0x00000001, NA, CPUID_REG_ECX,  0,  1},
-        {"pbe",          0x00000001, NA, CPUID_REG_EDX, 31,  1},
-        {"ia64",         0x00000001, NA, CPUID_REG_EDX, 30,  1},
-        {"tm",           0x00000001, NA, CPUID_REG_EDX, 29,  1},
-        {"htt",          0x00000001, NA, CPUID_REG_EDX, 28,  1},
-        {"ss",           0x00000001, NA, CPUID_REG_EDX, 27,  1},
-        {"sse2",         0x00000001, NA, CPUID_REG_EDX, 26,  1},
-        {"sse",          0x00000001, NA, CPUID_REG_EDX, 25,  1},
-        {"fxsr",         0x00000001, NA, CPUID_REG_EDX, 24,  1},
-        {"mmx",          0x00000001, NA, CPUID_REG_EDX, 23,  1},
-        {"acpi",         0x00000001, NA, CPUID_REG_EDX, 22,  1},
-        {"ds",           0x00000001, NA, CPUID_REG_EDX, 21,  1},
-        {"clfsh",        0x00000001, NA, CPUID_REG_EDX, 19,  1},
-        {"psn",          0x00000001, NA, CPUID_REG_EDX, 18,  1},
-        {"pse36",        0x00000001, NA, CPUID_REG_EDX, 17,  1},
-        {"pat",          0x00000001, NA, CPUID_REG_EDX, 16,  1},
-        {"cmov",         0x00000001, NA, CPUID_REG_EDX, 15,  1},
-        {"mca",          0x00000001, NA, CPUID_REG_EDX, 14,  1},
-        {"pge",          0x00000001, NA, CPUID_REG_EDX, 13,  1},
-        {"mtrr",         0x00000001, NA, CPUID_REG_EDX, 12,  1},
-        {"sysenter",     0x00000001, NA, CPUID_REG_EDX, 11,  1},
-        {"apic",         0x00000001, NA, CPUID_REG_EDX,  9,  1},
-        {"cmpxchg8",     0x00000001, NA, CPUID_REG_EDX,  8,  1},
-        {"mce",          0x00000001, NA, CPUID_REG_EDX,  7,  1},
-        {"pae",          0x00000001, NA, CPUID_REG_EDX,  6,  1},
-        {"msr",          0x00000001, NA, CPUID_REG_EDX,  5,  1},
-        {"tsc",          0x00000001, NA, CPUID_REG_EDX,  4,  1},
-        {"pse",          0x00000001, NA, CPUID_REG_EDX,  3,  1},
-        {"de",           0x00000001, NA, CPUID_REG_EDX,  2,  1},
-        {"vme",          0x00000001, NA, CPUID_REG_EDX,  1,  1},
-        {"fpu",          0x00000001, NA, CPUID_REG_EDX,  0,  1},
-        {"topoext",      0x80000001, NA, CPUID_REG_ECX, 22,  1},
-        {"tbm",          0x80000001, NA, CPUID_REG_ECX, 21,  1},
-        {"nodeid",       0x80000001, NA, CPUID_REG_ECX, 19,  1},
-        {"fma4",         0x80000001, NA, CPUID_REG_ECX, 16,  1},
-        {"lwp",          0x80000001, NA, CPUID_REG_ECX, 15,  1},
-        {"wdt",          0x80000001, NA, CPUID_REG_ECX, 13,  1},
-        {"skinit",       0x80000001, NA, CPUID_REG_ECX, 12,  1},
-        {"xop",          0x80000001, NA, CPUID_REG_ECX, 11,  1},
-        {"ibs",          0x80000001, NA, CPUID_REG_ECX, 10,  1},
-        {"osvw",         0x80000001, NA, CPUID_REG_ECX, 10,  1},
-        {"3dnowprefetch",0x80000001, NA, CPUID_REG_ECX,  8,  1},
-        {"misalignsse",  0x80000001, NA, CPUID_REG_ECX,  7,  1},
-        {"sse4a",        0x80000001, NA, CPUID_REG_ECX,  6,  1},
-        {"abm",          0x80000001, NA, CPUID_REG_ECX,  5,  1},
-        {"altmovcr8",    0x80000001, NA, CPUID_REG_ECX,  4,  1},
-        {"extapic",      0x80000001, NA, CPUID_REG_ECX,  3,  1},
-        {"svm",          0x80000001, NA, CPUID_REG_ECX,  2,  1},
-        {"cmplegacy",    0x80000001, NA, CPUID_REG_ECX,  1,  1},
-        {"lahfsahf",     0x80000001, NA, CPUID_REG_ECX,  0,  1},
-        {"3dnow",        0x80000001, NA, CPUID_REG_EDX, 31,  1},
-        {"3dnowext",     0x80000001, NA, CPUID_REG_EDX, 30,  1},
-        {"lm",           0x80000001, NA, CPUID_REG_EDX, 29,  1},
-        {"rdtscp",       0x80000001, NA, CPUID_REG_EDX, 27,  1},
-        {"page1gb",      0x80000001, NA, CPUID_REG_EDX, 26,  1},
-        {"ffxsr",        0x80000001, NA, CPUID_REG_EDX, 25,  1},
-        {"mmxext",       0x80000001, NA, CPUID_REG_EDX, 22,  1},
-        {"nx",           0x80000001, NA, CPUID_REG_EDX, 20,  1},
-        {"syscall",      0x80000001, NA, CPUID_REG_EDX, 11,  1},
-        {"procpkg",      0x00000004,  0, CPUID_REG_EAX, 26,  6},
-        {"apicidsize",   0x80000008, NA, CPUID_REG_ECX, 12,  4},
-        {"nc",           0x80000008, NA, CPUID_REG_ECX,  0,  8},
-
-        {NULL, 0, CPUID_REG_INV, 0, 0}
-    };
-#undef NA
-    char *sep, *val, *endptr;
-    int i;
-    struct cpuid_flags *flag;
-    struct libxl__cpuid_policy *entry;
-    unsigned long num;
-    char flags[33], *resstr;
-
-    sep = strchr(str, '=');
-    if (sep == NULL) {
-        return 1;
-    } else {
-        val = sep + 1;
-    }
-    for (flag = cpuid_flags; flag->name != NULL; flag++) {
-        if(!strncmp(str, flag->name, sep - str) && flag->name[sep - str] == 0)
-            break;
-    }
-    if (flag->name == NULL) {
-        return 2;
-    }
-    entry = cpuid_find_match(cpuid, flag->leaf, flag->subleaf);
-    resstr = entry->policy[flag->reg - 1];
-    if (resstr == NULL) {
-        resstr = strdup("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
-    }
-    num = strtoull(val, &endptr, 0);
-    flags[flag->length] = 0;
-    if (endptr != val) {
-        /* is this was a valid number, write the binary form into the string */
-        for (i = 0; i < flag->length; i++) {
-            flags[flag->length - 1 - i] = "01"[!!(num & (1 << i))];
-        }
-    } else {
-        switch(val[0]) {
-        case 'x': case 'k': case 's':
-            memset(flags, val[0], flag->length);
-            break;
-        default:
-            return 3;
-        }
-    }
-    /* the family and model entry is potentially split up across
-     * two fields in Fn0000_0001_EAX, so handle them here separately.
-     */
-    if (!strncmp(str, "family", sep - str)) {
-        if (num < 16) {
-            memcpy(resstr + (32 - 4) - flag->bit, flags + 4, 4);
-            memcpy(resstr + (32 - 8) - 20, "00000000", 8);
-        } else {
-            num -= 15;
-            memcpy(resstr + (32 - 4) - flag->bit, "1111", 4);
-            for (i = 0; i < 7; i++) {
-                flags[7 - i] = "01"[num & 1];
-                num >>= 1;
-            }
-            memcpy(resstr + (32 - 8) - 20, flags, 8);
-        }
-    } else if (!strncmp(str, "model", sep - str)) {
-        memcpy(resstr + (32 - 4) - 16, flags, 4);
-        memcpy(resstr + (32 - 4) - flag->bit, flags + 4, 4);
-    } else {
-        memcpy(resstr + (32 - flag->length) - flag->bit, flags,
-               flag->length);
-    }
-    entry->policy[flag->reg - 1] = resstr;
-
-    return 0;
-}
-
-/* parse a single list item from the legacy Python xend syntax, where
- * the strings for each register were directly exposed to the user.
- * Used for maintaining compatibility with older config files
- */
-int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid,
-                                  const char* str)
-{
-    char *endptr;
-    unsigned long value;
-    uint32_t leaf, subleaf = XEN_CPUID_INPUT_UNUSED;
-    struct libxl__cpuid_policy *entry;
-
-    /* parse the leaf number */
-    value = strtoul(str, &endptr, 0);
-    if (str == endptr) {
-        return 1;
-    }
-    leaf = value;
-    /* check for an optional subleaf number */
-    if (*endptr == ',') {
-        str = endptr + 1;
-        value = strtoul(str, &endptr, 0);
-        if (str == endptr) {
-            return 2;
-        }
-        subleaf = value;
-    }
-    if (*endptr != ':') {
-        return 3;
-    }
-    str = endptr + 1;
-    entry = cpuid_find_match(cpuid, leaf, subleaf);
-    for (str = endptr + 1; *str != 0;) {
-        if (str[0] != 'e' || str[2] != 'x') {
-            return 4;
-        }
-        value = str[1] - 'a';
-        endptr = strchr(str, '=');
-        if (value < 0 || value > 3 || endptr == NULL) {
-            return 4;
-        }
-        str = endptr + 1;
-        endptr = strchr(str, ',');
-        if (endptr == NULL) {
-            endptr = strchr(str, 0);
-        }
-        if (endptr - str != 32) {
-            return 5;
-        }
-        entry->policy[value] = calloc(32 + 1, 1);
-        strncpy(entry->policy[value], str, 32);
-        entry->policy[value][32] = 0;
-        if (*endptr == 0) {
-            break;
-        }
-        for (str = endptr + 1; *str == ' ' || *str == '\n'; str++);
-    }
-    return 0;
-}
-
 char *libxl_tmem_list(libxl_ctx *ctx, uint32_t domid, int use_long)
 {
     int rc;
diff -r 0dc0bc411035 tools/libxl/libxl.h
--- a/tools/libxl/libxl.h       Thu Oct 21 18:51:36 2010 +0100
+++ b/tools/libxl/libxl.h       Tue Nov 09 14:35:47 2010 +0900
@@ -421,6 +421,9 @@ int libxl_device_pci_parse_bdf(libxl_ctx
 int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str);
 int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid,
                                   const char* str);
+void libxl_cpuid_apply_policy(libxl_ctx *ctx, uint32_t domid);
+void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
+                    libxl_cpuid_policy_list cpuid);
 
 /*
  * Functions for allowing users of libxl to store private data
diff -r 0dc0bc411035 tools/libxl/libxl_cpuid.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/libxl_cpuid.c Tue Nov 09 14:35:47 2010 +0900
@@ -0,0 +1,327 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ */
+
+#include <string.h>
+
+#include "libxl.h"
+#include "libxl_osdeps.h"
+#include "libxl_internal.h"
+
+void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
+{
+    int i, j;
+    libxl_cpuid_policy_list cpuid_list = *p_cpuid_list;
+
+    if (cpuid_list == NULL)
+        return;
+    for (i = 0; cpuid_list[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++) {
+        for (j = 0; j < 4; j++)
+            if (cpuid_list[i].policy[j] != NULL)
+                free(cpuid_list[i].policy[j]);
+    }
+    return;
+}
+
+#define CPUID_REG_INV 0
+#define CPUID_REG_EAX 1
+#define CPUID_REG_EBX 2
+#define CPUID_REG_ECX 3
+#define CPUID_REG_EDX 4
+
+/* mapping CPUID features to names
+ * holds a "name" for each feature, specified by the "leaf" number (and an
+ * optional "subleaf" in ECX), the "reg"ister (EAX-EDX) used and a number of
+ * bits starting with "bit" and being "length" bits long.
+ * Used for the static structure describing all features.
+ */
+struct cpuid_flags {
+    char* name;
+    uint32_t leaf;
+    uint32_t subleaf;
+    int reg;
+    int bit;
+    int length;
+};
+
+/* go through the dynamic array finding the entry for a specified leaf.
+ * if no entry exists, allocate one and return that.
+ */
+static libxl_cpuid_policy_list cpuid_find_match(libxl_cpuid_policy_list *list,
+                                          uint32_t leaf, uint32_t subleaf)
+{
+    int i = 0;
+
+    if (*list != NULL) {
+        for (i = 0; (*list)[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++) {
+            if ((*list)[i].input[0] == leaf && (*list)[i].input[1] == subleaf)
+                return *list + i;
+        }
+    }
+    *list = realloc(*list, sizeof((*list)[0]) * (i + 2));
+    (*list)[i].input[0] = leaf;
+    (*list)[i].input[1] = subleaf;
+    memset((*list)[i].policy, 0, 4 * sizeof(char*));
+    (*list)[i + 1].input[0] = XEN_CPUID_INPUT_UNUSED;
+    return *list + i;
+}
+
+/* parse a single key=value pair and translate it into the libxc
+ * used interface using 32-characters strings for each register.
+ * Will overwrite earlier entries and thus can be called multiple
+ * times.
+ */
+int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str)
+{
+#define NA XEN_CPUID_INPUT_UNUSED
+    struct cpuid_flags cpuid_flags[] = {
+        {"maxleaf",      0x00000000, NA, CPUID_REG_EAX,  0, 32},
+      /* the following two entries are subject to tweaking later in the code */
+        {"family",       0x00000001, NA, CPUID_REG_EAX,  8,  8},
+        {"model",        0x00000001, NA, CPUID_REG_EAX,  4,  8},
+        {"stepping",     0x00000001, NA, CPUID_REG_EAX,  0,  4},
+        {"localapicid",  0x00000001, NA, CPUID_REG_EBX, 24,  8},
+        {"proccount",    0x00000001, NA, CPUID_REG_EBX, 16,  8},
+        {"clflush",      0x00000001, NA, CPUID_REG_EBX,  8,  8},
+        {"brandid",      0x00000001, NA, CPUID_REG_EBX,  0,  8},
+        {"f16c",         0x00000001, NA, CPUID_REG_ECX, 29,  1},
+        {"avx",          0x00000001, NA, CPUID_REG_ECX, 28,  1},
+        {"osxsave",      0x00000001, NA, CPUID_REG_ECX, 27,  1},
+        {"xsave",        0x00000001, NA, CPUID_REG_ECX, 26,  1},
+        {"aes",          0x00000001, NA, CPUID_REG_ECX, 25,  1},
+        {"popcnt",       0x00000001, NA, CPUID_REG_ECX, 23,  1},
+        {"movbe",        0x00000001, NA, CPUID_REG_ECX, 22,  1},
+        {"x2apic",       0x00000001, NA, CPUID_REG_ECX, 21,  1},
+        {"sse4.2",       0x00000001, NA, CPUID_REG_ECX, 20,  1},
+        {"sse4.1",       0x00000001, NA, CPUID_REG_ECX, 19,  1},
+        {"dca",          0x00000001, NA, CPUID_REG_ECX, 18,  1},
+        {"pdcm",         0x00000001, NA, CPUID_REG_ECX, 15,  1},
+        {"xtpr",         0x00000001, NA, CPUID_REG_ECX, 14,  1},
+        {"cmpxchg16",    0x00000001, NA, CPUID_REG_ECX, 13,  1},
+        {"cntxid",       0x00000001, NA, CPUID_REG_ECX, 10,  1},
+        {"ssse3",        0x00000001, NA, CPUID_REG_ECX,  9,  1},
+        {"tm2",          0x00000001, NA, CPUID_REG_ECX,  8,  1},
+        {"est",          0x00000001, NA, CPUID_REG_ECX,  7,  1},
+        {"smx",          0x00000001, NA, CPUID_REG_ECX,  6,  1},
+        {"vmx",          0x00000001, NA, CPUID_REG_ECX,  5,  1},
+        {"dscpl",        0x00000001, NA, CPUID_REG_ECX,  4,  1},
+        {"monitor",      0x00000001, NA, CPUID_REG_ECX,  3,  1},
+        {"dtes64",       0x00000001, NA, CPUID_REG_ECX,  2,  1},
+        {"sse3",         0x00000001, NA, CPUID_REG_ECX,  0,  1},
+        {"pbe",          0x00000001, NA, CPUID_REG_EDX, 31,  1},
+        {"ia64",         0x00000001, NA, CPUID_REG_EDX, 30,  1},
+        {"tm",           0x00000001, NA, CPUID_REG_EDX, 29,  1},
+        {"htt",          0x00000001, NA, CPUID_REG_EDX, 28,  1},
+        {"ss",           0x00000001, NA, CPUID_REG_EDX, 27,  1},
+        {"sse2",         0x00000001, NA, CPUID_REG_EDX, 26,  1},
+        {"sse",          0x00000001, NA, CPUID_REG_EDX, 25,  1},
+        {"fxsr",         0x00000001, NA, CPUID_REG_EDX, 24,  1},
+        {"mmx",          0x00000001, NA, CPUID_REG_EDX, 23,  1},
+        {"acpi",         0x00000001, NA, CPUID_REG_EDX, 22,  1},
+        {"ds",           0x00000001, NA, CPUID_REG_EDX, 21,  1},
+        {"clfsh",        0x00000001, NA, CPUID_REG_EDX, 19,  1},
+        {"psn",          0x00000001, NA, CPUID_REG_EDX, 18,  1},
+        {"pse36",        0x00000001, NA, CPUID_REG_EDX, 17,  1},
+        {"pat",          0x00000001, NA, CPUID_REG_EDX, 16,  1},
+        {"cmov",         0x00000001, NA, CPUID_REG_EDX, 15,  1},
+        {"mca",          0x00000001, NA, CPUID_REG_EDX, 14,  1},
+        {"pge",          0x00000001, NA, CPUID_REG_EDX, 13,  1},
+        {"mtrr",         0x00000001, NA, CPUID_REG_EDX, 12,  1},
+        {"sysenter",     0x00000001, NA, CPUID_REG_EDX, 11,  1},
+        {"apic",         0x00000001, NA, CPUID_REG_EDX,  9,  1},
+        {"cmpxchg8",     0x00000001, NA, CPUID_REG_EDX,  8,  1},
+        {"mce",          0x00000001, NA, CPUID_REG_EDX,  7,  1},
+        {"pae",          0x00000001, NA, CPUID_REG_EDX,  6,  1},
+        {"msr",          0x00000001, NA, CPUID_REG_EDX,  5,  1},
+        {"tsc",          0x00000001, NA, CPUID_REG_EDX,  4,  1},
+        {"pse",          0x00000001, NA, CPUID_REG_EDX,  3,  1},
+        {"de",           0x00000001, NA, CPUID_REG_EDX,  2,  1},
+        {"vme",          0x00000001, NA, CPUID_REG_EDX,  1,  1},
+        {"fpu",          0x00000001, NA, CPUID_REG_EDX,  0,  1},
+        {"topoext",      0x80000001, NA, CPUID_REG_ECX, 22,  1},
+        {"tbm",          0x80000001, NA, CPUID_REG_ECX, 21,  1},
+        {"nodeid",       0x80000001, NA, CPUID_REG_ECX, 19,  1},
+        {"fma4",         0x80000001, NA, CPUID_REG_ECX, 16,  1},
+        {"lwp",          0x80000001, NA, CPUID_REG_ECX, 15,  1},
+        {"wdt",          0x80000001, NA, CPUID_REG_ECX, 13,  1},
+        {"skinit",       0x80000001, NA, CPUID_REG_ECX, 12,  1},
+        {"xop",          0x80000001, NA, CPUID_REG_ECX, 11,  1},
+        {"ibs",          0x80000001, NA, CPUID_REG_ECX, 10,  1},
+        {"osvw",         0x80000001, NA, CPUID_REG_ECX, 10,  1},
+        {"3dnowprefetch",0x80000001, NA, CPUID_REG_ECX,  8,  1},
+        {"misalignsse",  0x80000001, NA, CPUID_REG_ECX,  7,  1},
+        {"sse4a",        0x80000001, NA, CPUID_REG_ECX,  6,  1},
+        {"abm",          0x80000001, NA, CPUID_REG_ECX,  5,  1},
+        {"altmovcr8",    0x80000001, NA, CPUID_REG_ECX,  4,  1},
+        {"extapic",      0x80000001, NA, CPUID_REG_ECX,  3,  1},
+        {"svm",          0x80000001, NA, CPUID_REG_ECX,  2,  1},
+        {"cmplegacy",    0x80000001, NA, CPUID_REG_ECX,  1,  1},
+        {"lahfsahf",     0x80000001, NA, CPUID_REG_ECX,  0,  1},
+        {"3dnow",        0x80000001, NA, CPUID_REG_EDX, 31,  1},
+        {"3dnowext",     0x80000001, NA, CPUID_REG_EDX, 30,  1},
+        {"lm",           0x80000001, NA, CPUID_REG_EDX, 29,  1},
+        {"rdtscp",       0x80000001, NA, CPUID_REG_EDX, 27,  1},
+        {"page1gb",      0x80000001, NA, CPUID_REG_EDX, 26,  1},
+        {"ffxsr",        0x80000001, NA, CPUID_REG_EDX, 25,  1},
+        {"mmxext",       0x80000001, NA, CPUID_REG_EDX, 22,  1},
+        {"nx",           0x80000001, NA, CPUID_REG_EDX, 20,  1},
+        {"syscall",      0x80000001, NA, CPUID_REG_EDX, 11,  1},
+        {"procpkg",      0x00000004,  0, CPUID_REG_EAX, 26,  6},
+        {"apicidsize",   0x80000008, NA, CPUID_REG_ECX, 12,  4},
+        {"nc",           0x80000008, NA, CPUID_REG_ECX,  0,  8},
+
+        {NULL, 0, CPUID_REG_INV, 0, 0}
+    };
+#undef NA
+    char *sep, *val, *endptr;
+    int i;
+    struct cpuid_flags *flag;
+    struct libxl__cpuid_policy *entry;
+    unsigned long num;
+    char flags[33], *resstr;
+
+    sep = strchr(str, '=');
+    if (sep == NULL) {
+        return 1;
+    } else {
+        val = sep + 1;
+    }
+    for (flag = cpuid_flags; flag->name != NULL; flag++) {
+        if(!strncmp(str, flag->name, sep - str) && flag->name[sep - str] == 0)
+            break;
+    }
+    if (flag->name == NULL) {
+        return 2;
+    }
+    entry = cpuid_find_match(cpuid, flag->leaf, flag->subleaf);
+    resstr = entry->policy[flag->reg - 1];
+    if (resstr == NULL) {
+        resstr = strdup("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
+    }
+    num = strtoull(val, &endptr, 0);
+    flags[flag->length] = 0;
+    if (endptr != val) {
+        /* is this was a valid number, write the binary form into the string */
+        for (i = 0; i < flag->length; i++) {
+            flags[flag->length - 1 - i] = "01"[!!(num & (1 << i))];
+        }
+    } else {
+        switch(val[0]) {
+        case 'x': case 'k': case 's':
+            memset(flags, val[0], flag->length);
+            break;
+        default:
+            return 3;
+        }
+    }
+    /* the family and model entry is potentially split up across
+     * two fields in Fn0000_0001_EAX, so handle them here separately.
+     */
+    if (!strncmp(str, "family", sep - str)) {
+        if (num < 16) {
+            memcpy(resstr + (32 - 4) - flag->bit, flags + 4, 4);
+            memcpy(resstr + (32 - 8) - 20, "00000000", 8);
+        } else {
+            num -= 15;
+            memcpy(resstr + (32 - 4) - flag->bit, "1111", 4);
+            for (i = 0; i < 7; i++) {
+                flags[7 - i] = "01"[num & 1];
+                num >>= 1;
+            }
+            memcpy(resstr + (32 - 8) - 20, flags, 8);
+        }
+    } else if (!strncmp(str, "model", sep - str)) {
+        memcpy(resstr + (32 - 4) - 16, flags, 4);
+        memcpy(resstr + (32 - 4) - flag->bit, flags + 4, 4);
+    } else {
+        memcpy(resstr + (32 - flag->length) - flag->bit, flags,
+               flag->length);
+    }
+    entry->policy[flag->reg - 1] = resstr;
+
+    return 0;
+}
+
+/* parse a single list item from the legacy Python xend syntax, where
+ * the strings for each register were directly exposed to the user.
+ * Used for maintaining compatibility with older config files
+ */
+int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid,
+                                  const char* str)
+{
+    char *endptr;
+    unsigned long value;
+    uint32_t leaf, subleaf = XEN_CPUID_INPUT_UNUSED;
+    struct libxl__cpuid_policy *entry;
+
+    /* parse the leaf number */
+    value = strtoul(str, &endptr, 0);
+    if (str == endptr) {
+        return 1;
+    }
+    leaf = value;
+    /* check for an optional subleaf number */
+    if (*endptr == ',') {
+        str = endptr + 1;
+        value = strtoul(str, &endptr, 0);
+        if (str == endptr) {
+            return 2;
+        }
+        subleaf = value;
+    }
+    if (*endptr != ':') {
+        return 3;
+    }
+    str = endptr + 1;
+    entry = cpuid_find_match(cpuid, leaf, subleaf);
+    for (str = endptr + 1; *str != 0;) {
+        if (str[0] != 'e' || str[2] != 'x') {
+            return 4;
+        }
+        value = str[1] - 'a';
+        endptr = strchr(str, '=');
+        if (value < 0 || value > 3 || endptr == NULL) {
+            return 4;
+        }
+        str = endptr + 1;
+        endptr = strchr(str, ',');
+        if (endptr == NULL) {
+            endptr = strchr(str, 0);
+        }
+        if (endptr - str != 32) {
+            return 5;
+        }
+        entry->policy[value] = calloc(32 + 1, 1);
+        strncpy(entry->policy[value], str, 32);
+        entry->policy[value][32] = 0;
+        if (*endptr == 0) {
+            break;
+        }
+        for (str = endptr + 1; *str == ' ' || *str == '\n'; str++);
+    }
+    return 0;
+}
+
+void libxl_cpuid_apply_policy(libxl_ctx *ctx, uint32_t domid)
+{
+    xc_cpuid_apply_policy(ctx->xch, domid);
+}
+
+void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
+                    libxl_cpuid_policy_list cpuid)
+{
+    int i;
+    char *cpuid_res[4];
+
+    for (i = 0; cpuid[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++)
+        xc_cpuid_set(ctx->xch, domid, cpuid[i].input,
+                     (const char**)(cpuid[i].policy), cpuid_res);
+}
diff -r 0dc0bc411035 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c   Thu Oct 21 18:51:36 2010 +0100
+++ b/tools/libxl/libxl_dom.c   Tue Nov 09 14:35:47 2010 +0900
@@ -95,16 +95,10 @@ int libxl__build_post(libxl_ctx *ctx, ui
     xs_transaction_t t;
     char **ents;
     int i;
-    char *cpuid_res[4];
 
-#if defined(__i386__) || defined(__x86_64__)
-    xc_cpuid_apply_policy(ctx->xch, domid);
-    if (info->cpuid != NULL) {
-        for (i = 0; info->cpuid[i].input[0] != XEN_CPUID_INPUT_UNUSED; i++)
-            xc_cpuid_set(ctx->xch, domid, info->cpuid[i].input,
-                         (const char**)(info->cpuid[i].policy), cpuid_res);
-    }
-#endif
+    libxl_cpuid_apply_policy(ctx, domid);
+    if (info->cpuid != NULL)
+        libxl_cpuid_set(ctx, domid, info->cpuid);
 
     ents = libxl__calloc(&gc, 12 + (info->max_vcpus * 2) + 2, sizeof(char *));
     ents[0] = "memory/static-max";
diff -r 0dc0bc411035 tools/libxl/libxl_nocpuid.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/libxl/libxl_nocpuid.c       Tue Nov 09 14:35:47 2010 +0900
@@ -0,0 +1,37 @@
+/*
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; version 2.1 only. with the special
+ * exception on linking described in file LICENSE.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ */
+
+#include "libxl.h"
+
+void libxl_cpuid_destroy(libxl_cpuid_policy_list *p_cpuid_list)
+{
+}
+
+int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str)
+{
+    return 0;
+}
+
+int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid,
+                                  const char* str)
+{
+    return 0;
+}
+
+void libxl_cpuid_apply_policy(libxl_ctx *ctx, uint32_t domid)
+{
+}
+
+void libxl_cpuid_set(libxl_ctx *ctx, uint32_t domid,
+                    libxl_cpuid_policy_list cpuid)
+{
+}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

 


Rackspace

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