mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-17 18:14:24 +00:00

This adds the ability to load the OP-TEE image via an SMC called from non-secure userspace rather than loading it during boot. This should only be utilized on platforms that can ensure security is maintained up until the point the SMC is invoked as it breaks the normal barrier between the secure and non-secure world. Signed-off-by: Jeffrey Kardatzke <jkardatzke@google.com> Change-Id: I21cfa9699617c493fa4190f01d1cbb714e7449cc
160 lines
4.8 KiB
C
160 lines
4.8 KiB
C
/*
|
|
* Copyright (c) 2014-2023, ARM Limited and Contributors. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
/* Copyright (c) 2014, Linaro Limited. All rights reserved. */
|
|
|
|
#ifndef TEESMC_OPTEED_H
|
|
#define TEESMC_OPTEED_H
|
|
|
|
#include "teesmc_opteed_macros.h"
|
|
|
|
/*
|
|
* This section specifies SMC function IDs used when returning from TEE to the
|
|
* secure monitor.
|
|
*
|
|
* All SMC Function IDs indicates SMC32 Calling Convention but will carry
|
|
* full 64 bit values in the argument registers if invoked from Aarch64
|
|
* mode. This violates the SMC Calling Convention, but since this
|
|
* convention only coveres API towards Normal World it's something that
|
|
* only concerns the OP-TEE Dispatcher in Trusted Firmware-A and OP-TEE
|
|
* OS at Secure EL1.
|
|
*/
|
|
|
|
/*
|
|
* Issued when returning from initial entry.
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_ENTRY_DONE
|
|
* r1/x1 Pointer to entry vector
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_ENTRY_DONE 0
|
|
#define TEESMC_OPTEED_RETURN_ENTRY_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_ENTRY_DONE)
|
|
|
|
|
|
|
|
/*
|
|
* Issued when returning from "cpu_on" vector
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_ON_DONE
|
|
* r1/x1 0 on success and anything else to indicate error condition
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_ON_DONE 1
|
|
#define TEESMC_OPTEED_RETURN_ON_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_ON_DONE)
|
|
|
|
/*
|
|
* Issued when returning from "cpu_off" vector
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_OFF_DONE
|
|
* r1/x1 0 on success and anything else to indicate error condition
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_OFF_DONE 2
|
|
#define TEESMC_OPTEED_RETURN_OFF_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_OFF_DONE)
|
|
|
|
/*
|
|
* Issued when returning from "cpu_suspend" vector
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SUSPEND_DONE
|
|
* r1/x1 0 on success and anything else to indicate error condition
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_SUSPEND_DONE 3
|
|
#define TEESMC_OPTEED_RETURN_SUSPEND_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SUSPEND_DONE)
|
|
|
|
/*
|
|
* Issued when returning from "cpu_resume" vector
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_RESUME_DONE
|
|
* r1/x1 0 on success and anything else to indicate error condition
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_RESUME_DONE 4
|
|
#define TEESMC_OPTEED_RETURN_RESUME_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_RESUME_DONE)
|
|
|
|
/*
|
|
* Issued when returning from "std_smc" or "fast_smc" vector
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_CALL_DONE
|
|
* r1-4/x1-4 Return value 0-3 which will passed to normal world in
|
|
* r0-3/x0-3
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_CALL_DONE 5
|
|
#define TEESMC_OPTEED_RETURN_CALL_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_CALL_DONE)
|
|
|
|
/*
|
|
* Issued when returning from "fiq" vector
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_FIQ_DONE
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_FIQ_DONE 6
|
|
#define TEESMC_OPTEED_RETURN_FIQ_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_FIQ_DONE)
|
|
|
|
/*
|
|
* Issued when returning from "system_off" vector
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_OFF_DONE 7
|
|
#define TEESMC_OPTEED_RETURN_SYSTEM_OFF_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_OFF_DONE)
|
|
|
|
/*
|
|
* Issued when returning from "system_reset" vector
|
|
*
|
|
* Register usage:
|
|
* r0/x0 SMC Function ID, TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE
|
|
*/
|
|
#define TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_RESET_DONE 8
|
|
#define TEESMC_OPTEED_RETURN_SYSTEM_RESET_DONE \
|
|
TEESMC_OPTEED_RV(TEESMC_OPTEED_FUNCID_RETURN_SYSTEM_RESET_DONE)
|
|
|
|
/*
|
|
* This section specifies SMC function IDs used when the secure monitor is
|
|
* invoked from the non-secure world.
|
|
*/
|
|
|
|
/*
|
|
* Load OP-TEE image from the payload specified in the registers.
|
|
*
|
|
* WARNING: Use this cautiously as it could lead to insecure loading of the
|
|
* Trusted OS. Further details are in opteed.mk.
|
|
*
|
|
* Call register usage:
|
|
* x0 SMC Function ID, OPTEE_SMC_CALL_LOAD_IMAGE
|
|
* x1 Upper 32bit of a 64bit size for the payload
|
|
* x2 Lower 32bit of a 64bit size for the payload
|
|
* x3 Upper 32bit of the physical address for the payload
|
|
* x4 Lower 32bit of the physical address for the payload
|
|
*
|
|
* The payload consists of a optee_header struct that contains optee_image
|
|
* structs in a flex array, immediately following that in memory is the data
|
|
* referenced by the optee_image structs.
|
|
* Example:
|
|
*
|
|
* struct optee_header (with n images specified)
|
|
* image 0 data
|
|
* image 1 data
|
|
* ...
|
|
* image n-1 data
|
|
*
|
|
* Returns 0 on success and an error code otherwise.
|
|
*/
|
|
#define NSSMC_OPTEED_FUNCID_LOAD_IMAGE 2
|
|
#define NSSMC_OPTEED_CALL_LOAD_IMAGE \
|
|
NSSMC_OPTEED_CALL(NSSMC_OPTEED_FUNCID_LOAD_IMAGE)
|
|
|
|
#endif /*TEESMC_OPTEED_H*/
|