]> xenbits.xensource.com Git - xen.git/commitdiff
x86: small fixes to pcpu platform op handling
authorJan Beulich <jbeulich@suse.com>
Wed, 7 Mar 2012 08:53:56 +0000 (08:53 +0000)
committerJan Beulich <jbeulich@suse.com>
Wed, 7 Mar 2012 08:53:56 +0000 (08:53 +0000)
XENPF_get_cpuinfo should init the flags output field rather than only
modify it.

XENPF_cpu_online must check for the input CPU number to be in range.

XENPF_cpu_offline must also do that, and should also reject attempts
to
offline CPU 0 (this fails in cpu_down() too, but preventing this here
appears more correct given that the code here calls
continue_hypercall_on_cpu(0, ...), which would be flawed if cpu_down()
would ever allow bringing down CPU 0 (and a distinct error code is
easier to deal with when debugging issues).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Keir Fraser <keir@xen.org>
xen-unstable changeset:   24201:9c6bea25f712
xen-unstable date:        Thu Nov 24 17:56:26 2011 +0100

xen/arch/x86/platform_hypercall.c

index 9bb952d3ffc4628897bb120329aa1346e986277d..5f1ac9085ea07d8f6a89aca13b72a14740b3a40e 100644 (file)
@@ -418,13 +418,14 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
         if ( (g_info->xen_cpuid >= NR_CPUS) ||
              !cpu_present(g_info->xen_cpuid) )
         {
-            g_info->flags |= XEN_PCPU_FLAGS_INVALID;
+            g_info->flags = XEN_PCPU_FLAGS_INVALID;
         }
         else
         {
             g_info->apic_id = x86_cpu_to_apicid[g_info->xen_cpuid];
             g_info->acpi_id = acpi_get_processor_id(g_info->xen_cpuid);
             ASSERT(g_info->apic_id != BAD_APICID);
+            g_info->flags = 0;
             if (cpu_online(g_info->xen_cpuid))
                 g_info->flags |= XEN_PCPU_FLAGS_ONLINE;
         }
@@ -442,7 +443,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
         int cpu;
 
         cpu = op->u.cpu_ol.cpuid;
-        if (!cpu_present(cpu))
+        if (cpu >= NR_CPUS || !cpu_present(cpu))
         {
             ret = -EINVAL;
             break;
@@ -462,15 +463,25 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
         int cpu;
 
         cpu = op->u.cpu_ol.cpuid;
-        if (!cpu_present(cpu))
+
+        if ( cpu == 0 )
+        {
+            ret = -EOPNOTSUPP;
+            break;
+        }
+
+        if ( cpu >= NR_CPUS || !cpu_present(cpu) )
         {
             ret = -EINVAL;
             break;
-        } else if (!cpu_online(cpu))
+        }
+        
+        if (!cpu_online(cpu))
         {
             ret = 0;
             break;
         }
+
         ret = continue_hypercall_on_cpu(
           0, cpu_down_helper, (void *)(unsigned long)cpu);
         break;