From 088a5334809d175ea6b4020012afa9f3b6962960 Mon Sep 17 00:00:00 2001 From: Sumit Garg Date: Wed, 5 Dec 2018 17:27:45 +0530 Subject: [PATCH] ArmPkg/OpteeLib: Add dummy RPC handler Add dummy RPC handler for RPCs that are not implemented as control should be returned back to OP-TEE in case any RPC is invoked. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Sumit Garg Reviewed-by: Ard Biesheuvel --- ArmPkg/Library/OpteeLib/Optee.c | 34 ++++++++++++++++++++++++------ ArmPkg/Library/OpteeLib/OpteeSmc.h | 3 +++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/ArmPkg/Library/OpteeLib/Optee.c b/ArmPkg/Library/OpteeLib/Optee.c index 55dcc7853b..ed2a03c593 100644 --- a/ArmPkg/Library/OpteeLib/Optee.c +++ b/ArmPkg/Library/OpteeLib/Optee.c @@ -123,6 +123,17 @@ OpteeInit ( return EFI_SUCCESS; } +STATIC +BOOLEAN +IsOpteeSmcReturnRpc ( + UINT32 Return + ) +{ + return (Return != OPTEE_SMC_RETURN_UNKNOWN_FUNCTION) && + ((Return & OPTEE_SMC_RETURN_RPC_PREFIX_MASK) == + OPTEE_SMC_RETURN_RPC_PREFIX); +} + /** Does Standard SMC to OP-TEE in secure world. @@ -147,13 +158,22 @@ OpteeCallWithArg ( while (TRUE) { ArmCallSmc (&ArmSmcArgs); - if (ArmSmcArgs.Arg0 == OPTEE_SMC_RETURN_RPC_FOREIGN_INTERRUPT) { - // - // A foreign interrupt was raised while secure world was - // executing, since they are handled in UEFI a dummy RPC is - // performed to let UEFI take the interrupt through the normal - // vector. - // + if (IsOpteeSmcReturnRpc (ArmSmcArgs.Arg0)) { + switch (ArmSmcArgs.Arg0) { + case OPTEE_SMC_RETURN_RPC_FOREIGN_INTERRUPT: + // + // A foreign interrupt was raised while secure world was + // executing, since they are handled in UEFI a dummy RPC is + // performed to let UEFI take the interrupt through the normal + // vector. + // + break; + + default: + // Do nothing in case RPC is not implemented. + break; + } + ArmSmcArgs.Arg0 = OPTEE_SMC_RETURN_FROM_RPC; } else { break; diff --git a/ArmPkg/Library/OpteeLib/OpteeSmc.h b/ArmPkg/Library/OpteeLib/OpteeSmc.h index 9cccd81810..6209782aae 100644 --- a/ArmPkg/Library/OpteeLib/OpteeSmc.h +++ b/ArmPkg/Library/OpteeLib/OpteeSmc.h @@ -25,6 +25,9 @@ #define OPTEE_SMC_SHARED_MEMORY_CACHED 1 +#define OPTEE_SMC_RETURN_UNKNOWN_FUNCTION 0xffffffff +#define OPTEE_SMC_RETURN_RPC_PREFIX_MASK 0xffff0000 +#define OPTEE_SMC_RETURN_RPC_PREFIX 0xffff0000 #define OPTEE_SMC_RETURN_RPC_FOREIGN_INTERRUPT 0xffff0004 #define OPTEE_MESSAGE_COMMAND_OPEN_SESSION 0 -- 2.39.2