[Qemu-devel] [PATCH v3 6/6] hw/arm/virt: Support -machine gic-version=max

Peter Maydell posted 6 patches 7 years, 11 months ago
[Qemu-devel] [PATCH v3 6/6] hw/arm/virt: Support -machine gic-version=max
Posted by Peter Maydell 7 years, 11 months ago
Add support for passing 'max' to -machine gic-version. By analogy
with the -cpu max option, this picks the "best available" GIC version
whether you're using KVM or TCG, so it behaves like 'host' when
using KVM, and gives you GICv3 when using TCG.

Also like '-cpu host', using -machine gic-version=max' means there
is no guarantee of migration compatibility between QEMU versions;
in future 'max' might mean '4'.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 hw/arm/virt.c | 29 +++++++++++++++++++----------
 1 file changed, 19 insertions(+), 10 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index cda4b83586..2c07245047 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -1207,16 +1207,23 @@ static void machvirt_init(MachineState *machine)
     /* We can probe only here because during property set
      * KVM is not available yet
      */
-    if (!vms->gic_version) {
+    if (vms->gic_version <= 0) {
+        /* "host" or "max" */
         if (!kvm_enabled()) {
-            error_report("gic-version=host requires KVM");
-            exit(1);
-        }
-
-        vms->gic_version = kvm_arm_vgic_probe();
-        if (!vms->gic_version) {
-            error_report("Unable to determine GIC version supported by host");
-            exit(1);
+            if (vms->gic_version == 0) {
+                error_report("gic-version=host requires KVM");
+                exit(1);
+            } else {
+                /* "max": currently means 3 for TCG */
+                vms->gic_version = 3;
+            }
+        } else {
+            vms->gic_version = kvm_arm_vgic_probe();
+            if (!vms->gic_version) {
+                error_report(
+                    "Unable to determine GIC version supported by host");
+                exit(1);
+            }
         }
     }
 
@@ -1480,9 +1487,11 @@ static void virt_set_gic_version(Object *obj, const char *value, Error **errp)
         vms->gic_version = 2;
     } else if (!strcmp(value, "host")) {
         vms->gic_version = 0; /* Will probe later */
+    } else if (!strcmp(value, "max")) {
+        vms->gic_version = -1; /* Will probe later */
     } else {
         error_setg(errp, "Invalid gic-version value");
-        error_append_hint(errp, "Valid values are 3, 2, host.\n");
+        error_append_hint(errp, "Valid values are 3, 2, host, max.\n");
     }
 }
 
-- 
2.16.2


Re: [Qemu-devel] [PATCH v3 6/6] hw/arm/virt: Support -machine gic-version=max
Posted by Alex Bennée 7 years, 11 months ago
Peter Maydell <peter.maydell@linaro.org> writes:

> Add support for passing 'max' to -machine gic-version. By analogy
> with the -cpu max option, this picks the "best available" GIC version
> whether you're using KVM or TCG, so it behaves like 'host' when
> using KVM, and gives you GICv3 when using TCG.
>
> Also like '-cpu host', using -machine gic-version=max' means there
> is no guarantee of migration compatibility between QEMU versions;
> in future 'max' might mean '4'.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
>  hw/arm/virt.c | 29 +++++++++++++++++++----------
>  1 file changed, 19 insertions(+), 10 deletions(-)
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index cda4b83586..2c07245047 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -1207,16 +1207,23 @@ static void machvirt_init(MachineState *machine)
>      /* We can probe only here because during property set
>       * KVM is not available yet
>       */
> -    if (!vms->gic_version) {
> +    if (vms->gic_version <= 0) {
> +        /* "host" or "max" */
>          if (!kvm_enabled()) {
> -            error_report("gic-version=host requires KVM");
> -            exit(1);
> -        }
> -
> -        vms->gic_version = kvm_arm_vgic_probe();
> -        if (!vms->gic_version) {
> -            error_report("Unable to determine GIC version supported by host");
> -            exit(1);
> +            if (vms->gic_version == 0) {
> +                error_report("gic-version=host requires KVM");
> +                exit(1);
> +            } else {
> +                /* "max": currently means 3 for TCG */
> +                vms->gic_version = 3;
> +            }
> +        } else {
> +            vms->gic_version = kvm_arm_vgic_probe();
> +            if (!vms->gic_version) {
> +                error_report(
> +                    "Unable to determine GIC version supported by host");
> +                exit(1);
> +            }
>          }
>      }
>
> @@ -1480,9 +1487,11 @@ static void virt_set_gic_version(Object *obj, const char *value, Error **errp)
>          vms->gic_version = 2;
>      } else if (!strcmp(value, "host")) {
>          vms->gic_version = 0; /* Will probe later */
> +    } else if (!strcmp(value, "max")) {
> +        vms->gic_version = -1; /* Will probe later */
>      } else {
>          error_setg(errp, "Invalid gic-version value");
> -        error_append_hint(errp, "Valid values are 3, 2, host.\n");
> +        error_append_hint(errp, "Valid values are 3, 2, host,
> max.\n");

nit: host is only valid on aarch64 host. However it will fail later on
with:

  qemu-system-aarch64: gic-version=host requires KVM

Anyway:

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>

--
Alex Bennée

Re: [Qemu-devel] [PATCH v3 6/6] hw/arm/virt: Support -machine gic-version=max
Posted by Peter Maydell 7 years, 11 months ago
On 9 March 2018 at 13:50, Alex Bennée <alex.bennee@linaro.org> wrote:
>
> Peter Maydell <peter.maydell@linaro.org> writes:
>> @@ -1480,9 +1487,11 @@ static void virt_set_gic_version(Object *obj, const char *value, Error **errp)
>>          vms->gic_version = 2;
>>      } else if (!strcmp(value, "host")) {
>>          vms->gic_version = 0; /* Will probe later */
>> +    } else if (!strcmp(value, "max")) {
>> +        vms->gic_version = -1; /* Will probe later */
>>      } else {
>>          error_setg(errp, "Invalid gic-version value");
>> -        error_append_hint(errp, "Valid values are 3, 2, host.\n");
>> +        error_append_hint(errp, "Valid values are 3, 2, host,
>> max.\n");
>
> nit: host is only valid on aarch64 host. However it will fail later on
> with:
>
>   qemu-system-aarch64: gic-version=host requires KVM

'host' was already in this string. It's valid in the sense that
it's not a syntax error, though it won't work in all situations.
(Similarly, if you try '3' and you have KVM enabled and a gicv2
host system you'll get an error.)

thanks
-- PMM