};
 EXPORT_SYMBOL(cpu_sysdev_class);
 
+static struct sys_device *cpu_sys_devices[NR_CPUS];
+
 #ifdef CONFIG_HOTPLUG_CPU
 int __attribute__((weak)) smp_prepare_cpu (int cpu)
 {
 }
 void unregister_cpu(struct cpu *cpu, struct node *root)
 {
+       int logical_cpu = cpu->sysdev.id;
 
        if (root)
                sysfs_remove_link(&root->sysdev.kobj,
        sysdev_remove_file(&cpu->sysdev, &attr_online);
 
        sysdev_unregister(&cpu->sysdev);
-
+       cpu_sys_devices[logical_cpu] = NULL;
        return;
 }
 #else /* ... !CONFIG_HOTPLUG_CPU */
                                          kobject_name(&cpu->sysdev.kobj));
        if (!error && !cpu->no_control)
                register_cpu_control(cpu);
+       if (!error)
+               cpu_sys_devices[num] = &cpu->sysdev;
        return error;
 }
 
-
+struct sys_device *get_cpu_sysdev(int cpu)
+{
+       if (cpu < NR_CPUS)
+               return cpu_sys_devices[cpu];
+       else
+               return NULL;
+}
+EXPORT_SYMBOL_GPL(get_cpu_sysdev);
 
 int __init cpu_dev_init(void)
 {
 
 };
 
 extern int register_cpu(struct cpu *, int, struct node *);
+extern struct sys_device *get_cpu_sysdev(int cpu);
 #ifdef CONFIG_HOTPLUG_CPU
 extern void unregister_cpu(struct cpu *, struct node *);
 #endif