]>
Commit | Line | Data |
---|---|---|
1 | /** | |
2 | * \file timing.h | |
3 | * | |
4 | * \brief Portable interface to timeouts and to the CPU cycle counter | |
5 | */ | |
6 | /* | |
7 | * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved | |
8 | * SPDX-License-Identifier: GPL-2.0 | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License as published by | |
12 | * the Free Software Foundation; either version 2 of the License, or | |
13 | * (at your option) any later version. | |
14 | * | |
15 | * This program is distributed in the hope that it will be useful, | |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | * GNU General Public License for more details. | |
19 | * | |
20 | * You should have received a copy of the GNU General Public License along | |
21 | * with this program; if not, write to the Free Software Foundation, Inc., | |
22 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
23 | * | |
24 | * This file is part of mbed TLS (https://tls.mbed.org) | |
25 | */ | |
26 | #ifndef MBEDTLS_TIMING_H | |
27 | #define MBEDTLS_TIMING_H | |
28 | ||
29 | #if !defined(MBEDTLS_CONFIG_FILE) | |
30 | #include "config.h" | |
31 | #else | |
32 | #include MBEDTLS_CONFIG_FILE | |
33 | #endif | |
34 | ||
35 | #include <stdint.h> | |
36 | ||
37 | #ifdef __cplusplus | |
38 | extern "C" { | |
39 | #endif | |
40 | ||
41 | #if !defined(MBEDTLS_TIMING_ALT) | |
42 | // Regular implementation | |
43 | // | |
44 | ||
45 | /** | |
46 | * \brief timer structure | |
47 | */ | |
48 | struct mbedtls_timing_hr_time | |
49 | { | |
50 | unsigned char opaque[32]; | |
51 | }; | |
52 | ||
53 | /** | |
54 | * \brief Context for mbedtls_timing_set/get_delay() | |
55 | */ | |
56 | typedef struct mbedtls_timing_delay_context | |
57 | { | |
58 | struct mbedtls_timing_hr_time timer; | |
59 | uint32_t int_ms; | |
60 | uint32_t fin_ms; | |
61 | } mbedtls_timing_delay_context; | |
62 | ||
63 | #else /* MBEDTLS_TIMING_ALT */ | |
64 | #include "timing_alt.h" | |
65 | #endif /* MBEDTLS_TIMING_ALT */ | |
66 | ||
67 | extern volatile int mbedtls_timing_alarmed; | |
68 | ||
69 | /** | |
70 | * \brief Return the CPU cycle counter value | |
71 | * | |
72 | * \warning This is only a best effort! Do not rely on this! | |
73 | * In particular, it is known to be unreliable on virtual | |
74 | * machines. | |
75 | * | |
76 | * \note This value starts at an unspecified origin and | |
77 | * may wrap around. | |
78 | */ | |
79 | unsigned long mbedtls_timing_hardclock( void ); | |
80 | ||
81 | /** | |
82 | * \brief Return the elapsed time in milliseconds | |
83 | * | |
84 | * \param val points to a timer structure | |
85 | * \param reset If 0, query the elapsed time. Otherwise (re)start the timer. | |
86 | * | |
87 | * \return Elapsed time since the previous reset in ms. When | |
88 | * restarting, this is always 0. | |
89 | * | |
90 | * \note To initialize a timer, call this function with reset=1. | |
91 | * | |
92 | * Determining the elapsed time and resetting the timer is not | |
93 | * atomic on all platforms, so after the sequence | |
94 | * `{ get_timer(1); ...; time1 = get_timer(1); ...; time2 = | |
95 | * get_timer(0) }` the value time1+time2 is only approximately | |
96 | * the delay since the first reset. | |
97 | */ | |
98 | unsigned long mbedtls_timing_get_timer( struct mbedtls_timing_hr_time *val, int reset ); | |
99 | ||
100 | /** | |
101 | * \brief Setup an alarm clock | |
102 | * | |
103 | * \param seconds delay before the "mbedtls_timing_alarmed" flag is set | |
104 | * (must be >=0) | |
105 | * | |
106 | * \warning Only one alarm at a time is supported. In a threaded | |
107 | * context, this means one for the whole process, not one per | |
108 | * thread. | |
109 | */ | |
110 | void mbedtls_set_alarm( int seconds ); | |
111 | ||
112 | /** | |
113 | * \brief Set a pair of delays to watch | |
114 | * (See \c mbedtls_timing_get_delay().) | |
115 | * | |
116 | * \param data Pointer to timing data. | |
117 | * Must point to a valid \c mbedtls_timing_delay_context struct. | |
118 | * \param int_ms First (intermediate) delay in milliseconds. | |
119 | * The effect if int_ms > fin_ms is unspecified. | |
120 | * \param fin_ms Second (final) delay in milliseconds. | |
121 | * Pass 0 to cancel the current delay. | |
122 | * | |
123 | * \note To set a single delay, either use \c mbedtls_timing_set_timer | |
124 | * directly or use this function with int_ms == fin_ms. | |
125 | */ | |
126 | void mbedtls_timing_set_delay( void *data, uint32_t int_ms, uint32_t fin_ms ); | |
127 | ||
128 | /** | |
129 | * \brief Get the status of delays | |
130 | * (Memory helper: number of delays passed.) | |
131 | * | |
132 | * \param data Pointer to timing data | |
133 | * Must point to a valid \c mbedtls_timing_delay_context struct. | |
134 | * | |
135 | * \return -1 if cancelled (fin_ms = 0), | |
136 | * 0 if none of the delays are passed, | |
137 | * 1 if only the intermediate delay is passed, | |
138 | * 2 if the final delay is passed. | |
139 | */ | |
140 | int mbedtls_timing_get_delay( void *data ); | |
141 | ||
142 | #if defined(MBEDTLS_SELF_TEST) | |
143 | /** | |
144 | * \brief Checkup routine | |
145 | * | |
146 | * \return 0 if successful, or 1 if a test failed | |
147 | */ | |
148 | int mbedtls_timing_self_test( int verbose ); | |
149 | #endif | |
150 | ||
151 | #ifdef __cplusplus | |
152 | } | |
153 | #endif | |
154 | ||
155 | #endif /* timing.h */ |