Message ID | 20230524143714.565792-1-chigot@adacore.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | hw/arm/xlnx-zynqmp: fix unsigned error when checking the RPUs number | expand |
On [2023 May 24] Wed 16:37:14, Clément Chigot wrote: > When passing --smp with a number lower than XLNX_ZYNQMP_NUM_APU_CPUS, > the expression (ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS) will result > in a positive number as ms->smp.cpus is a unsigned int. > This will raise the following error afterwards, as Qemu will try to > instantiate some additional RPUs. > | $ qemu-system-aarch64 --smp 1 -M xlnx-zcu102 > | ** > | ERROR:../src/tcg/tcg.c:777:tcg_register_thread: > | assertion failed: (n < tcg_max_ctxs) > > Signed-off-by: Clément Chigot <chigot@adacore.com> Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com> Tested-by: Francisco Iglesias <frasse.iglesias@gmail.com> > --- > hw/arm/xlnx-zynqmp.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c > index 335cfc417d..5905a33015 100644 > --- a/hw/arm/xlnx-zynqmp.c > +++ b/hw/arm/xlnx-zynqmp.c > @@ -213,7 +213,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s, > const char *boot_cpu, Error **errp) > { > int i; > - int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS, > + int num_rpus = MIN((int)(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS), > XLNX_ZYNQMP_NUM_RPU_CPUS); > > if (num_rpus <= 0) { > -- > 2.25.1 > >
Hi Clément, On 24/5/23 16:37, Clément Chigot wrote: > When passing --smp with a number lower than XLNX_ZYNQMP_NUM_APU_CPUS, > the expression (ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS) will result > in a positive number as ms->smp.cpus is a unsigned int. > This will raise the following error afterwards, as Qemu will try to > instantiate some additional RPUs. > | $ qemu-system-aarch64 --smp 1 -M xlnx-zcu102 > | ** > | ERROR:../src/tcg/tcg.c:777:tcg_register_thread: > | assertion failed: (n < tcg_max_ctxs) > > Signed-off-by: Clément Chigot <chigot@adacore.com> > --- > hw/arm/xlnx-zynqmp.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c > index 335cfc417d..5905a33015 100644 > --- a/hw/arm/xlnx-zynqmp.c > +++ b/hw/arm/xlnx-zynqmp.c > @@ -213,7 +213,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s, > const char *boot_cpu, Error **errp) > { > int i; > - int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS, > + int num_rpus = MIN((int)(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS), > XLNX_ZYNQMP_NUM_RPU_CPUS); > > if (num_rpus <= 0) { Can we set mc->min_cpus in xlnx_zcu102_machine_class_init() instead? -- >8 -- diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c index 4c84bb932a..60a2710e21 100644 --- a/hw/arm/xlnx-zcu102.c +++ b/hw/arm/xlnx-zcu102.c @@ -269,6 +269,7 @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data) mc->block_default_type = IF_IDE; mc->units_per_default_bus = 1; mc->ignore_memory_transaction_failures = true; + mc->min_cpus = XLNX_ZYNQMP_NUM_APU_CPUS; mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS; mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS; mc->default_ram_id = "ddr-ram"; --- $ qemu-system-aarch64 -M xlnx-zcu102 -smp 1 qemu-system-aarch64: Invalid SMP CPUs 1. The min CPUs supported by machine 'xlnx-zcu102' is 4 Regards, Phil.
On Wed, May 24, 2023 at 5:06 PM Philippe Mathieu-Daudé <philmd@linaro.org> wrote: > > Hi Clément, > > On 24/5/23 16:37, Clément Chigot wrote: > > When passing --smp with a number lower than XLNX_ZYNQMP_NUM_APU_CPUS, > > the expression (ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS) will result > > in a positive number as ms->smp.cpus is a unsigned int. > > This will raise the following error afterwards, as Qemu will try to > > instantiate some additional RPUs. > > | $ qemu-system-aarch64 --smp 1 -M xlnx-zcu102 > > | ** > > | ERROR:../src/tcg/tcg.c:777:tcg_register_thread: > > | assertion failed: (n < tcg_max_ctxs) > > > > Signed-off-by: Clément Chigot <chigot@adacore.com> > > --- > > hw/arm/xlnx-zynqmp.c | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c > > index 335cfc417d..5905a33015 100644 > > --- a/hw/arm/xlnx-zynqmp.c > > +++ b/hw/arm/xlnx-zynqmp.c > > @@ -213,7 +213,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s, > > const char *boot_cpu, Error **errp) > > { > > int i; > > - int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS, > > + int num_rpus = MIN((int)(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS), > > XLNX_ZYNQMP_NUM_RPU_CPUS); > > > > if (num_rpus <= 0) { > > Can we set mc->min_cpus in xlnx_zcu102_machine_class_init() instead? > > -- >8 -- > diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c > index 4c84bb932a..60a2710e21 100644 > --- a/hw/arm/xlnx-zcu102.c > +++ b/hw/arm/xlnx-zcu102.c > @@ -269,6 +269,7 @@ static void > xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data) > mc->block_default_type = IF_IDE; > mc->units_per_default_bus = 1; > mc->ignore_memory_transaction_failures = true; > + mc->min_cpus = XLNX_ZYNQMP_NUM_APU_CPUS; > mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS; > mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS; > mc->default_ram_id = "ddr-ram"; > --- > > $ qemu-system-aarch64 -M xlnx-zcu102 -smp 1 > qemu-system-aarch64: Invalid SMP CPUs 1. The min CPUs supported by > machine 'xlnx-zcu102' is 4 We encountered this issue when we were trying to emulate a zynqmp with only two cortex-a53 cores. I don't have the full context but this was probably to debug a race condition or something like that. Thus, I would like to keep the possibility of lowering the CPU number, even if it doesn't match the real board. Clément
On Wed, 24 May 2023 at 15:37, Clément Chigot <chigot@adacore.com> wrote: > > When passing --smp with a number lower than XLNX_ZYNQMP_NUM_APU_CPUS, > the expression (ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS) will result > in a positive number as ms->smp.cpus is a unsigned int. > This will raise the following error afterwards, as Qemu will try to > instantiate some additional RPUs. > | $ qemu-system-aarch64 --smp 1 -M xlnx-zcu102 > | ** > | ERROR:../src/tcg/tcg.c:777:tcg_register_thread: > | assertion failed: (n < tcg_max_ctxs) > > Signed-off-by: Clément Chigot <chigot@adacore.com> > --- > hw/arm/xlnx-zynqmp.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c > index 335cfc417d..5905a33015 100644 > --- a/hw/arm/xlnx-zynqmp.c > +++ b/hw/arm/xlnx-zynqmp.c > @@ -213,7 +213,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s, > const char *boot_cpu, Error **errp) > { > int i; > - int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS, > + int num_rpus = MIN((int)(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS), > XLNX_ZYNQMP_NUM_RPU_CPUS); Applied to target-arm.next, thanks. -- PMM
diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c index 335cfc417d..5905a33015 100644 --- a/hw/arm/xlnx-zynqmp.c +++ b/hw/arm/xlnx-zynqmp.c @@ -213,7 +213,7 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s, const char *boot_cpu, Error **errp) { int i; - int num_rpus = MIN(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS, + int num_rpus = MIN((int)(ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS), XLNX_ZYNQMP_NUM_RPU_CPUS); if (num_rpus <= 0) {
When passing --smp with a number lower than XLNX_ZYNQMP_NUM_APU_CPUS, the expression (ms->smp.cpus - XLNX_ZYNQMP_NUM_APU_CPUS) will result in a positive number as ms->smp.cpus is a unsigned int. This will raise the following error afterwards, as Qemu will try to instantiate some additional RPUs. | $ qemu-system-aarch64 --smp 1 -M xlnx-zcu102 | ** | ERROR:../src/tcg/tcg.c:777:tcg_register_thread: | assertion failed: (n < tcg_max_ctxs) Signed-off-by: Clément Chigot <chigot@adacore.com> --- hw/arm/xlnx-zynqmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)