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 <[email protected]>
---
  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.

Reply via email to