Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  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 */
  156.