* [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property @ 2017-12-20 0:27 Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 1/5] netduino2: Specify the valid CPUs Alistair Francis ` (5 more replies) 0 siblings, 6 replies; 20+ messages in thread From: Alistair Francis @ 2017-12-20 0:27 UTC (permalink / raw) To: qemu-devel Cc: alistair.francis, alistair23, ehabkost, marcel, imammedo, f4bug There are numorous QEMU machines that only have a single or a handful of valid CPU options. To simplyfy the management of specificying which CPU is/isn't valid let's create a property that can be set in the machine init. We can then check to see if the user supplied CPU is in that list or not. I have added the valid_cpu_types for some ARM machines only at the moment. Here is what specifying the CPUs looks like now: $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S QEMU 2.10.50 monitor - type 'help' for more information (qemu) info cpus * CPU #0: thread_id=24175 (qemu) q $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S QEMU 2.10.50 monitor - type 'help' for more information (qemu) q $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S qemu-system-aarch64: unable to find CPU model 'cortex-m5' $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu V4: - Rebase - Remove spaces V3: - Make the varialbes static V2: - Rebase - Reorder patches - Add a Raspberry Pi 2 CPU fix V1: - Small fixes to prepare a series instead of RFC - Add commit messages for the commits - Expand the machine support to ARM machines RFC v2: - Rebase on Igor's work - Use more QEMUisms inside the code - List the supported machines in a NULL terminated array Alistair Francis (5): netduino2: Specify the valid CPUs bcm2836: Use the Cortex-A7 instead of Cortex-A15 raspi: Specify the valid CPUs xlnx-zcu102: Specify the valid CPUs xilinx_zynq: Specify the valid CPUs hw/arm/bcm2836.c | 2 +- hw/arm/netduino2.c | 10 +++++++++- hw/arm/raspi.c | 7 +++++++ hw/arm/xilinx_zynq.c | 6 ++++++ hw/arm/xlnx-zcu102.c | 17 +++++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) -- 2.14.1 ^ permalink raw reply [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 1/5] netduino2: Specify the valid CPUs 2017-12-20 0:27 [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Alistair Francis @ 2017-12-20 0:27 ` Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 2/5] bcm2836: Use the Cortex-A7 instead of Cortex-A15 Alistair Francis ` (4 subsequent siblings) 5 siblings, 0 replies; 20+ messages in thread From: Alistair Francis @ 2017-12-20 0:27 UTC (permalink / raw) To: qemu-devel Cc: alistair.francis, alistair23, ehabkost, marcel, imammedo, f4bug List all possible valid CPU options. Although the board only ever has a Cortex-M3 we mark the Cortex-M4 as supported because the Netduino2 Plus supports the Cortex-M4 and the Netduino2 Plus is similar to the Netduino2. Signed-off-by: Alistair Francis <alistair.francis@xilinx.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> --- V3: - Add static property V2: - Fixup allignment RFC v2: - Use a NULL terminated list - Add the Cortex-M4 for testing hw/arm/netduino2.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c index f936017d4a..111a1d0aba 100644 --- a/hw/arm/netduino2.c +++ b/hw/arm/netduino2.c @@ -34,18 +34,26 @@ static void netduino2_init(MachineState *machine) DeviceState *dev; dev = qdev_create(NULL, TYPE_STM32F205_SOC); - qdev_prop_set_string(dev, "cpu-type", ARM_CPU_TYPE_NAME("cortex-m3")); + qdev_prop_set_string(dev, "cpu-type", machine->cpu_type); object_property_set_bool(OBJECT(dev), true, "realized", &error_fatal); armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, FLASH_SIZE); } +static const char *netduino_valid_cpus[] = { + ARM_CPU_TYPE_NAME("cortex-m3"), + ARM_CPU_TYPE_NAME("cortex-m4"), + NULL + }; + static void netduino2_machine_init(MachineClass *mc) { mc->desc = "Netduino 2 Machine"; mc->init = netduino2_init; mc->ignore_memory_transaction_failures = true; + mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m3"); + mc->valid_cpu_types = netduino_valid_cpus; } DEFINE_MACHINE("netduino2", netduino2_machine_init) -- 2.14.1 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 2/5] bcm2836: Use the Cortex-A7 instead of Cortex-A15 2017-12-20 0:27 [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 1/5] netduino2: Specify the valid CPUs Alistair Francis @ 2017-12-20 0:27 ` Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 3/5] raspi: Specify the valid CPUs Alistair Francis ` (3 subsequent siblings) 5 siblings, 0 replies; 20+ messages in thread From: Alistair Francis @ 2017-12-20 0:27 UTC (permalink / raw) To: qemu-devel Cc: alistair.francis, alistair23, ehabkost, marcel, imammedo, f4bug The BCM2836 uses a Cortex-A7 not a Cortex-A15. Update the device to use the correct CPU. https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2836/QA7_rev3.4.pdf Signed-off-by: Alistair Francis <alistair.francis@xilinx.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Igor Mammedov <imammedo@redhat.com> --- V3: - Use ARM_CPU_TYPE_NAME() macro V2: - Fix the BCM2836 CPU hw/arm/bcm2836.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/arm/bcm2836.c b/hw/arm/bcm2836.c index 8c43291112..c477772484 100644 --- a/hw/arm/bcm2836.c +++ b/hw/arm/bcm2836.c @@ -30,7 +30,7 @@ static void bcm2836_init(Object *obj) for (n = 0; n < BCM2836_NCPUS; n++) { object_initialize(&s->cpus[n], sizeof(s->cpus[n]), - "cortex-a15-" TYPE_ARM_CPU); + ARM_CPU_TYPE_NAME("cortex-a7")); object_property_add_child(obj, "cpu[*]", OBJECT(&s->cpus[n]), &error_abort); } -- 2.14.1 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 3/5] raspi: Specify the valid CPUs 2017-12-20 0:27 [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 1/5] netduino2: Specify the valid CPUs Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 2/5] bcm2836: Use the Cortex-A7 instead of Cortex-A15 Alistair Francis @ 2017-12-20 0:27 ` Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 4/5] xlnx-zcu102: " Alistair Francis ` (2 subsequent siblings) 5 siblings, 0 replies; 20+ messages in thread From: Alistair Francis @ 2017-12-20 0:27 UTC (permalink / raw) To: qemu-devel Cc: alistair.francis, alistair23, ehabkost, marcel, imammedo, f4bug List all possible valid CPU options. Signed-off-by: Alistair Francis <alistair.francis@xilinx.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> --- V4: - Remove spaces V3: - Add static property V2: - Fix the indentation hw/arm/raspi.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hw/arm/raspi.c b/hw/arm/raspi.c index cd5fa8c3dc..bd175e8c16 100644 --- a/hw/arm/raspi.c +++ b/hw/arm/raspi.c @@ -158,6 +158,11 @@ static void raspi2_init(MachineState *machine) setup_boot(machine, 2, machine->ram_size - vcram_size); } +static const char *raspi2_valid_cpus[] = { + ARM_CPU_TYPE_NAME("cortex-a7"), + NULL +}; + static void raspi2_machine_init(MachineClass *mc) { mc->desc = "Raspberry Pi 2"; @@ -171,5 +176,7 @@ static void raspi2_machine_init(MachineClass *mc) mc->default_cpus = BCM2836_NCPUS; mc->default_ram_size = 1024 * 1024 * 1024; mc->ignore_memory_transaction_failures = true; + mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a7"); + mc->valid_cpu_types = raspi2_valid_cpus; }; DEFINE_MACHINE("raspi2", raspi2_machine_init) -- 2.14.1 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 4/5] xlnx-zcu102: Specify the valid CPUs 2017-12-20 0:27 [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Alistair Francis ` (2 preceding siblings ...) 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 3/5] raspi: Specify the valid CPUs Alistair Francis @ 2017-12-20 0:27 ` Alistair Francis 2017-12-20 0:28 ` [Qemu-devel] [PATCH v4 5/5] xilinx_zynq: " Alistair Francis 2017-12-20 0:43 ` [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Peter Maydell 5 siblings, 0 replies; 20+ messages in thread From: Alistair Francis @ 2017-12-20 0:27 UTC (permalink / raw) To: qemu-devel Cc: alistair.francis, alistair23, ehabkost, marcel, imammedo, f4bug List all possible valid CPU options. Signed-off-by: Alistair Francis <alistair.francis@xilinx.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> --- An implementation for single CPU machines is still being discussed. A solution proposed by Eduardo is this: 1) Change the default on TYPE_MACHINE to: mc->valid_cpu_types = { TYPE_CPU, NULL }; This will keep the existing behavior for all boards. 2) mc->valid_cpu_types=NULL be interpreted as "no CPU model except the default is accepted" or "-cpu is not accepted" in machine_run_board_init() (I prefer the former, but both options would be correct) 3) Boards like xlnx_zynqmp could then just do this: static void xxx_class_init(...) { mc->default_cpu_type = MY_CPU_TYPE; /* Reason: XXX_init() is hardcoded to MY_CPU_TYPE */ mc->valid_cpu_types = NULL; } V4: - Remove spaces V3: - Make variable static V2: - Don't use the users -cpu - Fixup allignment hw/arm/xlnx-zcu102.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/hw/arm/xlnx-zcu102.c b/hw/arm/xlnx-zcu102.c index b126cf148b..08b5c28a3a 100644 --- a/hw/arm/xlnx-zcu102.c +++ b/hw/arm/xlnx-zcu102.c @@ -184,6 +184,11 @@ static void xlnx_zynqmp_init(XlnxZCU102 *s, MachineState *machine) arm_load_kernel(s->soc.boot_cpu_ptr, &xlnx_zcu102_binfo); } +static const char *xlnx_zynqmp_valid_cpus[] = { + ARM_CPU_TYPE_NAME("cortex-a53"), + NULL +}; + static void xlnx_ep108_init(MachineState *machine) { XlnxZCU102 *s = EP108_MACHINE(machine); @@ -216,6 +221,12 @@ static void xlnx_ep108_machine_class_init(ObjectClass *oc, void *data) mc->ignore_memory_transaction_failures = true; mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS; mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS; + mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"); + /* The ZynqMP SoC is always a Cortex-A53. We add this here to give + * users a sane error if they specify a different CPU, but we never + * use their CPU choice. + */ + mc->valid_cpu_types = xlnx_zynqmp_valid_cpus; } static const TypeInfo xlnx_ep108_machine_init_typeinfo = { @@ -274,6 +285,12 @@ static void xlnx_zcu102_machine_class_init(ObjectClass *oc, void *data) mc->ignore_memory_transaction_failures = true; mc->max_cpus = XLNX_ZYNQMP_NUM_APU_CPUS + XLNX_ZYNQMP_NUM_RPU_CPUS; mc->default_cpus = XLNX_ZYNQMP_NUM_APU_CPUS; + mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a53"); + /* The ZynqMP SoC is always a Cortex-A53. We add this here to give + * users a sane error if they specify a different CPU, but we never + * use their CPU choice. + */ + mc->valid_cpu_types = xlnx_zynqmp_valid_cpus; } static const TypeInfo xlnx_zcu102_machine_init_typeinfo = { -- 2.14.1 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* [Qemu-devel] [PATCH v4 5/5] xilinx_zynq: Specify the valid CPUs 2017-12-20 0:27 [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Alistair Francis ` (3 preceding siblings ...) 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 4/5] xlnx-zcu102: " Alistair Francis @ 2017-12-20 0:28 ` Alistair Francis 2017-12-20 0:43 ` [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Peter Maydell 5 siblings, 0 replies; 20+ messages in thread From: Alistair Francis @ 2017-12-20 0:28 UTC (permalink / raw) To: qemu-devel Cc: alistair.francis, alistair23, ehabkost, marcel, imammedo, f4bug List all possible valid CPU options. Signed-off-by: Alistair Francis <alistair.francis@xilinx.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> --- V4: - Remove spaces V3: - Make variable static V2: - Fixup alignment hw/arm/xilinx_zynq.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/hw/arm/xilinx_zynq.c b/hw/arm/xilinx_zynq.c index 1836a4ed45..4005230847 100644 --- a/hw/arm/xilinx_zynq.c +++ b/hw/arm/xilinx_zynq.c @@ -313,6 +313,11 @@ static void zynq_init(MachineState *machine) arm_load_kernel(ARM_CPU(first_cpu), &zynq_binfo); } +static const char *xlnx_zynq_7000_valid_cpus[] = { + ARM_CPU_TYPE_NAME("cortex-a9"), + NULL +}; + static void zynq_machine_init(MachineClass *mc) { mc->desc = "Xilinx Zynq Platform Baseboard for Cortex-A9"; @@ -321,6 +326,7 @@ static void zynq_machine_init(MachineClass *mc) mc->no_sdcard = 1; mc->ignore_memory_transaction_failures = true; mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-a9"); + mc->valid_cpu_types = xlnx_zynq_7000_valid_cpus; } DEFINE_MACHINE("xilinx-zynq-a9", zynq_machine_init) -- 2.14.1 ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-20 0:27 [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Alistair Francis ` (4 preceding siblings ...) 2017-12-20 0:28 ` [Qemu-devel] [PATCH v4 5/5] xilinx_zynq: " Alistair Francis @ 2017-12-20 0:43 ` Peter Maydell 2017-12-20 0:55 ` Alistair Francis 5 siblings, 1 reply; 20+ messages in thread From: Peter Maydell @ 2017-12-20 0:43 UTC (permalink / raw) To: Alistair Francis Cc: QEMU Developers, Eduardo Habkost, Philippe Mathieu-Daudé, Igor Mammedov, Marcel Apfelbaum, Alistair Francis On 20 December 2017 at 00:27, Alistair Francis <alistair.francis@xilinx.com> wrote: > There are numorous QEMU machines that only have a single or a handful of > valid CPU options. To simplyfy the management of specificying which CPU > is/isn't valid let's create a property that can be set in the machine > init. We can then check to see if the user supplied CPU is in that list > or not. > > I have added the valid_cpu_types for some ARM machines only at the > moment. > > Here is what specifying the CPUs looks like now: > > $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S > QEMU 2.10.50 monitor - type 'help' for more information > (qemu) info cpus > * CPU #0: thread_id=24175 > (qemu) q > > $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S > QEMU 2.10.50 monitor - type 'help' for more information > (qemu) q > > $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S > qemu-system-aarch64: unable to find CPU model 'cortex-m5' > > $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S > qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu > The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu Thanks for this; we really should be more strict about forbidding "won't work" combinations than we have been in the past. In the last of these cases, I think that when we list the invalid CPU type and the valid types we should use the same names we want the user to use on the command line, without the "-arm-cpu" suffixes. thanks -- PMM ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-20 0:43 ` [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Peter Maydell @ 2017-12-20 0:55 ` Alistair Francis 2017-12-20 1:03 ` Alistair Francis 0 siblings, 1 reply; 20+ messages in thread From: Alistair Francis @ 2017-12-20 0:55 UTC (permalink / raw) To: Peter Maydell Cc: Alistair Francis, QEMU Developers, Eduardo Habkost, Philippe Mathieu-Daudé, Igor Mammedov, Marcel Apfelbaum On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > On 20 December 2017 at 00:27, Alistair Francis > <alistair.francis@xilinx.com> wrote: >> There are numorous QEMU machines that only have a single or a handful of >> valid CPU options. To simplyfy the management of specificying which CPU >> is/isn't valid let's create a property that can be set in the machine >> init. We can then check to see if the user supplied CPU is in that list >> or not. >> >> I have added the valid_cpu_types for some ARM machines only at the >> moment. >> >> Here is what specifying the CPUs looks like now: >> >> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S >> QEMU 2.10.50 monitor - type 'help' for more information >> (qemu) info cpus >> * CPU #0: thread_id=24175 >> (qemu) q >> >> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S >> QEMU 2.10.50 monitor - type 'help' for more information >> (qemu) q >> >> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S >> qemu-system-aarch64: unable to find CPU model 'cortex-m5' >> >> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S >> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu >> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu > > Thanks for this; we really should be more strict about > forbidding "won't work" combinations than we have > been in the past. > > In the last of these cases, I think that when we > list the invalid CPU type and the valid types > we should use the same names we want the user to > use on the command line, without the "-arm-cpu" > suffixes. Hmm... That is a good point, it is confusing that they don't line up. The problem is that we are just doing a simple object_class_dynamic_cast() in hw/core/machine.c which I think (untested) requires us to have the full name in the valid cpu array. Alistair > > thanks > -- PMM ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-20 0:55 ` Alistair Francis @ 2017-12-20 1:03 ` Alistair Francis 2017-12-20 22:06 ` Eduardo Habkost 0 siblings, 1 reply; 20+ messages in thread From: Alistair Francis @ 2017-12-20 1:03 UTC (permalink / raw) To: Alistair Francis Cc: Peter Maydell, QEMU Developers, Eduardo Habkost, Philippe Mathieu-Daudé, Igor Mammedov, Marcel Apfelbaum On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis <alistair.francis@xilinx.com> wrote: > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: >> On 20 December 2017 at 00:27, Alistair Francis >> <alistair.francis@xilinx.com> wrote: >>> There are numorous QEMU machines that only have a single or a handful of >>> valid CPU options. To simplyfy the management of specificying which CPU >>> is/isn't valid let's create a property that can be set in the machine >>> init. We can then check to see if the user supplied CPU is in that list >>> or not. >>> >>> I have added the valid_cpu_types for some ARM machines only at the >>> moment. >>> >>> Here is what specifying the CPUs looks like now: >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S >>> QEMU 2.10.50 monitor - type 'help' for more information >>> (qemu) info cpus >>> * CPU #0: thread_id=24175 >>> (qemu) q >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S >>> QEMU 2.10.50 monitor - type 'help' for more information >>> (qemu) q >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu >> >> Thanks for this; we really should be more strict about >> forbidding "won't work" combinations than we have >> been in the past. >> >> In the last of these cases, I think that when we >> list the invalid CPU type and the valid types >> we should use the same names we want the user to >> use on the command line, without the "-arm-cpu" >> suffixes. > > Hmm... That is a good point, it is confusing that they don't line up. > > The problem is that we are just doing a simple > object_class_dynamic_cast() in hw/core/machine.c which I think > (untested) requires us to have the full name in the valid cpu array. Yeah, so I tested this diff on top of this series: diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c index 111a1d0aba..702e5e8fcf 100644 --- a/hw/arm/netduino2.c +++ b/hw/arm/netduino2.c @@ -42,8 +42,8 @@ static void netduino2_init(MachineState *machine) } static const char *netduino_valid_cpus[] = { - ARM_CPU_TYPE_NAME("cortex-m3"), - ARM_CPU_TYPE_NAME("cortex-m4"), + "cortex-m3", + "cortex-m4", NULL }; diff --git a/hw/core/machine.c b/hw/core/machine.c index c857f3f934..4b817ccc58 100644 --- a/hw/core/machine.c +++ b/hw/core/machine.c @@ -761,8 +761,8 @@ void machine_run_board_init(MachineState *machine) /* If the machine supports the valid_cpu_types check and the user * specified a CPU with -cpu check here that the user CPU is supported. */ - if (machine_class->valid_cpu_types && machine->cpu_type) { - ObjectClass *class = object_class_by_name(machine->cpu_type); + if (machine_class->valid_cpu_types && machine->cpu_model) { + ObjectClass *class = object_class_by_name(machine->cpu_model); int i; for (i = 0; machine_class->valid_cpu_types[i]; i++) { @@ -777,7 +777,7 @@ void machine_run_board_init(MachineState *machine) if (!machine_class->valid_cpu_types[i]) { /* The user specified CPU is not valid */ - error_report("Invalid CPU type: %s", machine->cpu_type); + error_report("Invalid CPU type: %s", machine->cpu_model); error_printf("The valid types are: %s", machine_class->valid_cpu_types[0]); for (i = 1; machine_class->valid_cpu_types[i]; i++) { and I get this: $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S qemu-system-aarch64: Invalid CPU type: cortex-m4 The valid types are: cortex-m3, cortex-m4 So we loose the object_class_dynamic_cast() ability. I think an earlier version of my previous series adding the support to machine.c did string comparison, but it was decided to utilise objects instead. One option is to make the array 2 wide and have the second string be user friendly? Alistair > > Alistair > >> >> thanks >> -- PMM ^ permalink raw reply related [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-20 1:03 ` Alistair Francis @ 2017-12-20 22:06 ` Eduardo Habkost 2017-12-22 18:45 ` Alistair Francis 0 siblings, 1 reply; 20+ messages in thread From: Eduardo Habkost @ 2017-12-20 22:06 UTC (permalink / raw) To: Alistair Francis Cc: Peter Maydell, QEMU Developers, Philippe Mathieu-Daudé, Igor Mammedov, Marcel Apfelbaum On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: > On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis > <alistair.francis@xilinx.com> wrote: > > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > >> On 20 December 2017 at 00:27, Alistair Francis > >> <alistair.francis@xilinx.com> wrote: > >>> There are numorous QEMU machines that only have a single or a handful of > >>> valid CPU options. To simplyfy the management of specificying which CPU > >>> is/isn't valid let's create a property that can be set in the machine > >>> init. We can then check to see if the user supplied CPU is in that list > >>> or not. > >>> > >>> I have added the valid_cpu_types for some ARM machines only at the > >>> moment. > >>> > >>> Here is what specifying the CPUs looks like now: > >>> > >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S > >>> QEMU 2.10.50 monitor - type 'help' for more information > >>> (qemu) info cpus > >>> * CPU #0: thread_id=24175 > >>> (qemu) q > >>> > >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S > >>> QEMU 2.10.50 monitor - type 'help' for more information > >>> (qemu) q > >>> > >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S > >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' > >>> > >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S > >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu > >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu > >> > >> Thanks for this; we really should be more strict about > >> forbidding "won't work" combinations than we have > >> been in the past. > >> > >> In the last of these cases, I think that when we > >> list the invalid CPU type and the valid types > >> we should use the same names we want the user to > >> use on the command line, without the "-arm-cpu" > >> suffixes. > > > > Hmm... That is a good point, it is confusing that they don't line up. Agreed. > > > > The problem is that we are just doing a simple > > object_class_dynamic_cast() in hw/core/machine.c which I think > > (untested) requires us to have the full name in the valid cpu array. [...] > > I think an earlier version of my previous series adding the support to > machine.c did string comparison, but it was decided to utilise objects > instead. One option is to make the array 2 wide and have the second > string be user friendly? Making the array 2-column will duplicate information that we can already find out using other methods, and it won't solve the problem if an entry has a parent class with multiple subclasses (the original reason I suggested object_class_dynamic_cast()). The main obstacle to fix this easily is that we do have a common ObjectClass *cpu_class_by_name(const char *cpu_model) function, but not a common method to get the model name from a CPUClass. Implementing this is possible, but probably better to do it after moving the existing arch-specific CPU model enumeration hooks to common code (currently we duplicate lots of CPU enumeration/lookup boilerplate code that we shouldn't have to). Listing only the human-friendly names in the array like in the original patch could be a reasonable temporary solution. It won't allow us to use a single entry for all subclasses of a given type by now (e.g. listing only TYPE_X86_CPU on PC), but at least we can address this issue without waiting for a refactor of the CPU model enumeration code. -- Eduardo ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-20 22:06 ` Eduardo Habkost @ 2017-12-22 18:45 ` Alistair Francis 2017-12-22 19:47 ` Alistair Francis 0 siblings, 1 reply; 20+ messages in thread From: Alistair Francis @ 2017-12-22 18:45 UTC (permalink / raw) To: Eduardo Habkost Cc: Alistair Francis, Marcel Apfelbaum, Peter Maydell, Igor Mammedov, QEMU Developers, Philippe Mathieu-Daudé On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: > On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: >> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis >> <alistair.francis@xilinx.com> wrote: >> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: >> >> On 20 December 2017 at 00:27, Alistair Francis >> >> <alistair.francis@xilinx.com> wrote: >> >>> There are numorous QEMU machines that only have a single or a handful of >> >>> valid CPU options. To simplyfy the management of specificying which CPU >> >>> is/isn't valid let's create a property that can be set in the machine >> >>> init. We can then check to see if the user supplied CPU is in that list >> >>> or not. >> >>> >> >>> I have added the valid_cpu_types for some ARM machines only at the >> >>> moment. >> >>> >> >>> Here is what specifying the CPUs looks like now: >> >>> >> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S >> >>> QEMU 2.10.50 monitor - type 'help' for more information >> >>> (qemu) info cpus >> >>> * CPU #0: thread_id=24175 >> >>> (qemu) q >> >>> >> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S >> >>> QEMU 2.10.50 monitor - type 'help' for more information >> >>> (qemu) q >> >>> >> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S >> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' >> >>> >> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S >> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu >> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu >> >> >> >> Thanks for this; we really should be more strict about >> >> forbidding "won't work" combinations than we have >> >> been in the past. >> >> >> >> In the last of these cases, I think that when we >> >> list the invalid CPU type and the valid types >> >> we should use the same names we want the user to >> >> use on the command line, without the "-arm-cpu" >> >> suffixes. >> > >> > Hmm... That is a good point, it is confusing that they don't line up. > > Agreed. > >> > >> > The problem is that we are just doing a simple >> > object_class_dynamic_cast() in hw/core/machine.c which I think >> > (untested) requires us to have the full name in the valid cpu array. > [...] >> >> I think an earlier version of my previous series adding the support to >> machine.c did string comparison, but it was decided to utilise objects >> instead. One option is to make the array 2 wide and have the second >> string be user friendly? > > Making the array 2-column will duplicate information that we can > already find out using other methods, and it won't solve the > problem if an entry has a parent class with multiple subclasses > (the original reason I suggested object_class_dynamic_cast()). > > The main obstacle to fix this easily is that we do have a common > ObjectClass *cpu_class_by_name(const char *cpu_model) > function, but not a common method to get the model name from a > CPUClass. Implementing this is possible, but probably better to > do it after moving the existing arch-specific CPU model > enumeration hooks to common code (currently we duplicate lots of > CPU enumeration/lookup boilerplate code that we shouldn't have > to). > > Listing only the human-friendly names in the array like in the > original patch could be a reasonable temporary solution. It > won't allow us to use a single entry for all subclasses of a > given type by now (e.g. listing only TYPE_X86_CPU on PC), but at > least we can address this issue without waiting for a refactor of > the CPU model enumeration code. Ok, so it sounds like I'll respin this series with an extra column in the array for human readable names. Then in the future we can work on removing that. Alistair > > -- > Eduardo > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-22 18:45 ` Alistair Francis @ 2017-12-22 19:47 ` Alistair Francis 2017-12-22 21:26 ` Eduardo Habkost 2017-12-28 13:39 ` Igor Mammedov 0 siblings, 2 replies; 20+ messages in thread From: Alistair Francis @ 2017-12-22 19:47 UTC (permalink / raw) To: Alistair Francis Cc: Eduardo Habkost, Marcel Apfelbaum, Peter Maydell, Igor Mammedov, QEMU Developers, Philippe Mathieu-Daudé On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis <alistair.francis@xilinx.com> wrote: > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis >>> <alistair.francis@xilinx.com> wrote: >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: >>> >> On 20 December 2017 at 00:27, Alistair Francis >>> >> <alistair.francis@xilinx.com> wrote: >>> >>> There are numorous QEMU machines that only have a single or a handful of >>> >>> valid CPU options. To simplyfy the management of specificying which CPU >>> >>> is/isn't valid let's create a property that can be set in the machine >>> >>> init. We can then check to see if the user supplied CPU is in that list >>> >>> or not. >>> >>> >>> >>> I have added the valid_cpu_types for some ARM machines only at the >>> >>> moment. >>> >>> >>> >>> Here is what specifying the CPUs looks like now: >>> >>> >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S >>> >>> QEMU 2.10.50 monitor - type 'help' for more information >>> >>> (qemu) info cpus >>> >>> * CPU #0: thread_id=24175 >>> >>> (qemu) q >>> >>> >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S >>> >>> QEMU 2.10.50 monitor - type 'help' for more information >>> >>> (qemu) q >>> >>> >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' >>> >>> >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu >>> >> >>> >> Thanks for this; we really should be more strict about >>> >> forbidding "won't work" combinations than we have >>> >> been in the past. >>> >> >>> >> In the last of these cases, I think that when we >>> >> list the invalid CPU type and the valid types >>> >> we should use the same names we want the user to >>> >> use on the command line, without the "-arm-cpu" >>> >> suffixes. >>> > >>> > Hmm... That is a good point, it is confusing that they don't line up. >> >> Agreed. >> >>> > >>> > The problem is that we are just doing a simple >>> > object_class_dynamic_cast() in hw/core/machine.c which I think >>> > (untested) requires us to have the full name in the valid cpu array. >> [...] >>> >>> I think an earlier version of my previous series adding the support to >>> machine.c did string comparison, but it was decided to utilise objects >>> instead. One option is to make the array 2 wide and have the second >>> string be user friendly? >> >> Making the array 2-column will duplicate information that we can >> already find out using other methods, and it won't solve the >> problem if an entry has a parent class with multiple subclasses >> (the original reason I suggested object_class_dynamic_cast()). >> >> The main obstacle to fix this easily is that we do have a common >> ObjectClass *cpu_class_by_name(const char *cpu_model) >> function, but not a common method to get the model name from a >> CPUClass. Implementing this is possible, but probably better to >> do it after moving the existing arch-specific CPU model >> enumeration hooks to common code (currently we duplicate lots of >> CPU enumeration/lookup boilerplate code that we shouldn't have >> to). >> >> Listing only the human-friendly names in the array like in the >> original patch could be a reasonable temporary solution. It >> won't allow us to use a single entry for all subclasses of a >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at >> least we can address this issue without waiting for a refactor of >> the CPU model enumeration code. Ah, I just re-read this. Do you mean go back to the original RFC and just use strcmp() to compare the human readable cpu_model? Alistair > > Ok, so it sounds like I'll respin this series with an extra column in > the array for human readable names. Then in the future we can work on > removing that. > > Alistair > >> >> -- >> Eduardo >> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-22 19:47 ` Alistair Francis @ 2017-12-22 21:26 ` Eduardo Habkost 2017-12-28 13:39 ` Igor Mammedov 1 sibling, 0 replies; 20+ messages in thread From: Eduardo Habkost @ 2017-12-22 21:26 UTC (permalink / raw) To: Alistair Francis Cc: Marcel Apfelbaum, Peter Maydell, Igor Mammedov, QEMU Developers, Philippe Mathieu-Daudé On Fri, Dec 22, 2017 at 11:47:00AM -0800, Alistair Francis wrote: > On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis > <alistair.francis@xilinx.com> wrote: > > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: > >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: > >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis > >>> <alistair.francis@xilinx.com> wrote: > >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > >>> >> On 20 December 2017 at 00:27, Alistair Francis > >>> >> <alistair.francis@xilinx.com> wrote: > >>> >>> There are numorous QEMU machines that only have a single or a handful of > >>> >>> valid CPU options. To simplyfy the management of specificying which CPU > >>> >>> is/isn't valid let's create a property that can be set in the machine > >>> >>> init. We can then check to see if the user supplied CPU is in that list > >>> >>> or not. > >>> >>> > >>> >>> I have added the valid_cpu_types for some ARM machines only at the > >>> >>> moment. > >>> >>> > >>> >>> Here is what specifying the CPUs looks like now: > >>> >>> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > >>> >>> (qemu) info cpus > >>> >>> * CPU #0: thread_id=24175 > >>> >>> (qemu) q > >>> >>> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > >>> >>> (qemu) q > >>> >>> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S > >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' > >>> >>> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S > >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu > >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu > >>> >> > >>> >> Thanks for this; we really should be more strict about > >>> >> forbidding "won't work" combinations than we have > >>> >> been in the past. > >>> >> > >>> >> In the last of these cases, I think that when we > >>> >> list the invalid CPU type and the valid types > >>> >> we should use the same names we want the user to > >>> >> use on the command line, without the "-arm-cpu" > >>> >> suffixes. > >>> > > >>> > Hmm... That is a good point, it is confusing that they don't line up. > >> > >> Agreed. > >> > >>> > > >>> > The problem is that we are just doing a simple > >>> > object_class_dynamic_cast() in hw/core/machine.c which I think > >>> > (untested) requires us to have the full name in the valid cpu array. > >> [...] > >>> > >>> I think an earlier version of my previous series adding the support to > >>> machine.c did string comparison, but it was decided to utilise objects > >>> instead. One option is to make the array 2 wide and have the second > >>> string be user friendly? > >> > >> Making the array 2-column will duplicate information that we can > >> already find out using other methods, and it won't solve the > >> problem if an entry has a parent class with multiple subclasses > >> (the original reason I suggested object_class_dynamic_cast()). > >> > >> The main obstacle to fix this easily is that we do have a common > >> ObjectClass *cpu_class_by_name(const char *cpu_model) > >> function, but not a common method to get the model name from a > >> CPUClass. Implementing this is possible, but probably better to > >> do it after moving the existing arch-specific CPU model > >> enumeration hooks to common code (currently we duplicate lots of > >> CPU enumeration/lookup boilerplate code that we shouldn't have > >> to). > >> > >> Listing only the human-friendly names in the array like in the > >> original patch could be a reasonable temporary solution. It > >> won't allow us to use a single entry for all subclasses of a > >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at > >> least we can address this issue without waiting for a refactor of > >> the CPU model enumeration code. > > Ah, I just re-read this. Do you mean go back to the original RFC and > just use strcmp() to compare the human readable cpu_model? Yes, I think this would be simpler, considering that the current users don't need the object_class_dynamic_cast() stuff. Then whoever decide to make PC simply list TYPE_X86_CPU later (possibly me) will need to clean up the CPU model enumeration/lookup code and implement a cpu_model_from_type_name() helper. -- Eduardo ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-22 19:47 ` Alistair Francis 2017-12-22 21:26 ` Eduardo Habkost @ 2017-12-28 13:39 ` Igor Mammedov 2017-12-28 14:59 ` Eduardo Habkost 1 sibling, 1 reply; 20+ messages in thread From: Igor Mammedov @ 2017-12-28 13:39 UTC (permalink / raw) To: Alistair Francis Cc: Eduardo Habkost, Marcel Apfelbaum, Peter Maydell, QEMU Developers, Philippe Mathieu-Daudé On Fri, 22 Dec 2017 11:47:00 -0800 Alistair Francis <alistair.francis@xilinx.com> wrote: > On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis > <alistair.francis@xilinx.com> wrote: > > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: > >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: > >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis > >>> <alistair.francis@xilinx.com> wrote: > >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > >>> >> On 20 December 2017 at 00:27, Alistair Francis > >>> >> <alistair.francis@xilinx.com> wrote: > >>> >>> There are numorous QEMU machines that only have a single or a handful of > >>> >>> valid CPU options. To simplyfy the management of specificying which CPU > >>> >>> is/isn't valid let's create a property that can be set in the machine > >>> >>> init. We can then check to see if the user supplied CPU is in that list > >>> >>> or not. > >>> >>> > >>> >>> I have added the valid_cpu_types for some ARM machines only at the > >>> >>> moment. > >>> >>> > >>> >>> Here is what specifying the CPUs looks like now: > >>> >>> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > >>> >>> (qemu) info cpus > >>> >>> * CPU #0: thread_id=24175 > >>> >>> (qemu) q > >>> >>> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > >>> >>> (qemu) q > >>> >>> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S > >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' > >>> >>> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S > >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu > >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu > >>> >> > >>> >> Thanks for this; we really should be more strict about > >>> >> forbidding "won't work" combinations than we have > >>> >> been in the past. > >>> >> > >>> >> In the last of these cases, I think that when we > >>> >> list the invalid CPU type and the valid types > >>> >> we should use the same names we want the user to > >>> >> use on the command line, without the "-arm-cpu" > >>> >> suffixes. > >>> > > >>> > Hmm... That is a good point, it is confusing that they don't line up. > >> > >> Agreed. > >> > >>> > > >>> > The problem is that we are just doing a simple > >>> > object_class_dynamic_cast() in hw/core/machine.c which I think > >>> > (untested) requires us to have the full name in the valid cpu array. > >> [...] > >>> > >>> I think an earlier version of my previous series adding the support to > >>> machine.c did string comparison, but it was decided to utilise objects > >>> instead. One option is to make the array 2 wide and have the second > >>> string be user friendly? > >> > >> Making the array 2-column will duplicate information that we can > >> already find out using other methods, and it won't solve the > >> problem if an entry has a parent class with multiple subclasses > >> (the original reason I suggested object_class_dynamic_cast()). > >> > >> The main obstacle to fix this easily is that we do have a common > >> ObjectClass *cpu_class_by_name(const char *cpu_model) > >> function, but not a common method to get the model name from a > >> CPUClass. Implementing this is possible, but probably better to > >> do it after moving the existing arch-specific CPU model > >> enumeration hooks to common code (currently we duplicate lots of > >> CPU enumeration/lookup boilerplate code that we shouldn't have > >> to). > >> > >> Listing only the human-friendly names in the array like in the > >> original patch could be a reasonable temporary solution. It > >> won't allow us to use a single entry for all subclasses of a > >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at > >> least we can address this issue without waiting for a refactor of > >> the CPU model enumeration code. > > Ah, I just re-read this. Do you mean go back to the original RFC and > just use strcmp() to compare the human readable cpu_model? It's sort of going backwards but I won't object to this as far as you won't use machine->cpu_model (which is in process of being removed) BTW: how hard is it, to add cpu_type2cpu_name function? > Alistair > > > > > Ok, so it sounds like I'll respin this series with an extra column in > > the array for human readable names. Then in the future we can work on > > removing that. > > > > Alistair > > > >> > >> -- > >> Eduardo > >> ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-28 13:39 ` Igor Mammedov @ 2017-12-28 14:59 ` Eduardo Habkost 2018-01-10 21:30 ` Alistair Francis 0 siblings, 1 reply; 20+ messages in thread From: Eduardo Habkost @ 2017-12-28 14:59 UTC (permalink / raw) To: Igor Mammedov Cc: Alistair Francis, Marcel Apfelbaum, Peter Maydell, QEMU Developers, Philippe Mathieu-Daudé On Thu, Dec 28, 2017 at 02:39:31PM +0100, Igor Mammedov wrote: > On Fri, 22 Dec 2017 11:47:00 -0800 > Alistair Francis <alistair.francis@xilinx.com> wrote: > > > On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis > > <alistair.francis@xilinx.com> wrote: > > > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: > > >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: > > >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis > > >>> <alistair.francis@xilinx.com> wrote: > > >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > > >>> >> On 20 December 2017 at 00:27, Alistair Francis > > >>> >> <alistair.francis@xilinx.com> wrote: > > >>> >>> There are numorous QEMU machines that only have a single or a handful of > > >>> >>> valid CPU options. To simplyfy the management of specificying which CPU > > >>> >>> is/isn't valid let's create a property that can be set in the machine > > >>> >>> init. We can then check to see if the user supplied CPU is in that list > > >>> >>> or not. > > >>> >>> > > >>> >>> I have added the valid_cpu_types for some ARM machines only at the > > >>> >>> moment. > > >>> >>> > > >>> >>> Here is what specifying the CPUs looks like now: > > >>> >>> > > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S > > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > > >>> >>> (qemu) info cpus > > >>> >>> * CPU #0: thread_id=24175 > > >>> >>> (qemu) q > > >>> >>> > > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S > > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > > >>> >>> (qemu) q > > >>> >>> > > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S > > >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' > > >>> >>> > > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S > > >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu > > >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu > > >>> >> > > >>> >> Thanks for this; we really should be more strict about > > >>> >> forbidding "won't work" combinations than we have > > >>> >> been in the past. > > >>> >> > > >>> >> In the last of these cases, I think that when we > > >>> >> list the invalid CPU type and the valid types > > >>> >> we should use the same names we want the user to > > >>> >> use on the command line, without the "-arm-cpu" > > >>> >> suffixes. > > >>> > > > >>> > Hmm... That is a good point, it is confusing that they don't line up. > > >> > > >> Agreed. > > >> > > >>> > > > >>> > The problem is that we are just doing a simple > > >>> > object_class_dynamic_cast() in hw/core/machine.c which I think > > >>> > (untested) requires us to have the full name in the valid cpu array. > > >> [...] > > >>> > > >>> I think an earlier version of my previous series adding the support to > > >>> machine.c did string comparison, but it was decided to utilise objects > > >>> instead. One option is to make the array 2 wide and have the second > > >>> string be user friendly? > > >> > > >> Making the array 2-column will duplicate information that we can > > >> already find out using other methods, and it won't solve the > > >> problem if an entry has a parent class with multiple subclasses > > >> (the original reason I suggested object_class_dynamic_cast()). > > >> > > >> The main obstacle to fix this easily is that we do have a common > > >> ObjectClass *cpu_class_by_name(const char *cpu_model) > > >> function, but not a common method to get the model name from a > > >> CPUClass. Implementing this is possible, but probably better to > > >> do it after moving the existing arch-specific CPU model > > >> enumeration hooks to common code (currently we duplicate lots of > > >> CPU enumeration/lookup boilerplate code that we shouldn't have > > >> to). > > >> > > >> Listing only the human-friendly names in the array like in the > > >> original patch could be a reasonable temporary solution. It > > >> won't allow us to use a single entry for all subclasses of a > > >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at > > >> least we can address this issue without waiting for a refactor of > > >> the CPU model enumeration code. > > > > Ah, I just re-read this. Do you mean go back to the original RFC and > > just use strcmp() to compare the human readable cpu_model? > It's sort of going backwards but I won't object to this as far as you > won't use machine->cpu_model (which is in process of being removed) > > > BTW: > how hard is it, to add cpu_type2cpu_name function? It shouldn't be hard, but I would like to avoid adding yet another arch-specific hook just for that. Probably we would need to clean up the existing CPU model enumeration/lookup code if we want to avoid increase duplication of code on arch-specific hooks. -- Eduardo ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2017-12-28 14:59 ` Eduardo Habkost @ 2018-01-10 21:30 ` Alistair Francis 2018-01-10 21:48 ` Eduardo Habkost 0 siblings, 1 reply; 20+ messages in thread From: Alistair Francis @ 2018-01-10 21:30 UTC (permalink / raw) To: Eduardo Habkost Cc: Igor Mammedov, Marcel Apfelbaum, Peter Maydell, Philippe Mathieu-Daudé, QEMU Developers, Alistair Francis On Thu, Dec 28, 2017 at 6:59 AM, Eduardo Habkost <ehabkost@redhat.com> wrote: > On Thu, Dec 28, 2017 at 02:39:31PM +0100, Igor Mammedov wrote: >> On Fri, 22 Dec 2017 11:47:00 -0800 >> Alistair Francis <alistair.francis@xilinx.com> wrote: >> >> > On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis >> > <alistair.francis@xilinx.com> wrote: >> > > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: >> > >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: >> > >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis >> > >>> <alistair.francis@xilinx.com> wrote: >> > >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: >> > >>> >> On 20 December 2017 at 00:27, Alistair Francis >> > >>> >> <alistair.francis@xilinx.com> wrote: >> > >>> >>> There are numorous QEMU machines that only have a single or a handful of >> > >>> >>> valid CPU options. To simplyfy the management of specificying which CPU >> > >>> >>> is/isn't valid let's create a property that can be set in the machine >> > >>> >>> init. We can then check to see if the user supplied CPU is in that list >> > >>> >>> or not. >> > >>> >>> >> > >>> >>> I have added the valid_cpu_types for some ARM machines only at the >> > >>> >>> moment. >> > >>> >>> >> > >>> >>> Here is what specifying the CPUs looks like now: >> > >>> >>> >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information >> > >>> >>> (qemu) info cpus >> > >>> >>> * CPU #0: thread_id=24175 >> > >>> >>> (qemu) q >> > >>> >>> >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information >> > >>> >>> (qemu) q >> > >>> >>> >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S >> > >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' >> > >>> >>> >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S >> > >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu >> > >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu >> > >>> >> >> > >>> >> Thanks for this; we really should be more strict about >> > >>> >> forbidding "won't work" combinations than we have >> > >>> >> been in the past. >> > >>> >> >> > >>> >> In the last of these cases, I think that when we >> > >>> >> list the invalid CPU type and the valid types >> > >>> >> we should use the same names we want the user to >> > >>> >> use on the command line, without the "-arm-cpu" >> > >>> >> suffixes. >> > >>> > >> > >>> > Hmm... That is a good point, it is confusing that they don't line up. >> > >> >> > >> Agreed. >> > >> >> > >>> > >> > >>> > The problem is that we are just doing a simple >> > >>> > object_class_dynamic_cast() in hw/core/machine.c which I think >> > >>> > (untested) requires us to have the full name in the valid cpu array. >> > >> [...] >> > >>> >> > >>> I think an earlier version of my previous series adding the support to >> > >>> machine.c did string comparison, but it was decided to utilise objects >> > >>> instead. One option is to make the array 2 wide and have the second >> > >>> string be user friendly? >> > >> >> > >> Making the array 2-column will duplicate information that we can >> > >> already find out using other methods, and it won't solve the >> > >> problem if an entry has a parent class with multiple subclasses >> > >> (the original reason I suggested object_class_dynamic_cast()). >> > >> >> > >> The main obstacle to fix this easily is that we do have a common >> > >> ObjectClass *cpu_class_by_name(const char *cpu_model) >> > >> function, but not a common method to get the model name from a >> > >> CPUClass. Implementing this is possible, but probably better to >> > >> do it after moving the existing arch-specific CPU model >> > >> enumeration hooks to common code (currently we duplicate lots of >> > >> CPU enumeration/lookup boilerplate code that we shouldn't have >> > >> to). >> > >> >> > >> Listing only the human-friendly names in the array like in the >> > >> original patch could be a reasonable temporary solution. It >> > >> won't allow us to use a single entry for all subclasses of a >> > >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at >> > >> least we can address this issue without waiting for a refactor of >> > >> the CPU model enumeration code. >> > >> > Ah, I just re-read this. Do you mean go back to the original RFC and >> > just use strcmp() to compare the human readable cpu_model? >> It's sort of going backwards but I won't object to this as far as you >> won't use machine->cpu_model (which is in process of being removed) Wait, machine->cpu_model is the human readable name. Without using that we can't use just human readable strings for the valid cpu types. Alistair >> >> >> BTW: >> how hard is it, to add cpu_type2cpu_name function? > > It shouldn't be hard, but I would like to avoid adding yet > another arch-specific hook just for that. Probably we would need > to clean up the existing CPU model enumeration/lookup code if we > want to avoid increase duplication of code on arch-specific > hooks. > > -- > Eduardo > ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2018-01-10 21:30 ` Alistair Francis @ 2018-01-10 21:48 ` Eduardo Habkost 2018-01-11 10:25 ` Igor Mammedov 0 siblings, 1 reply; 20+ messages in thread From: Eduardo Habkost @ 2018-01-10 21:48 UTC (permalink / raw) To: Alistair Francis Cc: Igor Mammedov, Marcel Apfelbaum, Peter Maydell, Philippe Mathieu-Daudé, QEMU Developers On Wed, Jan 10, 2018 at 01:30:29PM -0800, Alistair Francis wrote: > On Thu, Dec 28, 2017 at 6:59 AM, Eduardo Habkost <ehabkost@redhat.com> wrote: > > On Thu, Dec 28, 2017 at 02:39:31PM +0100, Igor Mammedov wrote: > >> On Fri, 22 Dec 2017 11:47:00 -0800 > >> Alistair Francis <alistair.francis@xilinx.com> wrote: > >> > >> > On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis > >> > <alistair.francis@xilinx.com> wrote: > >> > > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: > >> > >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: > >> > >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis > >> > >>> <alistair.francis@xilinx.com> wrote: > >> > >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > >> > >>> >> On 20 December 2017 at 00:27, Alistair Francis > >> > >>> >> <alistair.francis@xilinx.com> wrote: > >> > >>> >>> There are numorous QEMU machines that only have a single or a handful of > >> > >>> >>> valid CPU options. To simplyfy the management of specificying which CPU > >> > >>> >>> is/isn't valid let's create a property that can be set in the machine > >> > >>> >>> init. We can then check to see if the user supplied CPU is in that list > >> > >>> >>> or not. > >> > >>> >>> > >> > >>> >>> I have added the valid_cpu_types for some ARM machines only at the > >> > >>> >>> moment. > >> > >>> >>> > >> > >>> >>> Here is what specifying the CPUs looks like now: > >> > >>> >>> > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S > >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > >> > >>> >>> (qemu) info cpus > >> > >>> >>> * CPU #0: thread_id=24175 > >> > >>> >>> (qemu) q > >> > >>> >>> > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S > >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > >> > >>> >>> (qemu) q > >> > >>> >>> > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S > >> > >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' > >> > >>> >>> > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S > >> > >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu > >> > >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu > >> > >>> >> > >> > >>> >> Thanks for this; we really should be more strict about > >> > >>> >> forbidding "won't work" combinations than we have > >> > >>> >> been in the past. > >> > >>> >> > >> > >>> >> In the last of these cases, I think that when we > >> > >>> >> list the invalid CPU type and the valid types > >> > >>> >> we should use the same names we want the user to > >> > >>> >> use on the command line, without the "-arm-cpu" > >> > >>> >> suffixes. > >> > >>> > > >> > >>> > Hmm... That is a good point, it is confusing that they don't line up. > >> > >> > >> > >> Agreed. > >> > >> > >> > >>> > > >> > >>> > The problem is that we are just doing a simple > >> > >>> > object_class_dynamic_cast() in hw/core/machine.c which I think > >> > >>> > (untested) requires us to have the full name in the valid cpu array. > >> > >> [...] > >> > >>> > >> > >>> I think an earlier version of my previous series adding the support to > >> > >>> machine.c did string comparison, but it was decided to utilise objects > >> > >>> instead. One option is to make the array 2 wide and have the second > >> > >>> string be user friendly? > >> > >> > >> > >> Making the array 2-column will duplicate information that we can > >> > >> already find out using other methods, and it won't solve the > >> > >> problem if an entry has a parent class with multiple subclasses > >> > >> (the original reason I suggested object_class_dynamic_cast()). > >> > >> > >> > >> The main obstacle to fix this easily is that we do have a common > >> > >> ObjectClass *cpu_class_by_name(const char *cpu_model) > >> > >> function, but not a common method to get the model name from a > >> > >> CPUClass. Implementing this is possible, but probably better to > >> > >> do it after moving the existing arch-specific CPU model > >> > >> enumeration hooks to common code (currently we duplicate lots of > >> > >> CPU enumeration/lookup boilerplate code that we shouldn't have > >> > >> to). > >> > >> > >> > >> Listing only the human-friendly names in the array like in the > >> > >> original patch could be a reasonable temporary solution. It > >> > >> won't allow us to use a single entry for all subclasses of a > >> > >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at > >> > >> least we can address this issue without waiting for a refactor of > >> > >> the CPU model enumeration code. > >> > > >> > Ah, I just re-read this. Do you mean go back to the original RFC and > >> > just use strcmp() to compare the human readable cpu_model? > >> It's sort of going backwards but I won't object to this as far as you > >> won't use machine->cpu_model (which is in process of being removed) > > Wait, machine->cpu_model is the human readable name. Without using > that we can't use just human readable strings for the valid cpu types. Well, if we want to deprecate machine->cpu_model we need to offer an alternative first, otherwise we can't prevent people from using it. Igor, do you see an (existing) alternative to machine->cpu_model that would allow us to avoid using it in machine_run_board_init()? -- Eduardo ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2018-01-10 21:48 ` Eduardo Habkost @ 2018-01-11 10:25 ` Igor Mammedov 2018-01-11 12:58 ` Eduardo Habkost 0 siblings, 1 reply; 20+ messages in thread From: Igor Mammedov @ 2018-01-11 10:25 UTC (permalink / raw) To: Eduardo Habkost Cc: Alistair Francis, Marcel Apfelbaum, Peter Maydell, Philippe Mathieu-Daudé, QEMU Developers On Wed, 10 Jan 2018 19:48:00 -0200 Eduardo Habkost <ehabkost@redhat.com> wrote: > On Wed, Jan 10, 2018 at 01:30:29PM -0800, Alistair Francis wrote: > > On Thu, Dec 28, 2017 at 6:59 AM, Eduardo Habkost <ehabkost@redhat.com> wrote: > > > On Thu, Dec 28, 2017 at 02:39:31PM +0100, Igor Mammedov wrote: > > >> On Fri, 22 Dec 2017 11:47:00 -0800 > > >> Alistair Francis <alistair.francis@xilinx.com> wrote: > > >> > > >> > On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis > > >> > <alistair.francis@xilinx.com> wrote: > > >> > > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: > > >> > >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: > > >> > >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis > > >> > >>> <alistair.francis@xilinx.com> wrote: > > >> > >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > > >> > >>> >> On 20 December 2017 at 00:27, Alistair Francis > > >> > >>> >> <alistair.francis@xilinx.com> wrote: > > >> > >>> >>> There are numorous QEMU machines that only have a single or a handful of > > >> > >>> >>> valid CPU options. To simplyfy the management of specificying which CPU > > >> > >>> >>> is/isn't valid let's create a property that can be set in the machine > > >> > >>> >>> init. We can then check to see if the user supplied CPU is in that list > > >> > >>> >>> or not. > > >> > >>> >>> > > >> > >>> >>> I have added the valid_cpu_types for some ARM machines only at the > > >> > >>> >>> moment. > > >> > >>> >>> > > >> > >>> >>> Here is what specifying the CPUs looks like now: > > >> > >>> >>> > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S > > >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > > >> > >>> >>> (qemu) info cpus > > >> > >>> >>> * CPU #0: thread_id=24175 > > >> > >>> >>> (qemu) q > > >> > >>> >>> > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S > > >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > > >> > >>> >>> (qemu) q > > >> > >>> >>> > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S > > >> > >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' > > >> > >>> >>> > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S > > >> > >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu > > >> > >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu > > >> > >>> >> > > >> > >>> >> Thanks for this; we really should be more strict about > > >> > >>> >> forbidding "won't work" combinations than we have > > >> > >>> >> been in the past. > > >> > >>> >> > > >> > >>> >> In the last of these cases, I think that when we > > >> > >>> >> list the invalid CPU type and the valid types > > >> > >>> >> we should use the same names we want the user to > > >> > >>> >> use on the command line, without the "-arm-cpu" > > >> > >>> >> suffixes. > > >> > >>> > > > >> > >>> > Hmm... That is a good point, it is confusing that they don't line up. > > >> > >> > > >> > >> Agreed. > > >> > >> > > >> > >>> > > > >> > >>> > The problem is that we are just doing a simple > > >> > >>> > object_class_dynamic_cast() in hw/core/machine.c which I think > > >> > >>> > (untested) requires us to have the full name in the valid cpu array. > > >> > >> [...] > > >> > >>> > > >> > >>> I think an earlier version of my previous series adding the support to > > >> > >>> machine.c did string comparison, but it was decided to utilise objects > > >> > >>> instead. One option is to make the array 2 wide and have the second > > >> > >>> string be user friendly? > > >> > >> > > >> > >> Making the array 2-column will duplicate information that we can > > >> > >> already find out using other methods, and it won't solve the > > >> > >> problem if an entry has a parent class with multiple subclasses > > >> > >> (the original reason I suggested object_class_dynamic_cast()). > > >> > >> > > >> > >> The main obstacle to fix this easily is that we do have a common > > >> > >> ObjectClass *cpu_class_by_name(const char *cpu_model) > > >> > >> function, but not a common method to get the model name from a > > >> > >> CPUClass. Implementing this is possible, but probably better to > > >> > >> do it after moving the existing arch-specific CPU model > > >> > >> enumeration hooks to common code (currently we duplicate lots of > > >> > >> CPU enumeration/lookup boilerplate code that we shouldn't have > > >> > >> to). > > >> > >> > > >> > >> Listing only the human-friendly names in the array like in the > > >> > >> original patch could be a reasonable temporary solution. It > > >> > >> won't allow us to use a single entry for all subclasses of a > > >> > >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at > > >> > >> least we can address this issue without waiting for a refactor of > > >> > >> the CPU model enumeration code. > > >> > > > >> > Ah, I just re-read this. Do you mean go back to the original RFC and > > >> > just use strcmp() to compare the human readable cpu_model? > > >> It's sort of going backwards but I won't object to this as far as you > > >> won't use machine->cpu_model (which is in process of being removed) > > > > Wait, machine->cpu_model is the human readable name. Without using > > that we can't use just human readable strings for the valid cpu types. > > Well, if we want to deprecate machine->cpu_model we need to offer > an alternative first, otherwise we can't prevent people from > using it. > > Igor, do you see an (existing) alternative to machine->cpu_model > that would allow us to avoid using it in > machine_run_board_init()? In recently merged refactoring machine->cpu_model is being replaced by machine->cpu_type. So currently we don't need machine->cpu_model anywhere except machine('none'), and once I refactor that it could be dropped completely and after some work on *-user targets we can practically get rid of cpu_model notion completely (excluding of -cpu option parser). My dislike of idea is that it's adding back cpumodel strings in boards code again (which I've just got rid of). I hate to say that but it looks like we need more refactoring for this series to print cpumodels back to user. We already have FOO_cpu_list()/FOO_query_cpu_definitions() which already do cpu type => cpumodel conversion (and even have some code duplication within a target), I'd suggest generalizing that across targets and then using generic helper for printing back to user converted cpu types from mc->valid_cpu_types which this series introduces. ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2018-01-11 10:25 ` Igor Mammedov @ 2018-01-11 12:58 ` Eduardo Habkost 2018-02-01 23:21 ` Alistair Francis 0 siblings, 1 reply; 20+ messages in thread From: Eduardo Habkost @ 2018-01-11 12:58 UTC (permalink / raw) To: Igor Mammedov Cc: Alistair Francis, Marcel Apfelbaum, Peter Maydell, Philippe Mathieu-Daudé, QEMU Developers On Thu, Jan 11, 2018 at 11:25:08AM +0100, Igor Mammedov wrote: > On Wed, 10 Jan 2018 19:48:00 -0200 > Eduardo Habkost <ehabkost@redhat.com> wrote: > > > On Wed, Jan 10, 2018 at 01:30:29PM -0800, Alistair Francis wrote: > > > On Thu, Dec 28, 2017 at 6:59 AM, Eduardo Habkost <ehabkost@redhat.com> wrote: > > > > On Thu, Dec 28, 2017 at 02:39:31PM +0100, Igor Mammedov wrote: > > > >> On Fri, 22 Dec 2017 11:47:00 -0800 > > > >> Alistair Francis <alistair.francis@xilinx.com> wrote: > > > >> > > > >> > On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis > > > >> > <alistair.francis@xilinx.com> wrote: > > > >> > > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: > > > >> > >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: > > > >> > >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis > > > >> > >>> <alistair.francis@xilinx.com> wrote: > > > >> > >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: > > > >> > >>> >> On 20 December 2017 at 00:27, Alistair Francis > > > >> > >>> >> <alistair.francis@xilinx.com> wrote: > > > >> > >>> >>> There are numorous QEMU machines that only have a single or a handful of > > > >> > >>> >>> valid CPU options. To simplyfy the management of specificying which CPU > > > >> > >>> >>> is/isn't valid let's create a property that can be set in the machine > > > >> > >>> >>> init. We can then check to see if the user supplied CPU is in that list > > > >> > >>> >>> or not. > > > >> > >>> >>> > > > >> > >>> >>> I have added the valid_cpu_types for some ARM machines only at the > > > >> > >>> >>> moment. > > > >> > >>> >>> > > > >> > >>> >>> Here is what specifying the CPUs looks like now: > > > >> > >>> >>> > > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S > > > >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > > > >> > >>> >>> (qemu) info cpus > > > >> > >>> >>> * CPU #0: thread_id=24175 > > > >> > >>> >>> (qemu) q > > > >> > >>> >>> > > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S > > > >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information > > > >> > >>> >>> (qemu) q > > > >> > >>> >>> > > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S > > > >> > >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' > > > >> > >>> >>> > > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S > > > >> > >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu > > > >> > >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu > > > >> > >>> >> > > > >> > >>> >> Thanks for this; we really should be more strict about > > > >> > >>> >> forbidding "won't work" combinations than we have > > > >> > >>> >> been in the past. > > > >> > >>> >> > > > >> > >>> >> In the last of these cases, I think that when we > > > >> > >>> >> list the invalid CPU type and the valid types > > > >> > >>> >> we should use the same names we want the user to > > > >> > >>> >> use on the command line, without the "-arm-cpu" > > > >> > >>> >> suffixes. > > > >> > >>> > > > > >> > >>> > Hmm... That is a good point, it is confusing that they don't line up. > > > >> > >> > > > >> > >> Agreed. > > > >> > >> > > > >> > >>> > > > > >> > >>> > The problem is that we are just doing a simple > > > >> > >>> > object_class_dynamic_cast() in hw/core/machine.c which I think > > > >> > >>> > (untested) requires us to have the full name in the valid cpu array. > > > >> > >> [...] > > > >> > >>> > > > >> > >>> I think an earlier version of my previous series adding the support to > > > >> > >>> machine.c did string comparison, but it was decided to utilise objects > > > >> > >>> instead. One option is to make the array 2 wide and have the second > > > >> > >>> string be user friendly? > > > >> > >> > > > >> > >> Making the array 2-column will duplicate information that we can > > > >> > >> already find out using other methods, and it won't solve the > > > >> > >> problem if an entry has a parent class with multiple subclasses > > > >> > >> (the original reason I suggested object_class_dynamic_cast()). > > > >> > >> > > > >> > >> The main obstacle to fix this easily is that we do have a common > > > >> > >> ObjectClass *cpu_class_by_name(const char *cpu_model) > > > >> > >> function, but not a common method to get the model name from a > > > >> > >> CPUClass. Implementing this is possible, but probably better to > > > >> > >> do it after moving the existing arch-specific CPU model > > > >> > >> enumeration hooks to common code (currently we duplicate lots of > > > >> > >> CPU enumeration/lookup boilerplate code that we shouldn't have > > > >> > >> to). > > > >> > >> > > > >> > >> Listing only the human-friendly names in the array like in the > > > >> > >> original patch could be a reasonable temporary solution. It > > > >> > >> won't allow us to use a single entry for all subclasses of a > > > >> > >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at > > > >> > >> least we can address this issue without waiting for a refactor of > > > >> > >> the CPU model enumeration code. > > > >> > > > > >> > Ah, I just re-read this. Do you mean go back to the original RFC and > > > >> > just use strcmp() to compare the human readable cpu_model? > > > >> It's sort of going backwards but I won't object to this as far as you > > > >> won't use machine->cpu_model (which is in process of being removed) > > > > > > Wait, machine->cpu_model is the human readable name. Without using > > > that we can't use just human readable strings for the valid cpu types. > > > > Well, if we want to deprecate machine->cpu_model we need to offer > > an alternative first, otherwise we can't prevent people from > > using it. > > > > Igor, do you see an (existing) alternative to machine->cpu_model > > that would allow us to avoid using it in > > machine_run_board_init()? > In recently merged refactoring machine->cpu_model is being replaced > by machine->cpu_type. So currently we don't need machine->cpu_model > anywhere except machine('none'), and once I refactor that it could > be dropped completely and after some work on *-user targets we can > practically get rid of cpu_model notion completely > (excluding of -cpu option parser). > > My dislike of idea is that it's adding back cpumodel strings > in boards code again (which I've just got rid of). > > I hate to say that but it looks like we need more refactoring > for this series to print cpumodels back to user. > > We already have FOO_cpu_list()/FOO_query_cpu_definitions() > which already do cpu type => cpumodel conversion (and even > have some code duplication within a target), I'd suggest > generalizing that across targets and then using generic > helper for printing back to user converted cpu types from > mc->valid_cpu_types which this series introduces. I agree with the long term goal of making cpu type => cpu model conversion generic. But until we refactor the arch-specific code and implement that, we have 2 options: 1) Keep printing a confusing error message until we implement cpu type => cpu model conversion; 2) Keep the MachineState::cpu_model field until we implement cpu type => cpu model conversion. I don't see any reason to pick (1) instead of (2). -- Eduardo ^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property 2018-01-11 12:58 ` Eduardo Habkost @ 2018-02-01 23:21 ` Alistair Francis 0 siblings, 0 replies; 20+ messages in thread From: Alistair Francis @ 2018-02-01 23:21 UTC (permalink / raw) To: Eduardo Habkost Cc: Igor Mammedov, Marcel Apfelbaum, Peter Maydell, QEMU Developers, Philippe Mathieu-Daudé, Alistair Francis On Thu, Jan 11, 2018 at 4:58 AM, Eduardo Habkost <ehabkost@redhat.com> wrote: > On Thu, Jan 11, 2018 at 11:25:08AM +0100, Igor Mammedov wrote: >> On Wed, 10 Jan 2018 19:48:00 -0200 >> Eduardo Habkost <ehabkost@redhat.com> wrote: >> >> > On Wed, Jan 10, 2018 at 01:30:29PM -0800, Alistair Francis wrote: >> > > On Thu, Dec 28, 2017 at 6:59 AM, Eduardo Habkost <ehabkost@redhat.com> wrote: >> > > > On Thu, Dec 28, 2017 at 02:39:31PM +0100, Igor Mammedov wrote: >> > > >> On Fri, 22 Dec 2017 11:47:00 -0800 >> > > >> Alistair Francis <alistair.francis@xilinx.com> wrote: >> > > >> >> > > >> > On Fri, Dec 22, 2017 at 10:45 AM, Alistair Francis >> > > >> > <alistair.francis@xilinx.com> wrote: >> > > >> > > On Wed, Dec 20, 2017 at 2:06 PM, Eduardo Habkost <ehabkost@redhat.com> wrote: >> > > >> > >> On Tue, Dec 19, 2017 at 05:03:59PM -0800, Alistair Francis wrote: >> > > >> > >>> On Tue, Dec 19, 2017 at 4:55 PM, Alistair Francis >> > > >> > >>> <alistair.francis@xilinx.com> wrote: >> > > >> > >>> > On Tue, Dec 19, 2017 at 4:43 PM, Peter Maydell <peter.maydell@linaro.org> wrote: >> > > >> > >>> >> On 20 December 2017 at 00:27, Alistair Francis >> > > >> > >>> >> <alistair.francis@xilinx.com> wrote: >> > > >> > >>> >>> There are numorous QEMU machines that only have a single or a handful of >> > > >> > >>> >>> valid CPU options. To simplyfy the management of specificying which CPU >> > > >> > >>> >>> is/isn't valid let's create a property that can be set in the machine >> > > >> > >>> >>> init. We can then check to see if the user supplied CPU is in that list >> > > >> > >>> >>> or not. >> > > >> > >>> >>> >> > > >> > >>> >>> I have added the valid_cpu_types for some ARM machines only at the >> > > >> > >>> >>> moment. >> > > >> > >>> >>> >> > > >> > >>> >>> Here is what specifying the CPUs looks like now: >> > > >> > >>> >>> >> > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m3" -S >> > > >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information >> > > >> > >>> >>> (qemu) info cpus >> > > >> > >>> >>> * CPU #0: thread_id=24175 >> > > >> > >>> >>> (qemu) q >> > > >> > >>> >>> >> > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m4" -S >> > > >> > >>> >>> QEMU 2.10.50 monitor - type 'help' for more information >> > > >> > >>> >>> (qemu) q >> > > >> > >>> >>> >> > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-m5" -S >> > > >> > >>> >>> qemu-system-aarch64: unable to find CPU model 'cortex-m5' >> > > >> > >>> >>> >> > > >> > >>> >>> $ aarch64-softmmu/qemu-system-aarch64 -M netduino2 -kernel ./u-boot.elf -nographic -cpu "cortex-a9" -S >> > > >> > >>> >>> qemu-system-aarch64: Invalid CPU type: cortex-a9-arm-cpu >> > > >> > >>> >>> The valid types are: cortex-m3-arm-cpu, cortex-m4-arm-cpu >> > > >> > >>> >> >> > > >> > >>> >> Thanks for this; we really should be more strict about >> > > >> > >>> >> forbidding "won't work" combinations than we have >> > > >> > >>> >> been in the past. >> > > >> > >>> >> >> > > >> > >>> >> In the last of these cases, I think that when we >> > > >> > >>> >> list the invalid CPU type and the valid types >> > > >> > >>> >> we should use the same names we want the user to >> > > >> > >>> >> use on the command line, without the "-arm-cpu" >> > > >> > >>> >> suffixes. >> > > >> > >>> > >> > > >> > >>> > Hmm... That is a good point, it is confusing that they don't line up. >> > > >> > >> >> > > >> > >> Agreed. >> > > >> > >> >> > > >> > >>> > >> > > >> > >>> > The problem is that we are just doing a simple >> > > >> > >>> > object_class_dynamic_cast() in hw/core/machine.c which I think >> > > >> > >>> > (untested) requires us to have the full name in the valid cpu array. >> > > >> > >> [...] >> > > >> > >>> >> > > >> > >>> I think an earlier version of my previous series adding the support to >> > > >> > >>> machine.c did string comparison, but it was decided to utilise objects >> > > >> > >>> instead. One option is to make the array 2 wide and have the second >> > > >> > >>> string be user friendly? >> > > >> > >> >> > > >> > >> Making the array 2-column will duplicate information that we can >> > > >> > >> already find out using other methods, and it won't solve the >> > > >> > >> problem if an entry has a parent class with multiple subclasses >> > > >> > >> (the original reason I suggested object_class_dynamic_cast()). >> > > >> > >> >> > > >> > >> The main obstacle to fix this easily is that we do have a common >> > > >> > >> ObjectClass *cpu_class_by_name(const char *cpu_model) >> > > >> > >> function, but not a common method to get the model name from a >> > > >> > >> CPUClass. Implementing this is possible, but probably better to >> > > >> > >> do it after moving the existing arch-specific CPU model >> > > >> > >> enumeration hooks to common code (currently we duplicate lots of >> > > >> > >> CPU enumeration/lookup boilerplate code that we shouldn't have >> > > >> > >> to). >> > > >> > >> >> > > >> > >> Listing only the human-friendly names in the array like in the >> > > >> > >> original patch could be a reasonable temporary solution. It >> > > >> > >> won't allow us to use a single entry for all subclasses of a >> > > >> > >> given type by now (e.g. listing only TYPE_X86_CPU on PC), but at >> > > >> > >> least we can address this issue without waiting for a refactor of >> > > >> > >> the CPU model enumeration code. >> > > >> > >> > > >> > Ah, I just re-read this. Do you mean go back to the original RFC and >> > > >> > just use strcmp() to compare the human readable cpu_model? >> > > >> It's sort of going backwards but I won't object to this as far as you >> > > >> won't use machine->cpu_model (which is in process of being removed) >> > > >> > > Wait, machine->cpu_model is the human readable name. Without using >> > > that we can't use just human readable strings for the valid cpu types. >> > >> > Well, if we want to deprecate machine->cpu_model we need to offer >> > an alternative first, otherwise we can't prevent people from >> > using it. >> > >> > Igor, do you see an (existing) alternative to machine->cpu_model >> > that would allow us to avoid using it in >> > machine_run_board_init()? >> In recently merged refactoring machine->cpu_model is being replaced >> by machine->cpu_type. So currently we don't need machine->cpu_model >> anywhere except machine('none'), and once I refactor that it could >> be dropped completely and after some work on *-user targets we can >> practically get rid of cpu_model notion completely >> (excluding of -cpu option parser). >> >> My dislike of idea is that it's adding back cpumodel strings >> in boards code again (which I've just got rid of). >> >> I hate to say that but it looks like we need more refactoring >> for this series to print cpumodels back to user. >> >> We already have FOO_cpu_list()/FOO_query_cpu_definitions() >> which already do cpu type => cpumodel conversion (and even >> have some code duplication within a target), I'd suggest >> generalizing that across targets and then using generic >> helper for printing back to user converted cpu types from >> mc->valid_cpu_types which this series introduces. > > I agree with the long term goal of making cpu type => cpu model > conversion generic. But until we refactor the arch-specific code > and implement that, we have 2 options: > > 1) Keep printing a confusing error message until we implement cpu > type => cpu model conversion; > 2) Keep the MachineState::cpu_model field until we implement cpu > type => cpu model conversion. > > I don't see any reason to pick (1) instead of (2). Ok, I'm going over this again (sorry for the delay). I'm going to respin using machine->cpu_model. It shouldn't be hard to refactor in the future to machine->cpu_type, once that is or can be translated to a user friendly string. Alistair > > -- > Eduardo > ^ permalink raw reply [flat|nested] 20+ messages in thread
end of thread, other threads:[~2018-02-01 23:23 UTC | newest] Thread overview: 20+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-12-20 0:27 [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 1/5] netduino2: Specify the valid CPUs Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 2/5] bcm2836: Use the Cortex-A7 instead of Cortex-A15 Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 3/5] raspi: Specify the valid CPUs Alistair Francis 2017-12-20 0:27 ` [Qemu-devel] [PATCH v4 4/5] xlnx-zcu102: " Alistair Francis 2017-12-20 0:28 ` [Qemu-devel] [PATCH v4 5/5] xilinx_zynq: " Alistair Francis 2017-12-20 0:43 ` [Qemu-devel] [PATCH v4 0/5] Add a valid_cpu_types property Peter Maydell 2017-12-20 0:55 ` Alistair Francis 2017-12-20 1:03 ` Alistair Francis 2017-12-20 22:06 ` Eduardo Habkost 2017-12-22 18:45 ` Alistair Francis 2017-12-22 19:47 ` Alistair Francis 2017-12-22 21:26 ` Eduardo Habkost 2017-12-28 13:39 ` Igor Mammedov 2017-12-28 14:59 ` Eduardo Habkost 2018-01-10 21:30 ` Alistair Francis 2018-01-10 21:48 ` Eduardo Habkost 2018-01-11 10:25 ` Igor Mammedov 2018-01-11 12:58 ` Eduardo Habkost 2018-02-01 23:21 ` Alistair Francis
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).