2020-04-02 23:48:27 +02:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
arch, include, soc: Use common stdint.h
There are only minimal differences between the architecture specific
stdint.h implementations, so let's tidy them up and merge them together
into a single file. In particular,
- Use 'unsigned long' for uintptr_t. This was already the case for x86
and riscv, while arm and mips used 'unsigned int', and arm64 and ppc64
used 'unsigned long long'. This change allows using a single integer
type for uintptr_t across all architectures, and brings it into
consistency with the rest of the code base, which generally uses
'unsigned long' for memory addresses anyway. This change required
fixing several assumptions about integer types in the arm code.
- Use _Bool as the boolean type. This is a specialized boolean type that
was introduced in C99, and is preferrable over hacking booleans
using integers. romcc sadly does not support _Bool, so for that we
stick with the old uint8_t.
- Drop the least and fast integer types. They aren't used
anywhere in the code base and are an unnecessary maintenance burden.
Using the standard fixed width types is essentially always better anyway.
- Drop the UINT64_C() macro. It also isn't used anywhere and doesn't
provide anything that a (uint64_t) cast doesn't.
- Implement the rest of the MIN and MAX numerical limits.
- Use static assertions to check that the integer widths are correct.
Change-Id: I6b52f37793151041b7bdee9ec3708bfad69617b2
Signed-off-by: Jacob Garber <jgarber1@ualberta.ca>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/34075
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: HAOUAS Elyes <ehaouas@noos.fr>
Reviewed-by: Julius Werner <jwerner@chromium.org>
Reviewed-by: Nico Huber <nico.h@gmx.de>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
2019-07-04 20:55:35 +02:00
|
|
|
|
|
|
|
#ifndef STDINT_H
|
|
|
|
#define STDINT_H
|
|
|
|
|
|
|
|
/* Fixed width integer types */
|
|
|
|
typedef signed char int8_t;
|
|
|
|
typedef unsigned char uint8_t;
|
|
|
|
|
|
|
|
typedef signed short int16_t;
|
|
|
|
typedef unsigned short uint16_t;
|
|
|
|
|
|
|
|
typedef signed int int32_t;
|
|
|
|
typedef unsigned int uint32_t;
|
|
|
|
|
|
|
|
typedef signed long long int64_t;
|
|
|
|
typedef unsigned long long uint64_t;
|
|
|
|
|
|
|
|
/* Types for 'void *' pointers */
|
|
|
|
typedef signed long intptr_t;
|
|
|
|
typedef unsigned long uintptr_t;
|
|
|
|
|
|
|
|
/* Ensure that the widths are all correct */
|
|
|
|
_Static_assert(sizeof(int8_t) == 1, "Size of int8_t is incorrect");
|
|
|
|
_Static_assert(sizeof(uint8_t) == 1, "Size of uint8_t is incorrect");
|
|
|
|
|
|
|
|
_Static_assert(sizeof(int16_t) == 2, "Size of int16_t is incorrect");
|
|
|
|
_Static_assert(sizeof(uint16_t) == 2, "Size of uint16_t is incorrect");
|
|
|
|
|
|
|
|
_Static_assert(sizeof(int32_t) == 4, "Size of int32_t is incorrect");
|
|
|
|
_Static_assert(sizeof(uint32_t) == 4, "Size of uint32_t is incorrect");
|
|
|
|
|
|
|
|
_Static_assert(sizeof(int64_t) == 8, "Size of int64_t is incorrect");
|
|
|
|
_Static_assert(sizeof(uint64_t) == 8, "Size of uint64_t is incorrect");
|
|
|
|
|
|
|
|
_Static_assert(sizeof(intptr_t) == sizeof(void *), "Size of intptr_t is incorrect");
|
|
|
|
_Static_assert(sizeof(uintptr_t) == sizeof(void *), "Size of uintptr_t is incorrect");
|
|
|
|
|
|
|
|
/* Maximum width integer types */
|
|
|
|
typedef int64_t intmax_t;
|
|
|
|
typedef uint64_t uintmax_t;
|
|
|
|
|
|
|
|
/* Convenient typedefs */
|
|
|
|
typedef int8_t s8;
|
|
|
|
typedef uint8_t u8;
|
|
|
|
|
|
|
|
typedef int16_t s16;
|
|
|
|
typedef uint16_t u16;
|
|
|
|
|
|
|
|
typedef int32_t s32;
|
|
|
|
typedef uint32_t u32;
|
|
|
|
|
|
|
|
typedef int64_t s64;
|
|
|
|
typedef uint64_t u64;
|
|
|
|
|
|
|
|
/* Limits of integer types */
|
|
|
|
#define INT8_MIN ((int8_t)0x80)
|
|
|
|
#define INT8_MAX ((int8_t)0x7F)
|
|
|
|
#define UINT8_MAX ((uint8_t)0xFF)
|
|
|
|
|
|
|
|
#define INT16_MIN ((int16_t)0x8000)
|
|
|
|
#define INT16_MAX ((int16_t)0x7FFF)
|
|
|
|
#define UINT16_MAX ((uint16_t)0xFFFF)
|
|
|
|
|
|
|
|
#define INT32_MIN ((int32_t)0x80000000)
|
|
|
|
#define INT32_MAX ((int32_t)0x7FFFFFFF)
|
|
|
|
#define UINT32_MAX ((uint32_t)0xFFFFFFFF)
|
|
|
|
|
|
|
|
#define INT64_MIN ((int64_t)0x8000000000000000)
|
|
|
|
#define INT64_MAX ((int64_t)0x7FFFFFFFFFFFFFFF)
|
|
|
|
#define UINT64_MAX ((uint64_t)0xFFFFFFFFFFFFFFFF)
|
|
|
|
|
|
|
|
#define INTMAX_MIN INT64_MIN
|
|
|
|
#define INTMAX_MAX INT64_MAX
|
|
|
|
#define UINTMAX_MAX UINT64_MAX
|
|
|
|
|
|
|
|
#endif /* STDINT_H */
|