diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 2a9c6fc954..1436aee483 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -549,7 +549,7 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags) if ( !is_idle_domain(d) ) { - d->arch.cpuids = xzalloc_array(cpuid_input_t, MAX_CPUID_INPUT); + d->arch.cpuids = xmalloc_array(cpuid_input_t, MAX_CPUID_INPUT); rc = -ENOMEM; if ( d->arch.cpuids == NULL ) goto fail; diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index ae29a56a1e..d792e8767e 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -1006,14 +1006,18 @@ long arch_do_domctl( case XEN_DOMCTL_set_cpuid: { xen_domctl_cpuid_t *ctl = &domctl->u.cpuid; - cpuid_input_t *cpuid = NULL; + cpuid_input_t *cpuid, *unused = NULL; for ( i = 0; i < MAX_CPUID_INPUT; i++ ) { cpuid = &d->arch.cpuids[i]; if ( cpuid->input[0] == XEN_CPUID_INPUT_UNUSED ) - break; + { + if ( !unused ) + unused = cpuid; + continue; + } if ( (cpuid->input[0] == ctl->input[0]) && ((cpuid->input[1] == XEN_CPUID_INPUT_UNUSED) || @@ -1021,15 +1025,12 @@ long arch_do_domctl( break; } - if ( i == MAX_CPUID_INPUT ) - { - ret = -ENOENT; - } + if ( i < MAX_CPUID_INPUT ) + *cpuid = *ctl; + else if ( unused ) + *unused = *ctl; else - { - memcpy(cpuid, ctl, sizeof(cpuid_input_t)); - ret = 0; - } + ret = -ENOENT; } break;