To support legacy xm-based config files, add a parser for the old
style cpuid= syntax. Provided for backward compatibility.
Signed-off-by: Andre Przywara <andre.przywara@xxxxxxx>
--
Andre Przywara
AMD-Operating System Research Center (OSRC), Dresden, Germany
Tel: +49 351 448-3567-12
>From 0019b6d3609a200a5cb4e0808cf3ced80084daa1 Mon Sep 17 00:00:00 2001
From: Andre Przywara <andre.przywara@xxxxxxx>
Date: Wed, 1 Sep 2010 09:22:35 +0200
Subject: [PATCH 4/5] libxl: implementating legacy xm cpuid parser
To support legacy xm-based 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>
---
tools/libxl/libxl.c | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++
tools/libxl/libxl.h | 2 +
2 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c
index 04c8e33..e3136f0 100644
--- a/tools/libxl/libxl.c
+++ b/tools/libxl/libxl.c
@@ -3446,6 +3446,66 @@ int libxl_cpuid_parse_config(libxl_cpuid_policy_list
*cpuid, const char* str)
return 0;
}
+/* parse a single list item from the legacy Python xm 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_legacy(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 --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h
index 484173d..12d27bc 100644
--- a/tools/libxl/libxl.h
+++ b/tools/libxl/libxl.h
@@ -402,6 +402,8 @@ int libxl_device_pci_list_assigned(libxl_ctx *ctx,
libxl_device_pci **list, uint
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_legacy(libxl_cpuid_policy_list *cpuid,
+ const char* str);
/*
* Functions for allowing users of libxl to store private data
--
1.6.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|