diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-11-12 11:42:36 +0000 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-11-12 11:42:36 +0000 |
commit | f4cf0d5e8825b258de4964c615dbbfdae85d0b03 (patch) | |
tree | bd19deb3c1c57120c7ef8bb3cc1ab266f3144c06 /xen/arch/x86/platform_hypercall.c | |
parent | f8a685ad57b8d03442b1a96b91d8e27a84994533 (diff) | |
download | xen-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.c | 109 |
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; |