Home | History | Annotate | Download | only in include
      1 /* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
      2  * Use of this source code is governed by a BSD-style license that can be
      3  * found in the LICENSE file.
      4  */
      5 
      6 /*
      7  * Helper functions/wrappers for memory allocations, manipulation and
      8  * comparison.
      9  */
     10 
     11 #ifndef VBOOT_REFERENCE_UTILITY_H_
     12 #define VBOOT_REFERENCE_UTILITY_H_
     13 
     14 #include "sysincludes.h"
     15 #include "vboot_api.h"
     16 
     17 /* Debug and error output */
     18 #ifdef VBOOT_DEBUG
     19 #define VBDEBUG(params) VbExDebug params
     20 #else
     21 #define VBDEBUG(params)
     22 #endif
     23 
     24 #ifdef VBOOT_DEBUG
     25 #define VbAssert(expr) do { if (!(expr)) { \
     26     VbExError("assert fail: %s at %s:%d\n", \
     27               #expr, __FILE__, __LINE__); }} while(0)
     28 #else
     29 #define VbAssert(expr)
     30 #endif
     31 
     32 /* Optional, up to the BIOS */
     33 #ifdef VBOOT_EASTER_EGG
     34 #define VBEASTEREGG VbExEasterEgg()
     35 #else
     36 #define VBEASTEREGG 0
     37 #endif
     38 
     39 /*
     40  * Combine [msw] and [lsw] uint16s to a uint32_t with its [msw] and [lsw]
     41  * forming the most and least signficant 16-bit words.
     42  */
     43 #define CombineUint16Pair(msw,lsw) (((uint32_t)(msw) << 16) |   \
     44                                     (((lsw)) & 0xFFFF))
     45 
     46 /* Return the minimum of (a) or (b). */
     47 #define Min(a, b) (((a) < (b)) ? (a) : (b))
     48 
     49 /**
     50  * Compare [n] bytes in [src1] and [src2].
     51  *
     52  * Returns an integer less than, equal to, or greater than zero if the first
     53  * [n] bytes of [src1] is found, respectively, to be less than, to match, or be
     54  * greater than the first n bytes of [src2]. */
     55 int Memcmp(const void *src1, const void *src2, size_t n);
     56 
     57 /**
     58  * Copy [n] bytes from [src] to [dest].
     59  */
     60 void *Memcpy(void *dest, const void *src, uint64_t n);
     61 
     62 /*
     63  * Implementations of the functions below must be built as part of the firmware
     64  * and defined in lib/utility.c.
     65  */
     66 
     67 /**
     68  * Set [n] bytes starting at [s] to [c].  Returns dest.
     69  */
     70 void *Memset(void *dest, const uint8_t c, uint64_t n);
     71 
     72 /**
     73  * Compare [n] bytes starting at [s1] with [s2] and return 0 if they
     74  * match, 1 if they don't.  Returns 0 if n=0, since no bytes mismatched.
     75  *
     76  * Time taken to perform the comparison is only dependent on [n] and
     77  * not on the relationship of the match between [s1] and [s2].
     78  *
     79  * Note that unlike Memcmp(), this only indicates inequality, not
     80  * whether s1 is less than or greater than s2.
     81  */
     82 int SafeMemcmp(const void *s1, const void *s2, size_t n);
     83 
     84 /*
     85  * Buffer size required to hold the longest possible output of Uint64ToString()
     86  * - that is, Uint64ToString(~0, 2).
     87  */
     88 #define UINT64_TO_STRING_MAX 65
     89 
     90 /**
     91  * Convert a value to a string in the specified radix (2=binary, 10=decimal,
     92  * 16=hex) and store it in <buf>, which is <bufsize> chars long.  If
     93  * <zero_pad_width>, left-pads the string to at least that width with '0'.
     94  * Returns the length of the stored string, not counting the terminating null.
     95  */
     96 uint32_t Uint64ToString(char *buf, uint32_t bufsize, uint64_t value,
     97                         uint32_t radix, uint32_t zero_pad_width);
     98 
     99 /**
    100  * Concatenate <src> onto <dest>, which has space for <destlen> characters
    101  * including the terminating null.  Note that <dest> will always be
    102  * null-terminated if <destlen> > 0.  Returns the number of characters used in
    103  * <dest>, not counting the terminating null.
    104  */
    105 uint32_t StrnAppend(char *dest, const char *src, uint32_t destlen);
    106 
    107 /* Ensure that only our stub implementations are used, not standard C */
    108 #ifndef _STUB_IMPLEMENTATION_
    109 #define malloc _do_not_use_standard_malloc
    110 #define free _do_not_use_standard_free
    111 #define memcmp _do_not_use_standard_memcmp
    112 #define memcpy _do_not_use_standard_memcpy
    113 #define memset _do_not_use_standard_memset
    114 #endif
    115 
    116 #endif  /* VBOOT_REFERENCE_UTILITY_H_ */
    117