diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/tools/libxl/libxl_cpuid.c xen-4.6.1-new/tools/libxl/libxl_cpuid.c --- xen-4.6.1/tools/libxl/libxl_cpuid.c 2016-02-09 16:44:19.000000000 +0200 +++ xen-4.6.1-new/tools/libxl/libxl_cpuid.c 2016-07-10 12:09:36.092000000 +0300 @@ -318,12 +318,31 @@ 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); + switch (endptr - str) { + case 32: { + strncpy(entry->policy[value], str, 32); + } + break; + case 8: { + uint32_t cpuid_hex = strtoul(str,&endptr,16); + if ( str +8 != endptr ) + return 6; + for (int i=0;i<32;i++) { + if ( cpuid_hex & (1<policy[value][31-i]='1'; + else + entry->policy[value][31-i]='0'; + } + entry->policy[value][32]=0; + } + break; + default: + return 5; + } entry->policy[value][32] = 0; + if (*endptr == 0) { break; } diff -ur -x .cproject -x .project -x '*.swp' xen-4.6.1/tools/libxl/xl_cmdimpl.c xen-4.6.1-new/tools/libxl/xl_cmdimpl.c --- xen-4.6.1/tools/libxl/xl_cmdimpl.c 2016-07-11 23:45:45.046000000 +0300 +++ xen-4.6.1-new/tools/libxl/xl_cmdimpl.c 2016-07-10 12:07:55.564000000 +0300 @@ -2095,7 +2095,10 @@ errstr = "invalid register name (must be e[abcd]x)"; break; case 5: - errstr = "policy string must be exactly 32 characters long"; + errstr = "policy string must be exactly 32 (binary) or 8 (hex) characters long"; + break; + case 6: + errstr = "error decoding policy string"; break; default: errstr = "unknown error";