mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-23 13:36:05 +00:00
Implement support for SMCCC v1.1
SMCCC v1.1 comes with a relaxed calling convention for AArch64 callers. The caller only needs to save x0-x3 before doing an SMC call. This patch adds support for SMCCC_VERSION and SMCCC_ARCH_FEATURES. Refer to "Firmware Interfaces for mitigating CVE_2017_5715 System Software on Arm Systems"[0] for more information. [0] https://developer.arm.com/-/media/developer/pdf/ARM%20DEN%200070A%20Firmware%20interfaces%20for%20mitigating%20CVE-2017-5715_V1.0.pdf Change-Id: If5b1c55c17d6c5c7cb9c2c3ed355d3a91cdad0a9 Signed-off-by: Dimitris Papastamos <dimitris.papastamos@arm.com>
This commit is contained in:
parent
201ca5b6b4
commit
3a1b0676c7
4 changed files with 100 additions and 2 deletions
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2013-2017, ARM Limited and Contributors. All rights reserved.
|
# Copyright (c) 2013-2018, ARM Limited and Contributors. All rights reserved.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: BSD-3-Clause
|
# SPDX-License-Identifier: BSD-3-Clause
|
||||||
#
|
#
|
||||||
|
@ -23,6 +23,7 @@ BL31_SOURCES += bl31/bl31_main.c \
|
||||||
bl31/bl31_context_mgmt.c \
|
bl31/bl31_context_mgmt.c \
|
||||||
common/runtime_svc.c \
|
common/runtime_svc.c \
|
||||||
plat/common/aarch64/platform_mp_stack.S \
|
plat/common/aarch64/platform_mp_stack.S \
|
||||||
|
services/arm_arch_svc/arm_arch_svc_setup.c \
|
||||||
services/std_svc/std_svc_setup.c \
|
services/std_svc/std_svc_setup.c \
|
||||||
${PSCI_LIB_SOURCES} \
|
${PSCI_LIB_SOURCES} \
|
||||||
${SPM_SOURCES} \
|
${SPM_SOURCES} \
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2016-2017, ARM Limited and Contributors. All rights reserved.
|
* Copyright (c) 2016-2018, ARM Limited and Contributors. All rights reserved.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-3-Clause
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -67,6 +67,11 @@
|
||||||
#include <cassert.h>
|
#include <cassert.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define SMCCC_MAJOR_VERSION U(1)
|
||||||
|
#define SMCCC_MINOR_VERSION U(1)
|
||||||
|
|
||||||
|
#define MAKE_SMCCC_VERSION(_major, _minor) (((_major) << 16) | (_minor))
|
||||||
|
|
||||||
/* Various flags passed to SMC handlers */
|
/* Various flags passed to SMC handlers */
|
||||||
#define SMC_FROM_SECURE (U(0) << 0)
|
#define SMC_FROM_SECURE (U(0) << 0)
|
||||||
#define SMC_FROM_NON_SECURE (U(1) << 0)
|
#define SMC_FROM_NON_SECURE (U(1) << 0)
|
||||||
|
@ -78,6 +83,10 @@
|
||||||
#define is_std_svc_call(_fid) ((((_fid) >> FUNCID_OEN_SHIFT) & \
|
#define is_std_svc_call(_fid) ((((_fid) >> FUNCID_OEN_SHIFT) & \
|
||||||
FUNCID_OEN_MASK) == OEN_STD_START)
|
FUNCID_OEN_MASK) == OEN_STD_START)
|
||||||
|
|
||||||
|
/* The macro below is used to identify a Arm Architectural Service SMC call */
|
||||||
|
#define is_arm_arch_svc_call(_fid) ((((_fid) >> FUNCID_OEN_SHIFT) & \
|
||||||
|
FUNCID_OEN_MASK) == OEN_ARM_START)
|
||||||
|
|
||||||
/* The macro below is used to identify a valid Fast SMC call */
|
/* The macro below is used to identify a valid Fast SMC call */
|
||||||
#define is_valid_fast_smc(_fid) ((!(((_fid) >> 16) & U(0xff))) && \
|
#define is_valid_fast_smc(_fid) ((!(((_fid) >> 16) & U(0xff))) && \
|
||||||
(GET_SMC_TYPE(_fid) == SMC_TYPE_FAST))
|
(GET_SMC_TYPE(_fid) == SMC_TYPE_FAST))
|
||||||
|
|
14
include/services/arm_arch_svc.h
Normal file
14
include/services/arm_arch_svc.h
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ARM_ARCH_SVC_H__
|
||||||
|
#define __ARM_ARCH_SVC_H__
|
||||||
|
|
||||||
|
#define SMCCC_VERSION U(0x80000000)
|
||||||
|
#define SMCCC_ARCH_FEATURES U(0x80000001)
|
||||||
|
#define SMCCC_ARCH_WORKAROUND_1 U(0x80008000)
|
||||||
|
|
||||||
|
#endif /* __ARM_ARCH_SVC_H__ */
|
74
services/arm_arch_svc/arm_arch_svc_setup.c
Normal file
74
services/arm_arch_svc/arm_arch_svc_setup.c
Normal file
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018, ARM Limited and Contributors. All rights reserved.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: BSD-3-Clause
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <arm_arch_svc.h>
|
||||||
|
#include <debug.h>
|
||||||
|
#include <runtime_svc.h>
|
||||||
|
#include <smcc.h>
|
||||||
|
#include <smcc_helpers.h>
|
||||||
|
|
||||||
|
static int32_t smccc_version(void)
|
||||||
|
{
|
||||||
|
return MAKE_SMCCC_VERSION(SMCCC_MAJOR_VERSION, SMCCC_MINOR_VERSION);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t smccc_arch_features(u_register_t arg)
|
||||||
|
{
|
||||||
|
switch (arg) {
|
||||||
|
case SMCCC_VERSION:
|
||||||
|
case SMCCC_ARCH_FEATURES:
|
||||||
|
return SMC_OK;
|
||||||
|
#if WORKAROUND_CVE_2017_5715
|
||||||
|
case SMCCC_ARCH_WORKAROUND_1:
|
||||||
|
return SMC_OK;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
return SMC_UNK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Top-level Arm Architectural Service SMC handler.
|
||||||
|
*/
|
||||||
|
uintptr_t arm_arch_svc_smc_handler(uint32_t smc_fid,
|
||||||
|
u_register_t x1,
|
||||||
|
u_register_t x2,
|
||||||
|
u_register_t x3,
|
||||||
|
u_register_t x4,
|
||||||
|
void *cookie,
|
||||||
|
void *handle,
|
||||||
|
u_register_t flags)
|
||||||
|
{
|
||||||
|
switch (smc_fid) {
|
||||||
|
case SMCCC_VERSION:
|
||||||
|
SMC_RET1(handle, smccc_version());
|
||||||
|
case SMCCC_ARCH_FEATURES:
|
||||||
|
SMC_RET1(handle, smccc_arch_features(x1));
|
||||||
|
#if WORKAROUND_CVE_2017_5715
|
||||||
|
case SMCCC_ARCH_WORKAROUND_1:
|
||||||
|
/*
|
||||||
|
* The workaround has already been applied on affected PEs
|
||||||
|
* during entry to EL3. On unaffected PEs, this function
|
||||||
|
* has no effect.
|
||||||
|
*/
|
||||||
|
SMC_RET0(handle);
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
WARN("Unimplemented Arm Architecture Service Call: 0x%x \n",
|
||||||
|
smc_fid);
|
||||||
|
SMC_RET1(handle, SMC_UNK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Register Standard Service Calls as runtime service */
|
||||||
|
DECLARE_RT_SVC(
|
||||||
|
arm_arch_svc,
|
||||||
|
OEN_ARM_START,
|
||||||
|
OEN_ARM_END,
|
||||||
|
SMC_TYPE_FAST,
|
||||||
|
NULL,
|
||||||
|
arm_arch_svc_smc_handler
|
||||||
|
);
|
Loading…
Add table
Reference in a new issue