xref: /openbmc/qemu/hw/cpu/core.c (revision 8e6fe6b8)
1 /*
2  * CPU core abstract device
3  *
4  * Copyright (C) 2016 Bharata B Rao <bharata@linux.vnet.ibm.com>
5  *
6  * This work is licensed under the terms of the GNU GPL, version 2 or later.
7  * See the COPYING file in the top-level directory.
8  */
9 
10 #include "qemu/osdep.h"
11 #include "hw/cpu/core.h"
12 #include "qapi/visitor.h"
13 #include "qemu/module.h"
14 #include "qapi/error.h"
15 #include "sysemu/cpus.h"
16 
17 static void core_prop_get_core_id(Object *obj, Visitor *v, const char *name,
18                                   void *opaque, Error **errp)
19 {
20     CPUCore *core = CPU_CORE(obj);
21     int64_t value = core->core_id;
22 
23     visit_type_int(v, name, &value, errp);
24 }
25 
26 static void core_prop_set_core_id(Object *obj, Visitor *v, const char *name,
27                                   void *opaque, Error **errp)
28 {
29     CPUCore *core = CPU_CORE(obj);
30     Error *local_err = NULL;
31     int64_t value;
32 
33     visit_type_int(v, name, &value, &local_err);
34     if (local_err) {
35         error_propagate(errp, local_err);
36         return;
37     }
38 
39     if (value < 0) {
40         error_setg(errp, "Invalid core id %"PRId64, value);
41         return;
42     }
43 
44     core->core_id = value;
45 }
46 
47 static void core_prop_get_nr_threads(Object *obj, Visitor *v, const char *name,
48                                      void *opaque, Error **errp)
49 {
50     CPUCore *core = CPU_CORE(obj);
51     int64_t value = core->nr_threads;
52 
53     visit_type_int(v, name, &value, errp);
54 }
55 
56 static void core_prop_set_nr_threads(Object *obj, Visitor *v, const char *name,
57                                      void *opaque, Error **errp)
58 {
59     CPUCore *core = CPU_CORE(obj);
60     Error *local_err = NULL;
61     int64_t value;
62 
63     visit_type_int(v, name, &value, &local_err);
64     if (local_err) {
65         error_propagate(errp, local_err);
66         return;
67     }
68 
69     core->nr_threads = value;
70 }
71 
72 static void cpu_core_instance_init(Object *obj)
73 {
74     CPUCore *core = CPU_CORE(obj);
75 
76     object_property_add(obj, "core-id", "int", core_prop_get_core_id,
77                         core_prop_set_core_id, NULL, NULL, NULL);
78     object_property_add(obj, "nr-threads", "int", core_prop_get_nr_threads,
79                         core_prop_set_nr_threads, NULL, NULL, NULL);
80     core->nr_threads = smp_threads;
81 }
82 
83 static void cpu_core_class_init(ObjectClass *oc, void *data)
84 {
85     DeviceClass *dc = DEVICE_CLASS(oc);
86 
87     set_bit(DEVICE_CATEGORY_CPU, dc->categories);
88 }
89 
90 static const TypeInfo cpu_core_type_info = {
91     .name = TYPE_CPU_CORE,
92     .parent = TYPE_DEVICE,
93     .abstract = true,
94     .class_init = cpu_core_class_init,
95     .instance_size = sizeof(CPUCore),
96     .instance_init = cpu_core_instance_init,
97 };
98 
99 static void cpu_core_register_types(void)
100 {
101     type_register_static(&cpu_core_type_info);
102 }
103 
104 type_init(cpu_core_register_types)
105