|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | #ifndef OPENTITAN_SW_DEVICE_LIB_BASE_FREESTANDING_STDINT_H_ | 
|  | #define OPENTITAN_SW_DEVICE_LIB_BASE_FREESTANDING_STDINT_H_ | 
|  |  | 
|  | /** | 
|  | * @file | 
|  | * @brief C library Integer types (Freestanding) | 
|  | * | 
|  | * This header implements the stdint.h standard header, as required by C11 S4p6. | 
|  | * This header is specified in detail in S7.20 the same. | 
|  | * | 
|  | * Actual limit values below are defined as: | 
|  | * - Unsigned MAXs are defined as the `0xff..ffU` all-ones representation. | 
|  | * - Signed MINs are defined as `0x80..00` all-zeroes-but-the-last | 
|  | *   representation. | 
|  | * - Unsigned MAXs are defined as `0x7f..ff` all-ones-but-the-last | 
|  | *   representation. | 
|  | * These shorthands are correct for two's complement and the ones least likely | 
|  | * to get a mistake in. | 
|  | * | 
|  | * It goes without saying that this file assumes the underlying representation | 
|  | * is two's complement and little-endian. | 
|  | * | 
|  | * See https://github.com/riscv/riscv-elf-psabi-doc/blob/master/riscv-elf.md | 
|  | * for the RISC-V specifics this file conforms to. | 
|  | */ | 
|  |  | 
|  | typedef __UINT8_TYPE__ uint8_t; | 
|  | typedef __UINT16_TYPE__ uint16_t; | 
|  | typedef __UINT32_TYPE__ uint32_t; | 
|  | typedef __UINT64_TYPE__ uint64_t; | 
|  | typedef __INT8_TYPE__ int8_t; | 
|  | typedef __INT16_TYPE__ int16_t; | 
|  | typedef __INT32_TYPE__ int32_t; | 
|  | typedef __INT64_TYPE__ int64_t; | 
|  |  | 
|  | typedef __UINT_LEAST8_TYPE__ uint_least8_t; | 
|  | typedef __UINT_LEAST16_TYPE__ uint_least16_t; | 
|  | typedef __UINT_LEAST32_TYPE__ uint_least32_t; | 
|  | typedef __UINT_LEAST64_TYPE__ uint_least64_t; | 
|  | typedef __INT_LEAST8_TYPE__ int_least8_t; | 
|  | typedef __INT_LEAST16_TYPE__ int_least16_t; | 
|  | typedef __INT_LEAST32_TYPE__ int_least32_t; | 
|  | typedef __INT_LEAST64_TYPE__ int_least64_t; | 
|  |  | 
|  | typedef __UINT_FAST8_TYPE__ uint_fast8_t; | 
|  | typedef __UINT_FAST16_TYPE__ uint_fast16_t; | 
|  | typedef __UINT_FAST32_TYPE__ uint_fast32_t; | 
|  | typedef __UINT_FAST64_TYPE__ uint_fast64_t; | 
|  | typedef __INT_FAST8_TYPE__ int_fast8_t; | 
|  | typedef __INT_FAST16_TYPE__ int_fast16_t; | 
|  | typedef __INT_FAST32_TYPE__ int_fast32_t; | 
|  | typedef __INT_FAST64_TYPE__ int_fast64_t; | 
|  |  | 
|  | typedef __UINTPTR_TYPE__ uintptr_t; | 
|  | typedef __INTPTR_TYPE__ intptr_t; | 
|  |  | 
|  | typedef __UINTMAX_TYPE__ uintmax_t; | 
|  | typedef __INTMAX_TYPE__ intmax_t; | 
|  |  | 
|  | // NOTE: Below, we use GCC/Clang's built-in defines for limits. However, only | 
|  | // MAX limits are provided and, as such, we define a signed MIN, given a MAX, as | 
|  | // (-MIN - 1). (MAX + 1) will trigger signed overflow and, as such, Undefined | 
|  | // Behavior. | 
|  |  | 
|  | #define INT8_MIN (-__INT8_MAX__ - 1)   /**< @hideinitializer */ | 
|  | #define INT8_MAX __INT8_MAX__          /**< @hideinitializer */ | 
|  | #define UINT8_MAX __UINT8_MAX__        /**< @hideinitializer */ | 
|  | #define INT16_MIN (-__INT16_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT16_MAX __INT16_MAX__        /**< @hideinitializer */ | 
|  | #define UINT16_MAX __UINT16_MAX__      /**< @hideinitializer */ | 
|  | #define INT32_MIN (-__INT32_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT32_MAX __INT32_MAX__        /**< @hideinitializer */ | 
|  | #define UINT32_MAX __UINT32_MAX__      /**< @hideinitializer */ | 
|  | #define INT64_MIN (-__INT64_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT64_MAX __INT64_MAX__        /**< @hideinitializer */ | 
|  | #define UINT64_MAX __UINT64_MAX__      /**< @hideinitializer */ | 
|  |  | 
|  | #define INT_LEAST8_MIN (-__INT_LEAST8_MAX__ - 1)   /**< @hideinitializer */ | 
|  | #define INT_LEAST8_MAX __INT_LEAST8_MAX__          /**< @hideinitializer */ | 
|  | #define UINT_LEAST8_MAX __UINT_LEAST8_MAX__        /**< @hideinitializer */ | 
|  | #define INT_LEAST16_MIN (-__INT_LEAST16_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT_LEAST16_MAX __INT_LEAST16_MAX__        /**< @hideinitializer */ | 
|  | #define UINT_LEAST16_MAX __UINT_LEAST16_MAX__      /**< @hideinitializer */ | 
|  | #define INT_LEAST32_MIN (-__INT_LEAST32_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT_LEAST32_MAX __INT_LEAST32_MAX__        /**< @hideinitializer */ | 
|  | #define UINT_LEAST32_MAX __UINT_LEAST32_MAX__      /**< @hideinitializer */ | 
|  | #define INT_LEAST64_MIN (-__INT_LEAST64_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT_LEAST64_MAX __INT_LEAST64_MAX__        /**< @hideinitializer */ | 
|  | #define UINT_LEAST64_MAX __UINT_LEAST64_MAX__      /**< @hideinitializer */ | 
|  |  | 
|  | #define INT_FAST8_MIN (-__INT_FAST8_MAX__ - 1)   /**< @hideinitializer */ | 
|  | #define INT_FAST8_MAX __INT_FAST8_MAX__          /**< @hideinitializer */ | 
|  | #define UINT_FAST8_MAX __UINT_FAST8_MAX__        /**< @hideinitializer */ | 
|  | #define INT_FAST16_MIN (-__INT_FAST16_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT_FAST16_MAX __INT_FAST16_MAX__        /**< @hideinitializer */ | 
|  | #define UINT_FAST16_MAX __UINT_FAST16_MAX__      /**< @hideinitializer */ | 
|  | #define INT_FAST32_MIN (-__INT_FAST32_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT_FAST32_MAX __INT_FAST32_MAX__        /**< @hideinitializer */ | 
|  | #define UINT_FAST32_MAX __UINT_FAST32_MAX__      /**< @hideinitializer */ | 
|  | #define INT_FAST64_MIN (-__INT_FAST64_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INT_FAST64_MAX __INT_FAST64_MAX__        /**< @hideinitializer */ | 
|  | #define UINT_FAST64_MAX __UINT_FAST64_MAX__      /**< @hideinitializer */ | 
|  |  | 
|  | #define INTPTR_MIN (-__INTPTR_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INTPTR_MAX __INTPTR_MAX__        /**< @hideinitializer */ | 
|  | #define UINTPTR_MAX __UINTPTR_MAX__      /**< @hideinitializer */ | 
|  |  | 
|  | #define INTMAX_MIN (-__INTMAX_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define INTMAX_MAX __INTMAX_MAX__        /**< @hideinitializer */ | 
|  | #define UINTMAX_MAX __UINTMAX_MAX__      /**< @hideinitializer */ | 
|  |  | 
|  | #define PTRDIFF_MIN (-__PTRDIFF_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define PTRDIFF_MAX __PTRDIFF_MAX__        /**< @hideinitializer */ | 
|  |  | 
|  | #define SIZE_MAX __SIZE_MAX__ /**< @hideinitializer */ | 
|  |  | 
|  | #define WCHAR_MIN (-__WCHAR_MAX__ - 1) /**< @hideinitializer */ | 
|  | #define WCHAR_MAX __WCHAR_MAX__        /**< @hideinitializer */ | 
|  |  | 
|  | // NOTE: While GCC and Clang both provide macros for implememting the _C macros, | 
|  | // they are inconsistent on which is correct, so we implement them ourselves | 
|  | // below. | 
|  |  | 
|  | #define INT8_C(value) (value)       /**< @hideinitializer */ | 
|  | #define INT16_C(value) (value)      /**< @hideinitializer */ | 
|  | #define INT32_C(value) (value)      /**< @hideinitializer */ | 
|  | #define INT64_C(value) (value##LL)  /**< @hideinitializer */ | 
|  | #define INTMAX_C(value) (value##LL) /**< @hideinitializer */ | 
|  |  | 
|  | #define UINT8_C(value) (value##U)     /**< @hideinitializer */ | 
|  | #define UINT16_C(value) (value##U)    /**< @hideinitializer */ | 
|  | #define UINT32_C(value) (value##U)    /**< @hideinitializer */ | 
|  | #define UINT64_C(value) (value##ULL)  /**< @hideinitializer */ | 
|  | #define UINTMAX_C(value) (value##ULL) /**< @hideinitializer */ | 
|  |  | 
|  | #endif  // OPENTITAN_SW_DEVICE_LIB_BASE_FREESTANDING_STDINT_H_ |