diff mbox series

[Xen-devel,v3,16/17] xen/arm: vpsci: Introduce and use PSCI_INVALID_ADDRESS

Message ID 20180215150248.28922-17-julien.grall@arm.com
State Superseded
Headers show
Series xen/arm: PSCI 1.1 and SMCCC-1.1 support and XSA-254 variant 2 update | expand

Commit Message

Julien Grall Feb. 15, 2018, 3:02 p.m. UTC
PSCI 1.0 added the error return PSCI_INVALID_ADDRESS. It is used to
indicate the entry point address is known to be invalid.

In Xen case, this error could be returned when a 64-bit vCPU is using a
Thumb entry address.

For PSCI 0.1 implementation, return PSCI_INVALID_PARAMETERS instead.

Suggested-by: mirela.simonovic@aggios.com
Signed-off-by: Julien Grall <julien.grall@arm.com>
Cc: mirela.simonovic@aggios.com

---
    Changes in v3:
        - Patch added
---
 xen/arch/arm/vpsci.c       | 10 +++++++---
 xen/include/asm-arm/psci.h |  1 +
 2 files changed, 8 insertions(+), 3 deletions(-)

Comments

Stefano Stabellini Feb. 21, 2018, 12:53 a.m. UTC | #1
On Thu, 15 Feb 2018, Julien Grall wrote:
> PSCI 1.0 added the error return PSCI_INVALID_ADDRESS. It is used to
> indicate the entry point address is known to be invalid.
> 
> In Xen case, this error could be returned when a 64-bit vCPU is using a
> Thumb entry address.
> 
> For PSCI 0.1 implementation, return PSCI_INVALID_PARAMETERS instead.
> 
> Suggested-by: mirela.simonovic@aggios.com
> Signed-off-by: Julien Grall <julien.grall@arm.com>
> Cc: mirela.simonovic@aggios.com

Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>


> ---
>     Changes in v3:
>         - Patch added
> ---
>  xen/arch/arm/vpsci.c       | 10 +++++++---
>  xen/include/asm-arm/psci.h |  1 +
>  2 files changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c
> index 9a082aa6ee..1729f7071e 100644
> --- a/xen/arch/arm/vpsci.c
> +++ b/xen/arch/arm/vpsci.c
> @@ -38,7 +38,7 @@ static int do_common_cpu_on(register_t target_cpu, register_t entry_point,
>  
>      /* THUMB set is not allowed with 64-bit domain */
>      if ( is_64bit_domain(d) && is_thumb )
> -        return PSCI_INVALID_PARAMETERS;
> +        return PSCI_INVALID_ADDRESS;
>  
>      if ( !test_bit(_VPF_down, &v->pause_flags) )
>          return PSCI_ALREADY_ON;
> @@ -99,10 +99,14 @@ static int32_t do_psci_cpu_on(uint32_t vcpuid, register_t entry_point)
>  
>      ret = do_common_cpu_on(vcpuid, entry_point, 0);
>      /*
> -     * PSCI 0.1 does not define the return code PSCI_ALREADY_ON.
> +     * PSCI 0.1 does not define the return codes PSCI_ALREADY_ON and
> +     * PSCI_INVALID_ADDRESS.
>       * Instead, return PSCI_INVALID_PARAMETERS.
>       */
> -    return (ret == PSCI_ALREADY_ON) ? PSCI_INVALID_PARAMETERS : ret;
> +    if ( ret == PSCI_ALREADY_ON || ret == PSCI_INVALID_ADDRESS )
> +        ret = PSCI_INVALID_PARAMETERS;
> +
> +    return ret;
>  }
>  
>  static int32_t do_psci_cpu_off(uint32_t power_state)
> diff --git a/xen/include/asm-arm/psci.h b/xen/include/asm-arm/psci.h
> index e2629eed01..9ac820e94a 100644
> --- a/xen/include/asm-arm/psci.h
> +++ b/xen/include/asm-arm/psci.h
> @@ -13,6 +13,7 @@
>  #define PSCI_INTERNAL_FAILURE       -6
>  #define PSCI_NOT_PRESENT            -7
>  #define PSCI_DISABLED               -8
> +#define PSCI_INVALID_ADDRESS        -9
>  
>  /* availability of PSCI on the host for SMP bringup */
>  extern uint32_t psci_ver;
> -- 
> 2.11.0
>
diff mbox series

Patch

diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c
index 9a082aa6ee..1729f7071e 100644
--- a/xen/arch/arm/vpsci.c
+++ b/xen/arch/arm/vpsci.c
@@ -38,7 +38,7 @@  static int do_common_cpu_on(register_t target_cpu, register_t entry_point,
 
     /* THUMB set is not allowed with 64-bit domain */
     if ( is_64bit_domain(d) && is_thumb )
-        return PSCI_INVALID_PARAMETERS;
+        return PSCI_INVALID_ADDRESS;
 
     if ( !test_bit(_VPF_down, &v->pause_flags) )
         return PSCI_ALREADY_ON;
@@ -99,10 +99,14 @@  static int32_t do_psci_cpu_on(uint32_t vcpuid, register_t entry_point)
 
     ret = do_common_cpu_on(vcpuid, entry_point, 0);
     /*
-     * PSCI 0.1 does not define the return code PSCI_ALREADY_ON.
+     * PSCI 0.1 does not define the return codes PSCI_ALREADY_ON and
+     * PSCI_INVALID_ADDRESS.
      * Instead, return PSCI_INVALID_PARAMETERS.
      */
-    return (ret == PSCI_ALREADY_ON) ? PSCI_INVALID_PARAMETERS : ret;
+    if ( ret == PSCI_ALREADY_ON || ret == PSCI_INVALID_ADDRESS )
+        ret = PSCI_INVALID_PARAMETERS;
+
+    return ret;
 }
 
 static int32_t do_psci_cpu_off(uint32_t power_state)
diff --git a/xen/include/asm-arm/psci.h b/xen/include/asm-arm/psci.h
index e2629eed01..9ac820e94a 100644
--- a/xen/include/asm-arm/psci.h
+++ b/xen/include/asm-arm/psci.h
@@ -13,6 +13,7 @@ 
 #define PSCI_INTERNAL_FAILURE       -6
 #define PSCI_NOT_PRESENT            -7
 #define PSCI_DISABLED               -8
+#define PSCI_INVALID_ADDRESS        -9
 
 /* availability of PSCI on the host for SMP bringup */
 extern uint32_t psci_ver;