[Xen-devel,v2,03/15] xen/arm: vsmc: Implement SMCCC 1.1

Message ID 20180208192203.9556-4-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
Related show

Commit Message

Julien Grall Feb. 8, 2018, 7:21 p.m.
The new SMC Calling Convention (v1.1) allows for a reduced overhead when
calling into the firmware, and provides a new feature discovery
mechanism. See "Firmware interfaces for mitigating CVE-2017-5715"
ARM DEN 00070A.

Signed-off-by: Julien Grall <julien.grall@arm.com>

---
    Changes in v2:
        - Add a humand readable name for the specification
---
 xen/arch/arm/vpsci.c        |  1 +
 xen/arch/arm/vsmc.c         | 23 +++++++++++++++++++++++
 xen/include/asm-arm/smccc.h | 15 +++++++++++++++
 3 files changed, 39 insertions(+)

Comments

Volodymyr Babchuk Feb. 9, 2018, 4:08 p.m. | #1
Hi,

On 08.02.18 21:21, Julien Grall wrote:
> The new SMC Calling Convention (v1.1) allows for a reduced overhead
> when calling into the firmware, and provides a new feature discovery 
> mechanism. See "Firmware interfaces for mitigating CVE-2017-5715" ARM
> DEN 00070A.
> 
> Signed-off-by: Julien Grall <julien.grall@arm.com>
Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>

