aboutsummaryrefslogtreecommitdiff
path: root/core/arch/arm/kernel/tee_time_ree.c
blob: 5841171e02461e93a034966e4c388470bc81d2e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
// SPDX-License-Identifier: BSD-2-Clause
/*
 * Copyright (c) 2014, Linaro Limited
 * All rights reserved.
 */

#include <kernel/tee_time.h>
#include <kernel/time_source.h>
#include <kernel/mutex.h>

static TEE_Time prev;

static struct mutex time_mu = MUTEX_INITIALIZER;

static TEE_Result get_monotonic_ree_time(TEE_Time *time)
{
	TEE_Result res;

	res = tee_time_get_ree_time(time);
	if (res != TEE_SUCCESS)
		return res;

	mutex_lock(&time_mu);
	if (time->seconds < prev.seconds ||
		(time->seconds == prev.seconds &&
		 time->millis < prev.millis))
		*time = prev; /* REE time was rolled back */
	else
		prev = *time;
	mutex_unlock(&time_mu);

	return res;
}

static const struct time_source ree_time_source = {
	.name = "ree",
	.protection_level = 100,
	.get_sys_time = get_monotonic_ree_time,
};

REGISTER_TIME_SOURCE(ree_time_source)