diff options
Diffstat (limited to 'core/arch/arm32')
-rw-r--r-- | core/arch/arm32/include/arm32.h | 30 | ||||
-rw-r--r-- | core/arch/arm32/kernel/sub.mk | 8 | ||||
-rw-r--r-- | core/arch/arm32/kernel/tee_time.c | 13 | ||||
-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.mk | 4 | ||||
-rw-r--r-- | core/arch/arm32/plat-sunxi/conf.mk | 2 | ||||
-rw-r--r-- | core/arch/arm32/plat-vexpress/conf.mk | 2 | ||||
-rw-r--r-- | core/arch/arm32/tee/entry.c | 25 |
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; |