aboutsummaryrefslogtreecommitdiffstats
path: root/xen/arch/x86/platform_hypercall.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-11-12 11:42:36 +0000
committerKeir Fraser <keir.fraser@citrix.com>2009-11-12 11:42:36 +0000
commitf4cf0d5e8825b258de4964c615dbbfdae85d0b03 (patch)
treebd19deb3c1c57120c7ef8bb3cc1ab266f3144c06 /xen/arch/x86/platform_hypercall.c
parentf8a685ad57b8d03442b1a96b91d8e27a84994533 (diff)
downloadxen-f4cf0d5e8825b258de4964c615dbbfdae85d0b03.tar.gz
xen-f4cf0d5e8825b258de4964c615dbbfdae85d0b03.tar.bz2
xen-f4cf0d5e8825b258de4964c615dbbfdae85d0b03.zip
Update pcpu_info hypercall interface
This patch change the XENPF_get_cpuinfo interface to pass only one pcpu information each hypercall. Also, it replace xenpf_resource_hotplug with XENPF_cpu_online/offline. Signed-off-by: Jiang, Yunhong <yunhong.jiang@intel.com>
Diffstat (limited to 'xen/arch/x86/platform_hypercall.c')
-rw-r--r--xen/arch/x86/platform_hypercall.c109
1 files changed, 45 insertions, 64 deletions
diff --git a/xen/arch/x86/platform_hypercall.c b/xen/arch/x86/platform_hypercall.c
index 5e4adb0b37..9bde0d057f 100644
--- a/xen/arch/x86/platform_hypercall.c
+++ b/xen/arch/x86/platform_hypercall.c
@@ -394,91 +394,72 @@ ret_t do_platform_op(XEN_GUEST_HANDLE(xen_platform_op_t) u_xenpf_op)
case XENPF_get_cpuinfo:
{
- int i;
- struct xenpf_pcpu_info *g_info;
- struct xen_physical_cpuinfo pcpu;
- XEN_GUEST_HANDLE(xen_physical_cpuinfo_t) g_cpus;
+ struct xenpf_pcpuinfo *g_info;
g_info = &op->u.pcpu_info;
- if (g_info->info_num <= 0 )
- {
- op->u.pcpu_info.max_present = last_cpu(cpu_present_map);
- op->u.pcpu_info.max_possible = last_cpu(cpu_possible_map);
- goto done;
- }
-
- guest_from_compat_handle(g_cpus, g_info->info);
spin_lock(&cpu_add_remove_lock);
- ret = -EFAULT;
- for (i = 0; i < g_info->info_num; i++)
+ if ( (g_info->xen_cpuid >= NR_CPUS) ||
+ (g_info->xen_cpuid < 0) ||
+ !cpu_present(g_info->xen_cpuid) )
{
- if (copy_from_guest_offset(&pcpu, g_cpus, i, 1) )
- goto out;
+ 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);
+ if (cpu_online(g_info->xen_cpuid))
+ g_info->flags |= XEN_PCPU_FLAGS_ONLINE;
+ }
- if ( (pcpu.xen_cpuid >= NR_CPUS) ||
- (pcpu.xen_cpuid < 0) ||
- !cpu_present(pcpu.xen_cpuid) )
- {
- pcpu.flags |= XEN_PCPU_FLAGS_INVALID;
- }
- else
- {
- pcpu.apic_id = x86_cpu_to_apicid[pcpu.xen_cpuid];
- pcpu.acpi_id = acpi_get_processor_id(pcpu.xen_cpuid);
- ASSERT(pcpu.apic_id != BAD_APICID);
- if (cpu_online(pcpu.xen_cpuid))
- pcpu.flags |= XEN_PCPU_FLAGS_ONLINE;
- }
+ g_info->max_present = last_cpu(cpu_present_map);
- if ( copy_to_guest_offset(g_cpus, i, &pcpu, 1) )
- goto out;
- }
- op->u.pcpu_info.max_present = last_cpu(cpu_present_map);
- op->u.pcpu_info.max_possible = last_cpu(cpu_possible_map);
spin_unlock(&cpu_add_remove_lock);
-done:
+
ret = copy_to_guest(u_xenpf_op, op, 1) ? -EFAULT : 0;
}
break;
- case XENPF_resource_hotplug:
+ case XENPF_cpu_online:
{
int cpu;
- switch ( op->u.resource.sub_cmd)
+ cpu = op->u.cpu_ol.cpuid;
+ if (!cpu_present(cpu))
{
- case XEN_CPU_online:
- cpu = op->u.resource.u.cpu_ol.cpuid;
- if (!cpu_present(cpu))
- {
- ret = -EINVAL;
- break;
- }
- else if (cpu_online(cpu))
- {
- ret = 0;
- break;
- }
+ ret = -EINVAL;
+ break;
+ }
+ else if (cpu_online(cpu))
+ {
+ ret = 0;
+ break;
+ }
+
+ ret = cpu_up(cpu);
+ break;
+ }
+
+ case XENPF_cpu_offline:
+ {
+ int cpu;
- ret = cpu_up(cpu);
+ cpu = op->u.cpu_ol.cpuid;
+ if (!cpu_present(cpu))
+ {
+ ret = -EINVAL;
break;
- case XEN_CPU_offline:
- cpu = op->u.resource.u.cpu_ol.cpuid;
- if (!cpu_present(cpu))
- {
- ret = -EINVAL;
- break;
- } else if (!cpu_online(cpu))
- {
- ret = 0;
- break;
- }
- ret = continue_hypercall_on_cpu(
- 0, cpu_down_helper, (void *)(unsigned long)cpu);
+ } else if (!cpu_online(cpu))
+ {
+ ret = 0;
break;
}
+ ret = continue_hypercall_on_cpu(
+ 0, cpu_down_helper, (void *)(unsigned long)cpu);
+ break;
}
break;