diff options
author | Volodymyr Babchuk <vlad.babchuk@gmail.com> | 2019-02-18 16:16:11 +0200 |
---|---|---|
committer | Joakim Bech <joakim.bech@linaro.org> | 2019-04-17 17:57:46 +0700 |
commit | 27b5e34b47fbd3028586ce81d62ce46c55432667 (patch) | |
tree | 80c73142866d69300e5e9fdf16e4287b65bd6c7b /core | |
parent | 47c0e86cde41b0ee1d673013d2be3041a4da04fd (diff) |
core: Introduce OPTEE_SMC_GET_THREAD_COUNT
This call should be used to query OP-TEE about number of threads
(basically, CFG_NUM_THREADS build option).
It is introduced after discussion at [1] about possibility to read
number of supported threads. It is needed for XEN OP-TEE mediator to
mitigate possible DoS from virtual guest. If XEN knows number of
OP-TEE threads, it can limit number of standard calls from the guest
on own side.
Also, it can be used by optee client driver, to ratelimit number of calls
from its side.
Link: [1] https://lists.xenproject.org/archives/html/xen-devel/2019-01/msg01460.html
Signed-off-by: Volodymyr Babchuk <vlad.babchuk@gmail.com>
Reviewed-by: Jens Wiklander <jens.wiklander@linaro.org>
Reviewed-by: Etienne Carriere <etienne.carriere@linaro.org>
Acked-by: Jerome Forissier <jerome.forissier@linaro.org>
Diffstat (limited to 'core')
-rw-r--r-- | core/arch/arm/include/sm/optee_smc.h | 25 | ||||
-rw-r--r-- | core/arch/arm/tee/entry_fast.c | 11 |
2 files changed, 35 insertions, 1 deletions
diff --git a/core/arch/arm/include/sm/optee_smc.h b/core/arch/arm/include/sm/optee_smc.h index 2b0463bc..408dae26 100644 --- a/core/arch/arm/include/sm/optee_smc.h +++ b/core/arch/arm/include/sm/optee_smc.h @@ -423,6 +423,31 @@ OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_VM_DESTROYED) /* + * Query OP-TEE about number of supported threads + * + * Normal World OS or Hypervisor issues this call to find out how many + * threads OP-TEE supports. That is how many standard calls can be issued + * in parallel before OP-TEE will return OPTEE_SMC_RETURN_ETHREAD_LIMIT. + * + * Call requests usage: + * a0 SMC Function ID, OPTEE_SMC_GET_THREAD_COUNT + * a1-6 Not used + * a7 Hypervisor Client ID register + * + * Normal return register usage: + * a0 OPTEE_SMC_RETURN_OK + * a1 Number of threads + * a2-7 Preserved + * + * Error return: + * a0 OPTEE_SMC_RETURN_UNKNOWN_FUNCTION Requested call is not implemented + * a1-7 Preserved + */ +#define OPTEE_SMC_FUNCID_GET_THREAD_COUNT 15 +#define OPTEE_SMC_GET_THREAD_COUNT \ + OPTEE_SMC_FAST_CALL_VAL(OPTEE_SMC_FUNCID_GET_THREAD_COUNT) + +/* * Resume from RPC (for example after processing a foreign interrupt) * * Call register usage: diff --git a/core/arch/arm/tee/entry_fast.c b/core/arch/arm/tee/entry_fast.c index 94f08bac..4e951ab2 100644 --- a/core/arch/arm/tee/entry_fast.c +++ b/core/arch/arm/tee/entry_fast.c @@ -132,6 +132,12 @@ static void tee_entry_boot_secondary(struct thread_smc_args *args) #endif } +static void tee_entry_get_thread_count(struct thread_smc_args *args) +{ + args->a0 = OPTEE_SMC_RETURN_OK; + args->a1 = CFG_NUM_THREADS; +} + #if defined(CFG_VIRTUALIZATION) static void tee_entry_vm_created(struct thread_smc_args *args) { @@ -200,6 +206,9 @@ void tee_entry_fast(struct thread_smc_args *args) case OPTEE_SMC_BOOT_SECONDARY: tee_entry_boot_secondary(args); break; + case OPTEE_SMC_GET_THREAD_COUNT: + tee_entry_get_thread_count(args); + break; #if defined(CFG_VIRTUALIZATION) case OPTEE_SMC_VM_CREATED: @@ -223,7 +232,7 @@ size_t tee_entry_generic_get_api_call_count(void) * target has additional calls it will call this function and * add the number of calls the target has added. */ - size_t ret = 11; + size_t ret = 12; #if defined(CFG_VIRTUALIZATION) ret += 2; |