aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorVolodymyr Babchuk <vlad.babchuk@gmail.com>2019-02-18 16:16:11 +0200
committerJoakim Bech <joakim.bech@linaro.org>2019-04-17 17:57:46 +0700
commit27b5e34b47fbd3028586ce81d62ce46c55432667 (patch)
tree80c73142866d69300e5e9fdf16e4287b65bd6c7b /core
parent47c0e86cde41b0ee1d673013d2be3041a4da04fd (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.h25
-rw-r--r--core/arch/arm/tee/entry_fast.c11
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;