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 <arvind.ramprakash@arm.com>
Change-Id: I417389f040c6ead7f96f9b720d29061833f43d37
This commit is contained in:
Arvind Ram Prakash 2024-09-16 16:57:33 -05:00
parent b0521a164a
commit 4caef42a94
2 changed files with 23 additions and 6 deletions

View file

@ -63,6 +63,10 @@
* This is a placeholder for future per CPU operations. Currently, * This is a placeholder for future per CPU operations. Currently,
* some CPUs use this entry to set a test function to determine if * 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. * 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: * _e_handler:
* This is a placeholder for future per CPU exception handlers. * This is a placeholder for future per CPU exception handlers.
* _power_down_ops: * _power_down_ops:
@ -75,7 +79,8 @@
* used to handle power down at subsequent levels * used to handle power down at subsequent levels
*/ */
.macro declare_cpu_ops_base _name:req, _midr:req, _resetfunc:req, \ .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" .section .cpu_ops, "a"
.align 3 .align 3
.type cpu_ops_\_name, %object .type cpu_ops_\_name, %object
@ -86,6 +91,7 @@
.quad \_extra1 .quad \_extra1
.quad \_extra2 .quad \_extra2
.quad \_extra3 .quad \_extra3
.quad \_extra4
.quad \_e_handler .quad \_e_handler
#ifdef IMAGE_BL31 #ifdef IMAGE_BL31
/* Insert list of functions */ /* Insert list of functions */
@ -148,21 +154,28 @@
.macro declare_cpu_ops _name:req, _midr:req, _resetfunc:req, \ .macro declare_cpu_ops _name:req, _midr:req, _resetfunc:req, \
_power_down_ops:vararg _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 \_power_down_ops
.endm .endm
.macro declare_cpu_ops_eh _name:req, _midr:req, _resetfunc:req, \ .macro declare_cpu_ops_eh _name:req, _midr:req, _resetfunc:req, \
_e_handler:req, _power_down_ops:vararg _e_handler:req, _power_down_ops:vararg
declare_cpu_ops_base \_name, \_midr, \_resetfunc, \ 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 .endm
.macro declare_cpu_ops_wa _name:req, _midr:req, \ .macro declare_cpu_ops_wa _name:req, _midr:req, \
_resetfunc:req, _extra1:req, _extra2:req, \ _resetfunc:req, _extra1:req, _extra2:req, \
_extra3:req, _power_down_ops:vararg _extra3:req, _power_down_ops:vararg
declare_cpu_ops_base \_name, \_midr, \_resetfunc, \ 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 .endm
/* /*

View file

@ -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 * SPDX-License-Identifier: BSD-3-Clause
*/ */
@ -28,6 +28,7 @@
#define CPU_NO_EXTRA1_FUNC 0 #define CPU_NO_EXTRA1_FUNC 0
#define CPU_NO_EXTRA2_FUNC 0 #define CPU_NO_EXTRA2_FUNC 0
#define CPU_NO_EXTRA3_FUNC 0 #define CPU_NO_EXTRA3_FUNC 0
#define CPU_NO_EXTRA4_FUNC 0
#endif /* __aarch64__ */ #endif /* __aarch64__ */
@ -45,6 +46,7 @@
#define CPU_EXTRA1_FUNC_SIZE CPU_WORD_SIZE #define CPU_EXTRA1_FUNC_SIZE CPU_WORD_SIZE
#define CPU_EXTRA2_FUNC_SIZE CPU_WORD_SIZE #define CPU_EXTRA2_FUNC_SIZE CPU_WORD_SIZE
#define CPU_EXTRA3_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 #define CPU_E_HANDLER_FUNC_SIZE CPU_WORD_SIZE
/* The power down core and cluster is needed only in BL31 and BL32 */ /* The power down core and cluster is needed only in BL31 and BL32 */
#if defined(IMAGE_BL31) || defined(IMAGE_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_EXTRA1_FUNC CPU_RESET_FUNC + CPU_RESET_FUNC_SIZE
#define CPU_EXTRA2_FUNC CPU_EXTRA1_FUNC + CPU_EXTRA1_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_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 #define CPU_PWR_DWN_OPS CPU_E_HANDLER_FUNC + CPU_E_HANDLER_FUNC_SIZE
#else #else
#define CPU_PWR_DWN_OPS CPU_RESET_FUNC + CPU_RESET_FUNC_SIZE #define CPU_PWR_DWN_OPS CPU_RESET_FUNC + CPU_RESET_FUNC_SIZE
@ -119,6 +122,7 @@ struct cpu_ops {
void (*extra1_func)(void); void (*extra1_func)(void);
void (*extra2_func)(void); void (*extra2_func)(void);
void (*extra3_func)(void); void (*extra3_func)(void);
void (*extra4_func)(void);
void (*e_handler_func)(long es); void (*e_handler_func)(long es);
#endif /* __aarch64__ */ #endif /* __aarch64__ */
#if (defined(IMAGE_BL31) || defined(IMAGE_BL32)) && CPU_MAX_PWR_DWN_OPS #if (defined(IMAGE_BL31) || defined(IMAGE_BL32)) && CPU_MAX_PWR_DWN_OPS