aboutsummaryrefslogtreecommitdiff
path: root/core/arch/arm32
diff options
context:
space:
mode:
Diffstat (limited to 'core/arch/arm32')
-rw-r--r--core/arch/arm32/include/arm32.h30
-rw-r--r--core/arch/arm32/kernel/sub.mk8
-rw-r--r--core/arch/arm32/kernel/tee_time.c13
-rw-r--r--core/arch/arm32/kernel/tee_time_arm_generic_timer.c (renamed from core/arch/arm32/kernel/tee_time_arm_cntpct.c)12
-rw-r--r--core/arch/arm32/plat-stm/conf.mk4
-rw-r--r--core/arch/arm32/plat-sunxi/conf.mk2
-rw-r--r--core/arch/arm32/plat-vexpress/conf.mk2
-rw-r--r--core/arch/arm32/tee/entry.c25
8 files changed, 77 insertions, 19 deletions
diff --git a/core/arch/arm32/include/arm32.h b/core/arch/arm32/include/arm32.h
index d6a12ac..273d610 100644
--- a/core/arch/arm32/include/arm32.h
+++ b/core/arch/arm32/include/arm32.h
@@ -491,21 +491,39 @@ static inline void write_nsacr(uint32_t nsacr)
);
}
+static inline uint64_t read_cntvct(void)
+{
+ uint64_t cntvct;
+
+ asm volatile ("mrrc p15, 1, %Q[cntvct], %R[cntvct], c14"
+ : [cntvct] "=r" (cntvct)
+ );
+
+ return cntvct;
+}
+
static inline uint64_t read_cntpct(void)
{
- uint64_t val;
+ uint64_t cntpct;
- asm volatile("mrrc p15, 0, %Q0, %R0, c14" : "=r" (val));
- return val;
+ asm volatile ("mrrc p15, 0, %Q[cntpct], %R[cntpct], c14"
+ : [cntpct] "=r" (cntpct)
+ );
+
+ return cntpct;
}
static inline uint32_t read_cntfrq(void)
{
- uint32_t frq;
+ uint32_t cntfrq;
- asm volatile("mrc p15, 0, %0, c14, c0, 0" : "=r" (frq));
- return frq;
+ asm volatile ("mrc p15, 0, %[cntfrq], c14, c0, 0"
+ : [cntfrq] "=r" (cntfrq)
+ );
+
+ return cntfrq;
}
+
#endif /*ASM*/
#endif /*ARM32_H*/
diff --git a/core/arch/arm32/kernel/sub.mk b/core/arch/arm32/kernel/sub.mk
index 7f3190e..07258fc 100644
--- a/core/arch/arm32/kernel/sub.mk
+++ b/core/arch/arm32/kernel/sub.mk
@@ -1,14 +1,14 @@
srcs-y += tee_ta_manager.c
srcs-y += tee_time.c
-srcs-$(WITH_SECURE_TIME_SOURCE_CNTPCT) += tee_time_arm_cntpct.c
-srcs-$(WITH_SECURE_TIME_SOURCE_RTT) += tee_time_rtt.c
-srcs-$(WITH_SECURE_TIME_SOURCE_REE) += tee_time_ree.c
+srcs-$(CFG_SECURE_TIME_SOURCE_ARM_GENERIC_TIMER) += tee_time_arm_generic_timer.c
+srcs-$(CFG_SECURE_TIME_SOURCE_RTT) += tee_time_rtt.c
+srcs-$(CFG_SECURE_TIME_SOURCE_REE) += tee_time_ree.c
srcs-y += tee_time_unpg.c
srcs-y += tz_proc.S
srcs-y += tz_ssvce.S
-srcs-$(WITH_PL310) += tz_ssvce_pl310.S
+srcs-$(CFG_WITH_PL310) += tz_ssvce_pl310.S
srcs-y += tee_l2cc_mutex.c
srcs-y += thread_asm.S
diff --git a/core/arch/arm32/kernel/tee_time.c b/core/arch/arm32/kernel/tee_time.c
index e343bda..1005736 100644
--- a/core/arch/arm32/kernel/tee_time.c
+++ b/core/arch/arm32/kernel/tee_time.c
@@ -34,6 +34,7 @@
#include <sm/teesmc.h>
#include <kernel/tee_rpc.h>
#include <mm/core_mmu.h>
+#include <arm32.h>
struct time_source _time_source;
@@ -146,3 +147,15 @@ exit:
tee_ta_set_current_session(sess);
return res;
}
+
+int tee_time_get_generic_timer_info(struct generic_timer_info *timer_info)
+{
+ if (timer_info == NULL)
+ return -1;
+
+ timer_info->counter_frequency = read_cntfrq();
+ timer_info->counter_value = read_cntvct();
+
+ return 0;
+}
+
diff --git a/core/arch/arm32/kernel/tee_time_arm_cntpct.c b/core/arch/arm32/kernel/tee_time_arm_generic_timer.c
index 4f6aef3..be9df40 100644
--- a/core/arch/arm32/kernel/tee_time_arm_cntpct.c
+++ b/core/arch/arm32/kernel/tee_time_arm_generic_timer.c
@@ -31,6 +31,7 @@
#include <kernel/time_source.h>
#include <mm/core_mmu.h>
#include <utee_defines.h>
+#include <arm32.h>
#include <assert.h>
#include <stdint.h>
@@ -40,13 +41,14 @@
static uint32_t do_div(uint64_t *dividend, uint32_t divisor)
{
mpa_word_t remainder = 0, n0, n1;
+
n0 = (*dividend) & UINT_MAX;
n1 = ((*dividend) >> WORD_SIZE) & UINT_MAX;
*dividend = __mpa_div_dword(n0, n1, divisor, &remainder);
return remainder;
}
-static TEE_Result arm_cntpct_get_sys_time(TEE_Time *time)
+static TEE_Result arm_generic_timer_get_sys_time(TEE_Time *time)
{
uint64_t cntpct = read_cntpct();
uint32_t cntfrq = read_cntfrq();
@@ -60,9 +62,9 @@ static TEE_Result arm_cntpct_get_sys_time(TEE_Time *time)
return TEE_SUCCESS;
}
-static const struct time_source arm_cntpct_time_source = {
- .name = "arm cntpct",
- .get_sys_time = arm_cntpct_get_sys_time,
+static const struct time_source arm_generic_timer_time_source = {
+ .name = "arm generic timer",
+ .get_sys_time = arm_generic_timer_get_sys_time,
};
-REGISTER_TIME_SOURCE(arm_cntpct_time_source)
+REGISTER_TIME_SOURCE(arm_generic_timer_time_source)
diff --git a/core/arch/arm32/plat-stm/conf.mk b/core/arch/arm32/plat-stm/conf.mk
index 7453268..11c380c 100644
--- a/core/arch/arm32/plat-stm/conf.mk
+++ b/core/arch/arm32/plat-stm/conf.mk
@@ -12,8 +12,8 @@ core-platform-subdirs += \
$(addprefix $(arch-dir)/, kernel mm sm tee sta) $(platform-dir)
libutil_with_isoc := y
-WITH_PL310 := y
-WITH_SECURE_TIME_SOURCE_REE := y
+CFG_WITH_PL310 := y
+CFG_SECURE_TIME_SOURCE_REE := y
CFG_CACHE_API := y
include mk/config.mk
diff --git a/core/arch/arm32/plat-sunxi/conf.mk b/core/arch/arm32/plat-sunxi/conf.mk
index 7b94bab..e8a7fc4 100644
--- a/core/arch/arm32/plat-sunxi/conf.mk
+++ b/core/arch/arm32/plat-sunxi/conf.mk
@@ -19,7 +19,7 @@ core-platform-cppflags += \
endif
libutil_with_isoc := y
-WITH_SECURE_TIME_SOURCE_CNTPCT := y
+CFG_SECURE_TIME_SOURCE_ARM_GENERIC_TIMER := y
include mk/config.mk
diff --git a/core/arch/arm32/plat-vexpress/conf.mk b/core/arch/arm32/plat-vexpress/conf.mk
index 94e1703..2bbdb7d 100644
--- a/core/arch/arm32/plat-vexpress/conf.mk
+++ b/core/arch/arm32/plat-vexpress/conf.mk
@@ -21,7 +21,7 @@ CFG_PM_DEBUG ?= n
libutil_with_isoc := y
libtomcrypt_with_optimize_size := y
-WITH_SECURE_TIME_SOURCE_CNTPCT := y
+CFG_SECURE_TIME_SOURCE_ARM_GENERIC_TIMER := y
WITH_UART_DRV := y
WITH_GIC_DRV := y
CFG_HWSUPP_MEM_PERM_PXN := y
diff --git a/core/arch/arm32/tee/entry.c b/core/arch/arm32/tee/entry.c
index 59ce594..e3ed6dd 100644
--- a/core/arch/arm32/tee/entry.c
+++ b/core/arch/arm32/tee/entry.c
@@ -317,6 +317,27 @@ static void entry_cancel(struct thread_smc_args *args,
}
+#ifdef CFG_TEE_TRACE_PERFORMANCE
+
+static inline void print_cntvct_with_message(uint32_t cmd __unused,
+ const char *msg __unused)
+{
+ uint32_t cntvct_low, cntvct_high;
+
+ __asm__ volatile("mrrc p15, 1, %0, %1, c14"
+ : "=r"(cntvct_low), "=r"(cntvct_high));
+
+ MSG("%s, cmd=%d, cntvct=0x%x%08x", msg, cmd, cntvct_high, cntvct_low);
+}
+
+#else
+
+static inline void print_cntvct_with_message(uint32_t cmd __unused,
+ const char *msg __unused)
+{
+}
+
+#endif
static void tee_entry_call_with_arg(struct thread_smc_args *args)
{
@@ -351,6 +372,8 @@ static void tee_entry_call_with_arg(struct thread_smc_args *args)
}
if (args->a0 == TEESMC32_CALL_WITH_ARG) {
+ print_cntvct_with_message(arg32->cmd,
+ "TEECore: receiving smc call");
switch (arg32->cmd) {
case TEESMC_CMD_OPEN_SESSION:
entry_open_session(args, arg32, num_params);
@@ -368,6 +391,8 @@ static void tee_entry_call_with_arg(struct thread_smc_args *args)
EMSG("Unknown cmd 0x%x\n", arg32->cmd);
args->a0 = TEESMC_RETURN_EBADCMD;
}
+ print_cntvct_with_message(arg32->cmd,
+ "TEECore: finish smc call");
} else {
EMSG("Unknown fastcall cmd 0x%x\n", arg32->cmd);
args->a0 = TEESMC_RETURN_EBADCMD;