/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ /* * Helper functions/wrappers for memory allocations, manipulation and * comparison. */ #ifndef VBOOT_REFERENCE_UTILITY_H_ #define VBOOT_REFERENCE_UTILITY_H_ #include "sysincludes.h" #include "vboot_api.h" /* Debug and error output */ #ifdef VBOOT_DEBUG #define VBDEBUG(params) VbExDebug params #else #define VBDEBUG(params) #endif #ifdef VBOOT_DEBUG #define VbAssert(expr) do { if (!(expr)) { \ VbExError("assert fail: %s at %s:%d\n", \ #expr, __FILE__, __LINE__); }} while(0) #else #define VbAssert(expr) #endif /* Optional, up to the BIOS */ #ifdef VBOOT_EASTER_EGG #define VBEASTEREGG VbExEasterEgg() #else #define VBEASTEREGG 0 #endif /* * Combine [msw] and [lsw] uint16s to a uint32_t with its [msw] and [lsw] * forming the most and least signficant 16-bit words. */ #define CombineUint16Pair(msw,lsw) (((uint32_t)(msw) << 16) | \ (((lsw)) & 0xFFFF)) /* Return the minimum of (a) or (b). */ #define Min(a, b) (((a) < (b)) ? (a) : (b)) /** * Compare [n] bytes in [src1] and [src2]. * * Returns an integer less than, equal to, or greater than zero if the first * [n] bytes of [src1] is found, respectively, to be less than, to match, or be * greater than the first n bytes of [src2]. */ int Memcmp(const void *src1, const void *src2, size_t n); /** * Copy [n] bytes from [src] to [dest]. */ void *Memcpy(void *dest, const void *src, uint64_t n); /* * Implementations of the functions below must be built as part of the firmware * and defined in lib/utility.c. */ /** * Set [n] bytes starting at [s] to [c]. Returns dest. */ void *Memset(void *dest, const uint8_t c, uint64_t n); /** * Compare [n] bytes starting at [s1] with [s2] and return 0 if they * match, 1 if they don't. Returns 0 if n=0, since no bytes mismatched. * * Time taken to perform the comparison is only dependent on [n] and * not on the relationship of the match between [s1] and [s2]. * * Note that unlike Memcmp(), this only indicates inequality, not * whether s1 is less than or greater than s2. */ int SafeMemcmp(const void *s1, const void *s2, size_t n); /* * Buffer size required to hold the longest possible output of Uint64ToString() * - that is, Uint64ToString(~0, 2). */ #define UINT64_TO_STRING_MAX 65 /** * Convert a value to a string in the specified radix (2=binary, 10=decimal, * 16=hex) and store it in , which is chars long. If * , left-pads the string to at least that width with '0'. * Returns the length of the stored string, not counting the terminating null. */ uint32_t Uint64ToString(char *buf, uint32_t bufsize, uint64_t value, uint32_t radix, uint32_t zero_pad_width); /** * Concatenate onto , which has space for characters * including the terminating null. Note that will always be * null-terminated if > 0. Returns the number of characters used in * , not counting the terminating null. */ uint32_t StrnAppend(char *dest, const char *src, uint32_t destlen); /* Ensure that only our stub implementations are used, not standard C */ #ifndef _STUB_IMPLEMENTATION_ #define malloc _do_not_use_standard_malloc #define free _do_not_use_standard_free #define memcmp _do_not_use_standard_memcmp #define memcpy _do_not_use_standard_memcpy #define memset _do_not_use_standard_memset #endif #endif /* VBOOT_REFERENCE_UTILITY_H_ */