Loading...
Searching...
No Matches
architecture.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2020 Otto-von-Guericke-Universität Magdeburg
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6#pragma once
7
22
23#include <stdint.h>
24#include <inttypes.h>
25#include <limits.h>
26
27#include "architecture_arch.h" /* IWYU pragma: export */
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
39#ifndef ARCHITECTURE_BREAKPOINT
40/* If no breakpoint instruction is defined, busy wait for debugger
41 * to attach and break to ease backtrace
42 */
43#define ARCHITECTURE_BREAKPOINT(value) do {} while (1)
44#endif
45
46/* Provide doxygen doc centrally, instead of in every architecture_arch.h */
47#ifdef DOXYGEN
53#define ARCHITECTURE_WORD_BITS <NUM>
59#define ARCHITECTURE_WORD_BYTES <ARCHITECTURE_WORD_BITS / 8>
66typedef uint<NUM>_t uword_t;
76typedef int<NUM>_t sword_t;
80#define SWORD_MAX <2^(ARCHITECTURE_WORD_BITS - 1) - 1>
84#define SWORD_MIN <-2^(ARCHITECTURE_WORD_BITS - 1)>
88#define UWORD_MAX <2^ARCHITECTURE_WORD_BITS - 1>
89
90/* end of ifdef DOXYGEN */
91#elif (ARCHITECTURE_WORD_BITS == 8)
92# define ARCHITECTURE_WORD_BYTES (1U)
93typedef uint8_t uword_t;
94typedef int8_t sword_t;
95# define SWORD_MAX (INT8_MAX)
96# define SWORD_MIN (INT8_MIN)
97# define UWORD_MAX (UINT8_MAX)
98# define PRIdWORD PRId8
99# define PRIuWORD PRIu8
100# define PRIiWORD PRIu8
101# define PRIxWORD PRIx8
102# define PRIoWORD PRIo8
103#elif (ARCHITECTURE_WORD_BITS == 16)
104# define ARCHITECTURE_WORD_BYTES (2U)
105typedef uint16_t uword_t;
106typedef int16_t sword_t;
107# define SWORD_MAX (INT16_MAX)
108# define SWORD_MIN (INT16_MIN)
109# define UWORD_MAX (UINT16_MAX)
110# define PRIdWORD PRId16
111# define PRIuWORD PRIu16
112# define PRIiWORD PRIu16
113# define PRIxWORD PRIx16
114# define PRIoWORD PRIo16
115#elif (ARCHITECTURE_WORD_BITS == 32)
116# define ARCHITECTURE_WORD_BYTES (4U)
117typedef uint32_t uword_t;
118typedef int32_t sword_t;
119# define SWORD_MAX (INT32_MAX)
120# define SWORD_MIN (INT32_MIN)
121# define UWORD_MAX (UINT32_MAX)
122# define PRIdWORD PRId32
123# define PRIuWORD PRIu32
124# define PRIiWORD PRIu32
125# define PRIxWORD PRIx32
126# define PRIoWORD PRIo32
127#elif (ARCHITECTURE_WORD_BITS == 64)
128# define ARCHITECTURE_WORD_BYTES (8U)
129typedef uint64_t uword_t;
130typedef int64_t sword_t;
131# define SWORD_MAX (INT64_MAX)
132# define SWORD_MIN (INT64_MIN)
133# define UWORD_MAX (UINT64_MAX)
134# define PRIdWORD PRId64
135# define PRIuWORD PRIu64
136# define PRIiWORD PRIu64
137# define PRIxWORD PRIx64
138# define PRIoWORD PRIo64
139#else
140# error "Unsupported word size (check ARCHITECTURE_WORD_BITS in architecture_arch.h)"
141#endif
142
146#define UWORD_MIN (0U)
147
148#if !defined(ARCHITECTURE_LARGE_TXT_PTR) || DOXYGEN
152typedef uintptr_t uinttxtptr_t;
153
157#define PRIxTXTPTR PRIxPTR
158#endif
159
160#if DOXYGEN
164#define PRI_SIZE_T_MODIFIER /* implementation defined */
165#elif (UINT_MAX == SIZE_MAX)
166#define PRI_SIZE_T_MODIFIER ""
167#elif (ULONG_MAX == SIZE_MAX)
168#define PRI_SIZE_T_MODIFIER "l"
169#else
170#error Unsupported size_t length
171#endif
172
177#define PRIdSIZE PRI_SIZE_T_MODIFIER "d"
185#define PRIiSIZE PRI_SIZE_T_MODIFIER "i"
190#define PRIoSIZE PRI_SIZE_T_MODIFIER "o"
195#define PRIuSIZE PRI_SIZE_T_MODIFIER "u"
203#define PRIxSIZE PRI_SIZE_T_MODIFIER "x"
211#define PRIXSIZE PRI_SIZE_T_MODIFIER "X"
212
222#define WORD_ALIGNED __attribute__((aligned(ARCHITECTURE_WORD_BYTES)))
223
234#define HAS_ALIGNMENT_OF(addr, alignment) (((uintptr_t)(addr) & ((alignment) - 1)) == 0)
235
242#define IS_WORD_ALIGNED(addr) HAS_ALIGNMENT_OF(addr, ARCHITECTURE_WORD_BYTES)
243
244#ifdef __cplusplus
245}
246#endif
247
uint< NUM > _t uword_t
Word sized unsigned integer.
int< NUM > _t sword_t
Word sized signed integer.
uintptr_t uinttxtptr_t
Pointer type to point anywhere in the .text section.
Adds include for missing inttype definitions.