From 4caef42a94b4efe97b09764a7257f701ab7ff3b8 Mon Sep 17 00:00:00 2001 From: Arvind Ram Prakash Date: Mon, 16 Sep 2024 16:57:33 -0500 Subject: [PATCH] fix(security): add support in cpu_ops for CVE-2024-7881 This patch adds new cpu ops function extra4 and a new macro for CVE-2024-7881 [1]. This new macro declare_cpu_ops_wa_4 allows support for new CVE check function. [1]: https://developer.arm.com/Arm%20Security%20Center/Arm%20CPU%20Vulnerability%20CVE-2024-7881 Signed-off-by: Arvind Ram Prakash Change-Id: I417389f040c6ead7f96f9b720d29061833f43d37 --- include/lib/cpus/aarch64/cpu_macros.S | 21 +++++++++++++++++---- include/lib/cpus/cpu_ops.h | 8 ++++++-- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/include/lib/cpus/aarch64/cpu_macros.S b/include/lib/cpus/aarch64/cpu_macros.S index 5e9293447..0ce9c3cbc 100644 --- a/include/lib/cpus/aarch64/cpu_macros.S +++ b/include/lib/cpus/aarch64/cpu_macros.S @@ -63,6 +63,10 @@ * This is a placeholder for future per CPU operations. Currently, * some CPUs use this entry to set a test function to determine if * the workaround for CVE-2022-23960 needs to be applied or not. + * _extra4: + * This is a placeholder for future per CPU operations. Currently, + * some CPUs use this entry to set a test function to determine if + * the workaround for CVE-2024-7881 needs to be applied or not. * _e_handler: * This is a placeholder for future per CPU exception handlers. * _power_down_ops: @@ -75,7 +79,8 @@ * used to handle power down at subsequent levels */ .macro declare_cpu_ops_base _name:req, _midr:req, _resetfunc:req, \ - _extra1:req, _extra2:req, _extra3:req, _e_handler:req, _power_down_ops:vararg + _extra1:req, _extra2:req, _extra3:req, _extra4:req, \ + _e_handler:req, _power_down_ops:vararg .section .cpu_ops, "a" .align 3 .type cpu_ops_\_name, %object @@ -86,6 +91,7 @@ .quad \_extra1 .quad \_extra2 .quad \_extra3 + .quad \_extra4 .quad \_e_handler #ifdef IMAGE_BL31 /* Insert list of functions */ @@ -148,21 +154,28 @@ .macro declare_cpu_ops _name:req, _midr:req, _resetfunc:req, \ _power_down_ops:vararg - declare_cpu_ops_base \_name, \_midr, \_resetfunc, 0, 0, 0, 0, \ + declare_cpu_ops_base \_name, \_midr, \_resetfunc, 0, 0, 0, 0, 0, \ \_power_down_ops .endm .macro declare_cpu_ops_eh _name:req, _midr:req, _resetfunc:req, \ _e_handler:req, _power_down_ops:vararg declare_cpu_ops_base \_name, \_midr, \_resetfunc, \ - 0, 0, 0, \_e_handler, \_power_down_ops + 0, 0, 0, 0, \_e_handler, \_power_down_ops .endm .macro declare_cpu_ops_wa _name:req, _midr:req, \ _resetfunc:req, _extra1:req, _extra2:req, \ _extra3:req, _power_down_ops:vararg declare_cpu_ops_base \_name, \_midr, \_resetfunc, \ - \_extra1, \_extra2, \_extra3, 0, \_power_down_ops + \_extra1, \_extra2, \_extra3, 0, 0, \_power_down_ops + .endm + + .macro declare_cpu_ops_wa_4 _name:req, _midr:req, \ + _resetfunc:req, _extra1:req, _extra2:req, \ + _extra3:req, _extra4:req, _power_down_ops:vararg + declare_cpu_ops_base \_name, \_midr, \_resetfunc, \ + \_extra1, \_extra2, \_extra3, \_extra4, 0, \_power_down_ops .endm /* diff --git a/include/lib/cpus/cpu_ops.h b/include/lib/cpus/cpu_ops.h index 0084189b5..c1bdf8d01 100644 --- a/include/lib/cpus/cpu_ops.h +++ b/include/lib/cpus/cpu_ops.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023-2024, Arm Limited and Contributors. All rights reserved. + * Copyright (c) 2023-2025, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ @@ -28,6 +28,7 @@ #define CPU_NO_EXTRA1_FUNC 0 #define CPU_NO_EXTRA2_FUNC 0 #define CPU_NO_EXTRA3_FUNC 0 +#define CPU_NO_EXTRA4_FUNC 0 #endif /* __aarch64__ */ @@ -45,6 +46,7 @@ #define CPU_EXTRA1_FUNC_SIZE CPU_WORD_SIZE #define CPU_EXTRA2_FUNC_SIZE CPU_WORD_SIZE #define CPU_EXTRA3_FUNC_SIZE CPU_WORD_SIZE +#define CPU_EXTRA4_FUNC_SIZE CPU_WORD_SIZE #define CPU_E_HANDLER_FUNC_SIZE CPU_WORD_SIZE /* The power down core and cluster is needed only in BL31 and BL32 */ #if defined(IMAGE_BL31) || defined(IMAGE_BL32) @@ -89,7 +91,8 @@ #define CPU_EXTRA1_FUNC CPU_RESET_FUNC + CPU_RESET_FUNC_SIZE #define CPU_EXTRA2_FUNC CPU_EXTRA1_FUNC + CPU_EXTRA1_FUNC_SIZE #define CPU_EXTRA3_FUNC CPU_EXTRA2_FUNC + CPU_EXTRA2_FUNC_SIZE -#define CPU_E_HANDLER_FUNC CPU_EXTRA3_FUNC + CPU_EXTRA3_FUNC_SIZE +#define CPU_EXTRA4_FUNC CPU_EXTRA3_FUNC + CPU_EXTRA3_FUNC_SIZE +#define CPU_E_HANDLER_FUNC CPU_EXTRA4_FUNC + CPU_EXTRA4_FUNC_SIZE #define CPU_PWR_DWN_OPS CPU_E_HANDLER_FUNC + CPU_E_HANDLER_FUNC_SIZE #else #define CPU_PWR_DWN_OPS CPU_RESET_FUNC + CPU_RESET_FUNC_SIZE @@ -119,6 +122,7 @@ struct cpu_ops { void (*extra1_func)(void); void (*extra2_func)(void); void (*extra3_func)(void); + void (*extra4_func)(void); void (*e_handler_func)(long es); #endif /* __aarch64__ */ #if (defined(IMAGE_BL31) || defined(IMAGE_BL32)) && CPU_MAX_PWR_DWN_OPS