# HG changeset patch
# User Andre Przywara <andre.przywara@xxxxxxx>
# Date 1285950061 -3600
# Node ID a8c72f5a6bce9c99fece480f4c8e5d19121674e5
# Parent 27c01a2e2a470f4650890d654d7fe052b6e2777c
libxl: implementing legacy xm cpuid parser
To support compatibility with the xm config files, add a parser for the
old style cpuid= syntax. This uses a Python list, so it can be
distinguished from the new syntax easily.
Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
Signed-off-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
committer: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
---
tools/libxl/libxl.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++
tools/libxl/libxl.h | 2 +
2 files changed, 62 insertions(+)
diff -r 27c01a2e2a47 -r a8c72f5a6bce tools/libxl/libxl.c
--- a/tools/libxl/libxl.c Fri Oct 01 17:20:41 2010 +0100
+++ b/tools/libxl/libxl.c Fri Oct 01 17:21:01 2010 +0100
@@ -3743,6 +3743,66 @@ int libxl_cpuid_parse_config(libxl_cpuid
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 27c01a2e2a47 -r a8c72f5a6bce tools/libxl/libxl.h
--- a/tools/libxl/libxl.h Fri Oct 01 17:20:41 2010 +0100
+++ b/tools/libxl/libxl.h Fri Oct 01 17:21:01 2010 +0100
@@ -412,6 +412,8 @@ int libxl_device_pci_list_assignable(lib
int libxl_device_pci_list_assignable(libxl_ctx *ctx, libxl_device_pci **list,
int *num);
int libxl_device_pci_parse_bdf(libxl_ctx *ctx, libxl_device_pci *pcidev, const
char *str);
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);
/*
* Functions for allowing users of libxl to store private data
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|