65 lines
2.1 KiB
Diff
65 lines
2.1 KiB
Diff
|
# HG changeset patch
|
||
|
# User Jan Beulich <jbeulich@suse.com>
|
||
|
# Date 1322153786 -3600
|
||
|
# Node ID 9c6bea25f71233787a36893deaf0e811f2dcb8d8
|
||
|
# Parent 480531cab3f4468b1ec9b549bc84d66e420ce685
|
||
|
x86: small fixes to pcpu platform op handling
|
||
|
|
||
|
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>
|
||
|
|
||
|
--- a/xen/arch/x86/platform_hypercall.c
|
||
|
+++ b/xen/arch/x86/platform_hypercall.c
|
||
|
@@ -449,13 +449,14 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe
|
||
|
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;
|
||
|
}
|
||
|
@@ -472,7 +473,7 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe
|
||
|
{
|
||
|
int cpu = op->u.cpu_ol.cpuid;
|
||
|
|
||
|
- if ( !cpu_present(cpu) )
|
||
|
+ if ( cpu >= NR_CPUS || !cpu_present(cpu) )
|
||
|
{
|
||
|
ret = -EINVAL;
|
||
|
break;
|
||
|
@@ -493,7 +494,13 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xe
|
||
|
{
|
||
|
int 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;
|