> --- Changes in v2: - Add a humand readable name for the
> specification --- xen/arch/arm/vpsci.c        |  1 + 
> xen/arch/arm/vsmc.c         | 23 +++++++++++++++++++++++ 
> xen/include/asm-arm/smccc.h | 15 +++++++++++++++ 3 files changed, 39
> insertions(+)
> 
> diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c index
> e82b62db1a..19ee7caeb4 100644 --- a/xen/arch/arm/vpsci.c +++
> b/xen/arch/arm/vpsci.c @@ -212,6 +212,7 @@ static int32_t
> do_psci_1_0_features(uint32_t psci_func_id) case
> PSCI_0_2_FN32_SYSTEM_OFF: case PSCI_0_2_FN32_SYSTEM_RESET: case
> PSCI_1_0_FN32_PSCI_FEATURES: +    case ARM_SMCCC_VERSION_FID: return
> 0; default: return PSCI_NOT_SUPPORTED; diff --git
> a/xen/arch/arm/vsmc.c b/xen/arch/arm/vsmc.c index
> 3d3bd95fee..a708aa5e81 100644 --- a/xen/arch/arm/vsmc.c +++
> b/xen/arch/arm/vsmc.c @@ -81,6 +81,26 @@ static bool
> fill_function_call_count(struct cpu_user_regs *regs, uint32_t cnt) 
> return true; }
> 
> +/* SMCCC interface for ARM Architecture */ +static bool
> handle_arch(struct cpu_user_regs *regs) +{ +    uint32_t fid =
> (uint32_t)get_user_reg(regs, 0); + +    switch ( fid ) +    { +
> case ARM_SMCCC_VERSION_FID: +        set_user_reg(regs, 0,
> ARM_SMCCC_VERSION_1_1); +        return true; + +    case
> ARM_SMCCC_ARCH_FEATURES_FID: +        /* Nothing supported yet */ +
> set_user_reg(regs, 0, -1); +        return true; +    } + +    return
> false; +} + /* SMCCC interface for hypervisor. Tell about itself. */ 
> static bool handle_hypervisor(struct cpu_user_regs *regs) { @@ -188,6
> +208,9 @@ static bool vsmccc_handle_call(struct cpu_user_regs *regs) 
> { switch ( smccc_get_owner(funcid) ) { +        case
> ARM_SMCCC_OWNER_ARCH: +            handled = handle_arch(regs); +
> break; case ARM_SMCCC_OWNER_HYPERVISOR: handled =
> handle_hypervisor(regs); break; diff --git
> a/xen/include/asm-arm/smccc.h b/xen/include/asm-arm/smccc.h index
> 62b3a8cdf5..431389c118 100644 --- a/xen/include/asm-arm/smccc.h +++
> b/xen/include/asm-arm/smccc.h @@ -16,6 +16,9 @@ #ifndef
> __ASM_ARM_SMCCC_H__ #define __ASM_ARM_SMCCC_H__
> 
> +#define ARM_SMCCC_VERSION_1_0   0x10000 +#define
> ARM_SMCCC_VERSION_1_1   0x10001 + /* * This file provides common
> defines for ARM SMC Calling Convention as * specified in @@ -100,6
> +103,18 @@ static inline uint32_t smccc_get_owner(register_t funcid) 
> ARM_SMCCC_OWNER_##owner,     \ 0xFF03)
> 
> +#define ARM_SMCCC_VERSION_FID                       \ +
> ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \ +
> ARM_SMCCC_CONV_32,           \ +
> ARM_SMCCC_OWNER_ARCH,        \ +                       0x0)
> \ + +#define ARM_SMCCC_ARCH_FEATURES_FID                 \ +
> ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \ +
> ARM_SMCCC_CONV_32,           \ +
> ARM_SMCCC_OWNER_ARCH,        \ +                       0x1) + /* Only
> one error code defined in SMCCC */ #define
> ARM_SMCCC_ERR_UNKNOWN_FUNCTION  (-1)
> 
>
Julien Grall Feb. 9, 2018, 4:15 p.m. | #2
On 02/09/2018 04:08 PM, Volodymyr Babchuk wrote:
> Hi,

Hi Volodymyr,

Thank you for the review. I have noticed that your e-mail client seem to 
mess up with the e-mail sent sometimes (see below). You may want to 
configure it to avoid that.

Cheers,

> On 08.02.18 21:21, Julien Grall wrote:
>> The new SMC Calling Convention (v1.1) allows for a reduced overhead
>> when calling into the firmware, and provides a new feature discovery 
>> mechanism. See "Firmware interfaces for mitigating CVE-2017-5715" ARM
>> DEN 00070A.
>>
>> Signed-off-by: Julien Grall <julien.grall@arm.com>
> Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
> 
>> --- Changes in v2: - Add a humand readable name for the
>> specification --- xen/arch/arm/vpsci.c        |  1 + 
>> xen/arch/arm/vsmc.c         | 23 +++++++++++++++++++++++ 
>> xen/include/asm-arm/smccc.h | 15 +++++++++++++++ 3 files changed, 39
>> insertions(+)
>>
>> diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c index
>> e82b62db1a..19ee7caeb4 100644 --- a/xen/arch/arm/vpsci.c +++
>> b/xen/arch/arm/vpsci.c @@ -212,6 +212,7 @@ static int32_t
>> do_psci_1_0_features(uint32_t psci_func_id) case
>> PSCI_0_2_FN32_SYSTEM_OFF: case PSCI_0_2_FN32_SYSTEM_RESET: case
>> PSCI_1_0_FN32_PSCI_FEATURES: +    case ARM_SMCCC_VERSION_FID: return
>> 0; default: return PSCI_NOT_SUPPORTED; diff --git
>> a/xen/arch/arm/vsmc.c b/xen/arch/arm/vsmc.c index
>> 3d3bd95fee..a708aa5e81 100644 --- a/xen/arch/arm/vsmc.c +++
>> b/xen/arch/arm/vsmc.c @@ -81,6 +81,26 @@ static bool
>> fill_function_call_count(struct cpu_user_regs *regs, uint32_t cnt) 
>> return true; }
>>
>> +/* SMCCC interface for ARM Architecture */ +static bool
>> handle_arch(struct cpu_user_regs *regs) +{ +    uint32_t fid =
>> (uint32_t)get_user_reg(regs, 0); + +    switch ( fid ) +    { +
>> case ARM_SMCCC_VERSION_FID: +        set_user_reg(regs, 0,
>> ARM_SMCCC_VERSION_1_1); +        return true; + +    case
>> ARM_SMCCC_ARCH_FEATURES_FID: +        /* Nothing supported yet */ +
>> set_user_reg(regs, 0, -1); +        return true; +    } + +    return
>> false; +} + /* SMCCC interface for hypervisor. Tell about itself. */ 
>> static bool handle_hypervisor(struct cpu_user_regs *regs) { @@ -188,6
>> +208,9 @@ static bool vsmccc_handle_call(struct cpu_user_regs *regs) { 
>> switch ( smccc_get_owner(funcid) ) { +        case
>> ARM_SMCCC_OWNER_ARCH: +            handled = handle_arch(regs); +
>> break; case ARM_SMCCC_OWNER_HYPERVISOR: handled =
>> handle_hypervisor(regs); break; diff --git
>> a/xen/include/asm-arm/smccc.h b/xen/include/asm-arm/smccc.h index
>> 62b3a8cdf5..431389c118 100644 --- a/xen/include/asm-arm/smccc.h +++
>> b/xen/include/asm-arm/smccc.h @@ -16,6 +16,9 @@ #ifndef
>> __ASM_ARM_SMCCC_H__ #define __ASM_ARM_SMCCC_H__
>>
>> +#define ARM_SMCCC_VERSION_1_0   0x10000 +#define
>> ARM_SMCCC_VERSION_1_1   0x10001 + /* * This file provides common
>> defines for ARM SMC Calling Convention as * specified in @@ -100,6
>> +103,18 @@ static inline uint32_t smccc_get_owner(register_t funcid) 
>> ARM_SMCCC_OWNER_##owner,     \ 0xFF03)
>>
>> +#define ARM_SMCCC_VERSION_FID                       \ +
>> ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \ +
>> ARM_SMCCC_CONV_32,           \ +
>> ARM_SMCCC_OWNER_ARCH,        \ +                       0x0)
>> \ + +#define ARM_SMCCC_ARCH_FEATURES_FID                 \ +
>> ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \ +
>> ARM_SMCCC_CONV_32,           \ +
>> ARM_SMCCC_OWNER_ARCH,        \ +                       0x1) + /* Only
>> one error code defined in SMCCC */ #define
>> ARM_SMCCC_ERR_UNKNOWN_FUNCTION  (-1)
>>
>>
>
Volodymyr Babchuk Feb. 9, 2018, 4:47 p.m. | #3
On 09.02.18 18:15, Julien Grall wrote:
> 
> 
> On 02/09/2018 04:08 PM, Volodymyr Babchuk wrote:
>> Hi,
> 
> Hi Volodymyr,
> 
> Thank you for the review. I have noticed that your e-mail client seem to 
> mess up with the e-mail sent sometimes (see below). You may want to 
> configure it to avoid that.
Oops, sorry for this. Looks like I hit CTRL+R in Thunderbird accidentally.

>> On 08.02.18 21:21, Julien Grall wrote:
>>> The new SMC Calling Convention (v1.1) allows for a reduced overhead
>>> when calling into the firmware, and provides a new feature discovery 
>>> mechanism. See "Firmware interfaces for mitigating CVE-2017-5715" ARM
>>> DEN 00070A.
>>>
>>> Signed-off-by: Julien Grall <julien.grall@arm.com>
>> Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@epam.com>
>>
>>> --- Changes in v2: - Add a humand readable name for the
>>> specification --- xen/arch/arm/vpsci.c        |  1 + 
>>> xen/arch/arm/vsmc.c         | 23 +++++++++++++++++++++++ 
>>> xen/include/asm-arm/smccc.h | 15 +++++++++++++++ 3 files changed, 39
>>> insertions(+)
>>>
>>> diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c index
>>> e82b62db1a..19ee7caeb4 100644 --- a/xen/arch/arm/vpsci.c +++
>>> b/xen/arch/arm/vpsci.c @@ -212,6 +212,7 @@ static int32_t
>>> do_psci_1_0_features(uint32_t psci_func_id) case
>>> PSCI_0_2_FN32_SYSTEM_OFF: case PSCI_0_2_FN32_SYSTEM_RESET: case
>>> PSCI_1_0_FN32_PSCI_FEATURES: +    case ARM_SMCCC_VERSION_FID: return
>>> 0; default: return PSCI_NOT_SUPPORTED; diff --git
>>> a/xen/arch/arm/vsmc.c b/xen/arch/arm/vsmc.c index
>>> 3d3bd95fee..a708aa5e81 100644 --- a/xen/arch/arm/vsmc.c +++
>>> b/xen/arch/arm/vsmc.c @@ -81,6 +81,26 @@ static bool
>>> fill_function_call_count(struct cpu_user_regs *regs, uint32_t cnt) 
>>> return true; }
>>>
>>> +/* SMCCC interface for ARM Architecture */ +static bool
>>> handle_arch(struct cpu_user_regs *regs) +{ +    uint32_t fid =
>>> (uint32_t)get_user_reg(regs, 0); + +    switch ( fid ) +    { +
>>> case ARM_SMCCC_VERSION_FID: +        set_user_reg(regs, 0,
>>> ARM_SMCCC_VERSION_1_1); +        return true; + +    case
>>> ARM_SMCCC_ARCH_FEATURES_FID: +        /* Nothing supported yet */ +
>>> set_user_reg(regs, 0, -1); +        return true; +    } + +    return
>>> false; +} + /* SMCCC interface for hypervisor. Tell about itself. */ 
>>> static bool handle_hypervisor(struct cpu_user_regs *regs) { @@ -188,6
>>> +208,9 @@ static bool vsmccc_handle_call(struct cpu_user_regs *regs) 
>>> { switch ( smccc_get_owner(funcid) ) { +        case
>>> ARM_SMCCC_OWNER_ARCH: +            handled = handle_arch(regs); +
>>> break; case ARM_SMCCC_OWNER_HYPERVISOR: handled =
>>> handle_hypervisor(regs); break; diff --git
>>> a/xen/include/asm-arm/smccc.h b/xen/include/asm-arm/smccc.h index
>>> 62b3a8cdf5..431389c118 100644 --- a/xen/include/asm-arm/smccc.h +++
>>> b/xen/include/asm-arm/smccc.h @@ -16,6 +16,9 @@ #ifndef
>>> __ASM_ARM_SMCCC_H__ #define __ASM_ARM_SMCCC_H__
>>>
>>> +#define ARM_SMCCC_VERSION_1_0   0x10000 +#define
>>> ARM_SMCCC_VERSION_1_1   0x10001 + /* * This file provides common
>>> defines for ARM SMC Calling Convention as * specified in @@ -100,6
>>> +103,18 @@ static inline uint32_t smccc_get_owner(register_t funcid) 
>>> ARM_SMCCC_OWNER_##owner,     \ 0xFF03)
>>>
>>> +#define ARM_SMCCC_VERSION_FID                       \ +
>>> ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \ +
>>> ARM_SMCCC_CONV_32,           \ +
>>> ARM_SMCCC_OWNER_ARCH,        \ +                       0x0)
>>> \ + +#define ARM_SMCCC_ARCH_FEATURES_FID                 \ +
>>> ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \ +
>>> ARM_SMCCC_CONV_32,           \ +
>>> ARM_SMCCC_OWNER_ARCH,        \ +                       0x1) + /* Only
>>> one error code defined in SMCCC */ #define
>>> ARM_SMCCC_ERR_UNKNOWN_FUNCTION  (-1)
>>>
>>>
>>
>

Patch

diff --git a/xen/arch/arm/vpsci.c b/xen/arch/arm/vpsci.c
index e82b62db1a..19ee7caeb4 100644
--- a/xen/arch/arm/vpsci.c
+++ b/xen/arch/arm/vpsci.c
@@ -212,6 +212,7 @@  static int32_t do_psci_1_0_features(uint32_t psci_func_id)
     case PSCI_0_2_FN32_SYSTEM_OFF:
     case PSCI_0_2_FN32_SYSTEM_RESET:
     case PSCI_1_0_FN32_PSCI_FEATURES:
+    case ARM_SMCCC_VERSION_FID:
         return 0;
     default:
         return PSCI_NOT_SUPPORTED;
diff --git a/xen/arch/arm/vsmc.c b/xen/arch/arm/vsmc.c
index 3d3bd95fee..a708aa5e81 100644
--- a/xen/arch/arm/vsmc.c
+++ b/xen/arch/arm/vsmc.c
@@ -81,6 +81,26 @@  static bool fill_function_call_count(struct cpu_user_regs *regs, uint32_t cnt)
     return true;
 }
 
+/* SMCCC interface for ARM Architecture */
+static bool handle_arch(struct cpu_user_regs *regs)
+{
+    uint32_t fid = (uint32_t)get_user_reg(regs, 0);
+
+    switch ( fid )
+    {
+    case ARM_SMCCC_VERSION_FID:
+        set_user_reg(regs, 0, ARM_SMCCC_VERSION_1_1);
+        return true;
+
+    case ARM_SMCCC_ARCH_FEATURES_FID:
+        /* Nothing supported yet */
+        set_user_reg(regs, 0, -1);
+        return true;
+    }
+
+    return false;
+}
+
 /* SMCCC interface for hypervisor. Tell about itself. */
 static bool handle_hypervisor(struct cpu_user_regs *regs)
 {
@@ -188,6 +208,9 @@  static bool vsmccc_handle_call(struct cpu_user_regs *regs)
     {
         switch ( smccc_get_owner(funcid) )
         {
+        case ARM_SMCCC_OWNER_ARCH:
+            handled = handle_arch(regs);
+            break;
         case ARM_SMCCC_OWNER_HYPERVISOR:
             handled = handle_hypervisor(regs);
             break;
diff --git a/xen/include/asm-arm/smccc.h b/xen/include/asm-arm/smccc.h
index 62b3a8cdf5..431389c118 100644
--- a/xen/include/asm-arm/smccc.h
+++ b/xen/include/asm-arm/smccc.h
@@ -16,6 +16,9 @@ 
 #ifndef __ASM_ARM_SMCCC_H__
 #define __ASM_ARM_SMCCC_H__
 
+#define ARM_SMCCC_VERSION_1_0   0x10000
+#define ARM_SMCCC_VERSION_1_1   0x10001
+
 /*
  * This file provides common defines for ARM SMC Calling Convention as
  * specified in
@@ -100,6 +103,18 @@  static inline uint32_t smccc_get_owner(register_t funcid)
                        ARM_SMCCC_OWNER_##owner,     \
                        0xFF03)
 
+#define ARM_SMCCC_VERSION_FID                       \
+    ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \
+                       ARM_SMCCC_CONV_32,           \
+                       ARM_SMCCC_OWNER_ARCH,        \
+                       0x0)                         \
+
+#define ARM_SMCCC_ARCH_FEATURES_FID                 \
+    ARM_SMCCC_CALL_VAL(ARM_SMCCC_FAST_CALL,         \
+                       ARM_SMCCC_CONV_32,           \
+                       ARM_SMCCC_OWNER_ARCH,        \
+                       0x1)
+
 /* Only one error code defined in SMCCC */
 #define ARM_SMCCC_ERR_UNKNOWN_FUNCTION  (-1)