s390x: get rid of cpu_s390x_create()
Now that there is only one user of cpu_s390x_create() left, make cpu creation look like on x86. - Perform the model/properties split and checks in s390_init_cpus() - Parse features only once without having to remember if already parsed - Pass only the typename to s390x_new_cpu() - Use the typename of an existing CPU for hotplug via cpu-add Acked-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20170913132417.24384-21-david@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
2b44178d87
commit
524d18d8bd
@ -55,6 +55,10 @@ S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
|
||||
static void s390_init_cpus(MachineState *machine)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||
const char *typename;
|
||||
gchar **model_pieces;
|
||||
ObjectClass *oc;
|
||||
CPUClass *cc;
|
||||
int i;
|
||||
|
||||
if (machine->cpu_model == NULL) {
|
||||
@ -69,8 +73,25 @@ static void s390_init_cpus(MachineState *machine)
|
||||
/* initialize possible_cpus */
|
||||
mc->possible_cpu_arch_ids(machine);
|
||||
|
||||
model_pieces = g_strsplit(machine->cpu_model, ",", 2);
|
||||
if (!model_pieces[0]) {
|
||||
error_report("Invalid/empty CPU model name");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
oc = cpu_class_by_name(TYPE_S390_CPU, model_pieces[0]);
|
||||
if (!oc) {
|
||||
error_report("Unable to find CPU definition: %s", model_pieces[0]);
|
||||
exit(1);
|
||||
}
|
||||
typename = object_class_get_name(oc);
|
||||
cc = CPU_CLASS(oc);
|
||||
/* after parsing, properties will be applied to all *typename* instances */
|
||||
cc->parse_features(typename, model_pieces[1], &error_fatal);
|
||||
g_strfreev(model_pieces);
|
||||
|
||||
for (i = 0; i < smp_cpus; i++) {
|
||||
s390x_new_cpu(machine->cpu_model, i, &error_fatal);
|
||||
s390x_new_cpu(typename, i, &error_fatal);
|
||||
}
|
||||
}
|
||||
|
||||
@ -382,8 +403,12 @@ static HotplugHandler *s390_get_hotplug_handler(MachineState *machine,
|
||||
static void s390_hot_add_cpu(const int64_t id, Error **errp)
|
||||
{
|
||||
MachineState *machine = MACHINE(qdev_get_machine());
|
||||
ObjectClass *oc;
|
||||
|
||||
s390x_new_cpu(machine->cpu_model, id, errp);
|
||||
g_assert(machine->possible_cpus->cpus[0].cpu);
|
||||
oc = OBJECT_CLASS(CPU_GET_CLASS(machine->possible_cpus->cpus[0].cpu));
|
||||
|
||||
s390x_new_cpu(object_class_get_name(oc), id, errp);
|
||||
}
|
||||
|
||||
static void s390_nmi(NMIState *n, int cpu_index, Error **errp)
|
||||
|
@ -689,7 +689,7 @@ const char *s390_default_cpu_model_name(void);
|
||||
|
||||
/* helper.c */
|
||||
#define cpu_init(cpu_model) cpu_generic_init(TYPE_S390_CPU, cpu_model)
|
||||
S390CPU *s390x_new_cpu(const char *cpu_model, uint32_t core_id, Error **errp);
|
||||
S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id, Error **errp);
|
||||
/* you can call this signal handler from your SIGBUS and SIGSEGV
|
||||
signal handlers to inform the virtual CPU of exceptions. non zero
|
||||
is returned if the signal was handled by the virtual CPU. */
|
||||
|
@ -68,52 +68,11 @@ void s390x_cpu_timer(void *opaque)
|
||||
}
|
||||
#endif
|
||||
|
||||
S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp)
|
||||
S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id, Error **errp)
|
||||
{
|
||||
static bool features_parsed;
|
||||
char *name, *features;
|
||||
const char *typename;
|
||||
ObjectClass *oc;
|
||||
CPUClass *cc;
|
||||
|
||||
name = g_strdup(cpu_model);
|
||||
features = strchr(name, ',');
|
||||
if (features) {
|
||||
features[0] = 0;
|
||||
features++;
|
||||
}
|
||||
|
||||
oc = cpu_class_by_name(TYPE_S390_CPU, name);
|
||||
if (!oc) {
|
||||
error_setg(errp, "Unknown CPU definition \'%s\'", name);
|
||||
g_free(name);
|
||||
return NULL;
|
||||
}
|
||||
typename = object_class_get_name(oc);
|
||||
|
||||
if (!features_parsed) {
|
||||
features_parsed = true;
|
||||
cc = CPU_CLASS(oc);
|
||||
cc->parse_features(typename, features, errp);
|
||||
}
|
||||
g_free(name);
|
||||
|
||||
if (*errp) {
|
||||
return NULL;
|
||||
}
|
||||
return S390_CPU(CPU(object_new(typename)));
|
||||
}
|
||||
|
||||
S390CPU *s390x_new_cpu(const char *cpu_model, uint32_t core_id, Error **errp)
|
||||
{
|
||||
S390CPU *cpu;
|
||||
S390CPU *cpu = S390_CPU(object_new(typename));
|
||||
Error *err = NULL;
|
||||
|
||||
cpu = cpu_s390x_create(cpu_model, &err);
|
||||
if (err != NULL) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
object_property_set_int(OBJECT(cpu), core_id, "core-id", &err);
|
||||
if (err != NULL) {
|
||||
goto out;
|
||||
|
@ -337,7 +337,6 @@ uint64_t get_psw_mask(CPUS390XState *env);
|
||||
void s390_cpu_recompute_watchpoints(CPUState *cs);
|
||||
void s390x_tod_timer(void *opaque);
|
||||
void s390x_cpu_timer(void *opaque);
|
||||
S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp);
|
||||
void do_restart_interrupt(CPUS390XState *env);
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
LowCore *cpu_map_lowcore(CPUS390XState *env);
|
||||
|
Loading…
Reference in New Issue
Block a user