Message ID | bc032f02f44192bfa057cc4f09311fd18d07ef1f.1632726758.git.alistair.francis@wdc.com |
---|---|
State | New |
Headers | show |
Series | [v1,1/1] hw/riscv: shakti_c: Mark as not user creatable | expand |
On Mon, Sep 27, 2021 at 3:13 PM Alistair Francis <alistair.francis@opensource.wdc.com> wrote: > > From: Alistair Francis <alistair.francis@wdc.com> > > Mark the shakti_c machine as not user creatable as it uses serial_hd. > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/639 > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > --- > hw/riscv/shakti_c.c | 2 ++ > 1 file changed, 2 insertions(+) > Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Hi Alistair, On 9/27/21 09:13, Alistair Francis wrote: > From: Alistair Francis <alistair.francis@wdc.com> > > Mark the shakti_c machine as not user creatable as it uses serial_hd. > > Resolves: https://gitlab.com/qemu-project/qemu/-/issues/639 > Signed-off-by: Alistair Francis <alistair.francis@wdc.com> > --- > hw/riscv/shakti_c.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c > index 2f084d3c8d..603992d442 100644 > --- a/hw/riscv/shakti_c.c > +++ b/hw/riscv/shakti_c.c > @@ -150,6 +150,8 @@ static void shakti_c_soc_class_init(ObjectClass *klass, void *data) > { > DeviceClass *dc = DEVICE_CLASS(klass); > dc->realize = shakti_c_soc_state_realize; > + /* Reason: Uses serial_hds in realize function, thus can't be used twice */ > + dc->user_creatable = false; I agree with the logical change, but not totally with the comment. Well, the comment itself is not incorrect. But the error happens before: ERROR:tcg/tcg.c:479:tcg_register_thread: assertion failed: (n < tcg_max_ctxs) The reason is TYPE_RISCV_HART_ARRAY creates CPUs in riscv_hart_realize(), and this machine use the default CPU limit of one CPU: static void shakti_c_machine_class_init(ObjectClass *klass, void *data) { MachineClass *mc = MACHINE_CLASS(klass); mc->desc = "RISC-V Board compatible with Shakti SDK"; mc->init = shakti_c_machine_state_init; mc->default_cpu_type = TYPE_RISCV_CPU_SHAKTI_C; } The default values come from: static void machine_class_base_init(ObjectClass *oc, void *data) { MachineClass *mc = MACHINE_CLASS(oc); mc->max_cpus = mc->max_cpus ?: 1; mc->min_cpus = mc->min_cpus ?: 1; mc->default_cpus = mc->default_cpus ?: 1; So the crash happens when we try to create the 2nd CPU. > } > > static void shakti_c_soc_instance_init(Object *obj) >
diff --git a/hw/riscv/shakti_c.c b/hw/riscv/shakti_c.c index 2f084d3c8d..603992d442 100644 --- a/hw/riscv/shakti_c.c +++ b/hw/riscv/shakti_c.c @@ -150,6 +150,8 @@ static void shakti_c_soc_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->realize = shakti_c_soc_state_realize; + /* Reason: Uses serial_hds in realize function, thus can't be used twice */ + dc->user_creatable = false; } static void shakti_c_soc_instance_init(Object *obj)