| /* Copyright 2019 The Fuchsia Authors. All rights reserved. |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SRC_FIRMWARE_LIB_ABR_INCLUDE_LIB_ABR_UTIL_H_ |
| #define SRC_FIRMWARE_LIB_ABR_INCLUDE_LIB_ABR_UTIL_H_ |
| |
| /* Local modification for Estelle. See lib/fuchsia/README.estelle.md. */ |
| #include <common.h> |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #define ABR_STRINGIFY(x) #x |
| #define ABR_TO_STRING(x) ABR_STRINGIFY(x) |
| |
| #ifdef ABR_ENABLE_DEBUG |
| /* Aborts the program if |expr| is false. |
| * |
| * This has no effect unless ABR_ENABLE_DEBUG is defined. |
| */ |
| #define ABR_ASSERT(expr) \ |
| do { \ |
| if (!(expr)) { \ |
| ABR_FATAL("assert fail: " #expr "\n"); \ |
| } \ |
| } while (0) |
| #else |
| #define ABR_ASSERT(expr) |
| #endif /* ABR_ENABLE_DEBUG */ |
| |
| #ifdef ABR_ENABLE_DEBUG |
| /* Print a message, used for diagnostics. |
| * |
| * This has no effect unless ABR_ENABLE_DEBUG is defined. |
| */ |
| #define ABR_DEBUG(message) \ |
| do { \ |
| AbrPrint(__FILE__ ":" ABR_TO_STRING(__LINE__) ": DEBUG: " message); \ |
| } while (0) |
| #else |
| #define ABR_DEBUG(message) |
| #endif /* ABR_ENABLE_DEBUG */ |
| |
| #define ABR_ERROR(message) \ |
| do { \ |
| AbrPrint(__FILE__ ":" ABR_TO_STRING(__LINE__) ": ERROR: " message); \ |
| } while (0) |
| |
| #define ABR_FATAL(message) \ |
| do { \ |
| AbrPrint(__FILE__ ":" ABR_TO_STRING(__LINE__) ": FATAL: " message); \ |
| AbrAbort(); \ |
| } while (0) |
| |
| /* Converts a 32-bit unsigned integer from big-endian to host byte order. */ |
| uint32_t AbrBigEndianToHost(uint32_t in); |
| |
| /* Converts a 32-bit unsigned integer from host to big-endian byte order. */ |
| uint32_t AbrHostToBigEndian(uint32_t in); |
| |
| /* 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 AbrSafeMemcmp(const void* s1, const void* s2, size_t n); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif // SRC_FIRMWARE_LIB_ABR_INCLUDE_LIB_ABR_UTIL_H_ |