2016-09-23 17:02:51 +02:00
|
|
|
/* compiler.h: macros to abstract away compiler specifics
|
|
|
|
*
|
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
|
|
* See the COPYING file in the top-level directory.
|
|
|
|
*/
|
2011-07-11 19:24:44 +02:00
|
|
|
|
|
|
|
#ifndef COMPILER_H
|
|
|
|
#define COMPILER_H
|
|
|
|
|
2022-02-24 15:49:53 +01:00
|
|
|
#define HOST_BIG_ENDIAN (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
|
|
|
|
|
|
|
|
/* HOST_LONG_BITS is the size of a native pointer in bits. */
|
|
|
|
#define HOST_LONG_BITS (__SIZEOF_POINTER__ * 8)
|
|
|
|
|
2016-07-15 18:27:40 +02:00
|
|
|
#if defined __clang_analyzer__ || defined __COVERITY__
|
|
|
|
#define QEMU_STATIC_ANALYSIS 1
|
|
|
|
#endif
|
2011-07-11 19:24:44 +02:00
|
|
|
|
2021-04-16 15:55:39 +02:00
|
|
|
#ifdef __cplusplus
|
|
|
|
#define QEMU_EXTERN_C extern "C"
|
|
|
|
#else
|
|
|
|
#define QEMU_EXTERN_C extern
|
|
|
|
#endif
|
|
|
|
|
2019-05-07 13:55:02 +02:00
|
|
|
#if defined(_WIN32) && (defined(__x86_64__) || defined(__i386__))
|
2011-08-31 12:38:00 +02:00
|
|
|
# define QEMU_PACKED __attribute__((gcc_struct, packed))
|
|
|
|
#else
|
|
|
|
# define QEMU_PACKED __attribute__((packed))
|
|
|
|
#endif
|
|
|
|
|
2016-06-08 20:55:19 +02:00
|
|
|
#define QEMU_ALIGNED(X) __attribute__((aligned(X)))
|
|
|
|
|
2015-08-19 17:20:19 +02:00
|
|
|
#ifndef glue
|
|
|
|
#define xglue(x, y) x ## y
|
|
|
|
#define glue(x, y) xglue(x, y)
|
|
|
|
#define stringify(s) tostring(s)
|
|
|
|
#define tostring(s) #s
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef likely
|
|
|
|
#define likely(x) __builtin_expect(!!(x), 1)
|
|
|
|
#define unlikely(x) __builtin_expect(!!(x), 0)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef container_of
|
|
|
|
#define container_of(ptr, type, member) ({ \
|
|
|
|
const typeof(((type *) 0)->member) *__mptr = (ptr); \
|
|
|
|
(type *) ((char *) __mptr - offsetof(type, member));})
|
|
|
|
#endif
|
|
|
|
|
2018-06-14 18:44:31 +02:00
|
|
|
#define sizeof_field(type, field) sizeof(((type *)0)->field)
|
|
|
|
|
2019-10-11 17:27:59 +02:00
|
|
|
/*
|
|
|
|
* Calculate the number of bytes up to and including the given 'field' of
|
|
|
|
* 'container'.
|
|
|
|
*/
|
|
|
|
#define endof(container, field) \
|
|
|
|
(offsetof(container, field) + sizeof_field(container, field))
|
|
|
|
|
2015-08-19 17:20:19 +02:00
|
|
|
/* Convert from a base type to a parent type, with compile time checking. */
|
|
|
|
#define DO_UPCAST(type, field, dev) ( __extension__ ( { \
|
|
|
|
char __attribute__((unused)) offset_must_be_zero[ \
|
|
|
|
-offsetof(type, field)]; \
|
|
|
|
container_of(dev, type, field);}))
|
|
|
|
|
|
|
|
#define typeof_field(type, field) typeof(((type *)0)->field)
|
|
|
|
#define type_check(t1,t2) ((t1*)0 - (t2*)0)
|
|
|
|
|
2017-01-19 21:56:14 +01:00
|
|
|
#define QEMU_BUILD_BUG_ON_STRUCT(x) \
|
|
|
|
struct { \
|
|
|
|
int:(x) ? -1 : 1; \
|
|
|
|
}
|
|
|
|
|
2018-02-24 16:40:27 +01:00
|
|
|
#define QEMU_BUILD_BUG_MSG(x, msg) _Static_assert(!(x), msg)
|
2011-07-11 19:24:44 +02:00
|
|
|
|
2018-02-24 16:40:27 +01:00
|
|
|
#define QEMU_BUILD_BUG_ON(x) QEMU_BUILD_BUG_MSG(x, "not expecting: " #x)
|
|
|
|
|
2017-01-18 21:05:15 +01:00
|
|
|
#define QEMU_BUILD_BUG_ON_ZERO(x) (sizeof(QEMU_BUILD_BUG_ON_STRUCT(x)) - \
|
|
|
|
sizeof(QEMU_BUILD_BUG_ON_STRUCT(x)))
|
|
|
|
|
2022-02-20 17:39:25 +01:00
|
|
|
#if !defined(__clang__) && defined(_WIN32)
|
2020-12-10 14:47:46 +01:00
|
|
|
/*
|
|
|
|
* Map __printf__ to __gnu_printf__ because we want standard format strings even
|
|
|
|
* when MinGW or GLib include files use __printf__.
|
|
|
|
*/
|
2022-02-20 17:39:25 +01:00
|
|
|
# define __printf__ __gnu_printf__
|
2011-07-11 19:24:44 +02:00
|
|
|
#endif
|
|
|
|
|
2018-11-30 09:23:16 +01:00
|
|
|
#ifndef __has_warning
|
|
|
|
#define __has_warning(x) 0 /* compatibility with non-clang compilers */
|
|
|
|
#endif
|
|
|
|
|
2018-01-16 16:11:52 +01:00
|
|
|
#ifndef __has_feature
|
|
|
|
#define __has_feature(x) 0 /* compatibility with non-clang compilers */
|
|
|
|
#endif
|
2018-09-27 17:55:38 +02:00
|
|
|
|
|
|
|
#ifndef __has_builtin
|
|
|
|
#define __has_builtin(x) 0 /* compatibility with non-clang compilers */
|
|
|
|
#endif
|
|
|
|
|
2018-12-03 14:33:12 +01:00
|
|
|
#if __has_builtin(__builtin_assume_aligned) || !defined(__clang__)
|
2018-09-27 17:55:38 +02:00
|
|
|
#define HAS_ASSUME_ALIGNED
|
|
|
|
#endif
|
2018-09-26 17:48:50 +02:00
|
|
|
|
|
|
|
#ifndef __has_attribute
|
|
|
|
#define __has_attribute(x) 0 /* compatibility with older GCC */
|
|
|
|
#endif
|
|
|
|
|
2022-04-20 15:26:09 +02:00
|
|
|
#if defined(__SANITIZE_ADDRESS__) || __has_feature(address_sanitizer)
|
|
|
|
# define QEMU_SANITIZE_ADDRESS 1
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if defined(__SANITIZE_THREAD__) || __has_feature(thread_sanitizer)
|
|
|
|
# define QEMU_SANITIZE_THREAD 1
|
|
|
|
#endif
|
|
|
|
|
2018-09-26 17:48:50 +02:00
|
|
|
/*
|
|
|
|
* GCC doesn't provide __has_attribute() until GCC 5, but we know all the GCC
|
|
|
|
* versions we support have the "flatten" attribute. Clang may not have the
|
|
|
|
* "flatten" attribute but always has __has_attribute() to check for it.
|
|
|
|
*/
|
|
|
|
#if __has_attribute(flatten) || !defined(__clang__)
|
|
|
|
# define QEMU_FLATTEN __attribute__((flatten))
|
|
|
|
#else
|
|
|
|
# define QEMU_FLATTEN
|
|
|
|
#endif
|
2018-08-16 01:31:47 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* If __attribute__((error)) is present, use it to produce an error at
|
|
|
|
* compile time. Otherwise, one must wait for the linker to diagnose
|
|
|
|
* the missing symbol.
|
|
|
|
*/
|
|
|
|
#if __has_attribute(error)
|
|
|
|
# define QEMU_ERROR(X) __attribute__((error(X)))
|
|
|
|
#else
|
|
|
|
# define QEMU_ERROR(X)
|
|
|
|
#endif
|
2019-01-03 09:56:34 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The nonstring variable attribute specifies that an object or member
|
|
|
|
* declaration with type array of char or pointer to char is intended
|
|
|
|
* to store character arrays that do not necessarily contain a terminating
|
|
|
|
* NUL character. This is useful in detecting uses of such arrays or pointers
|
|
|
|
* with functions that expect NUL-terminated strings, and to avoid warnings
|
|
|
|
* when such an array or pointer is used as an argument to a bounded string
|
|
|
|
* manipulation function such as strncpy.
|
|
|
|
*/
|
|
|
|
#if __has_attribute(nonstring)
|
|
|
|
# define QEMU_NONSTRING __attribute__((nonstring))
|
|
|
|
#else
|
|
|
|
# define QEMU_NONSTRING
|
|
|
|
#endif
|
2019-09-10 18:02:36 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Forced inlining may be desired to encourage constant propagation
|
|
|
|
* of function parameters. However, it can also make debugging harder,
|
|
|
|
* so disable it for a non-optimizing build.
|
|
|
|
*/
|
|
|
|
#if defined(__OPTIMIZE__)
|
|
|
|
#define QEMU_ALWAYS_INLINE __attribute__((always_inline))
|
|
|
|
#else
|
|
|
|
#define QEMU_ALWAYS_INLINE
|
|
|
|
#endif
|
2018-09-27 17:55:38 +02:00
|
|
|
|
2020-12-11 16:24:24 +01:00
|
|
|
/**
|
|
|
|
* In most cases, normal "fallthrough" comments are good enough for
|
|
|
|
* switch-case statements, but sometimes the compiler has problems
|
|
|
|
* with those. In that case you can use QEMU_FALLTHROUGH instead.
|
|
|
|
*/
|
|
|
|
#if __has_attribute(fallthrough)
|
|
|
|
# define QEMU_FALLTHROUGH __attribute__((fallthrough))
|
|
|
|
#else
|
|
|
|
# define QEMU_FALLTHROUGH do {} while (0) /* fallthrough */
|
|
|
|
#endif
|
|
|
|
|
cfi: Initial support for cfi-icall in QEMU
LLVM/Clang, supports runtime checks for forward-edge Control-Flow
Integrity (CFI).
CFI on indirect function calls (cfi-icall) ensures that, in indirect
function calls, the function called is of the right signature for the
pointer type defined at compile time.
For this check to work, the code must always respect the function
signature when using function pointer, the function must be defined
at compile time, and be compiled with link-time optimization.
This rules out, for example, shared libraries that are dynamically loaded
(given that functions are not known at compile time), and code that is
dynamically generated at run-time.
This patch:
1) Introduces the CONFIG_CFI flag to support cfi in QEMU
2) Introduces a decorator to allow the definition of "sensitive"
functions, where a non-instrumented function may be called at runtime
through a pointer. The decorator will take care of disabling cfi-icall
checks on such functions, when cfi is enabled.
3) Marks functions currently in QEMU that exhibit such behavior,
in particular:
- The function in TCG that calls pre-compiled TBs
- The function in TCI that interprets instructions
- Functions in the plugin infrastructures that jump to callbacks
- Functions in util that directly call a signal handler
Signed-off-by: Daniele Buono <dbuono@linux.vnet.ibm.com>
Acked-by: Alex Bennée <alex.bennee@linaro.org
Message-Id: <20201204230615.2392-3-dbuono@linux.vnet.ibm.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
2020-12-05 00:06:12 +01:00
|
|
|
#ifdef CONFIG_CFI
|
|
|
|
/*
|
|
|
|
* If CFI is enabled, use an attribute to disable cfi-icall on the following
|
|
|
|
* function
|
|
|
|
*/
|
|
|
|
#define QEMU_DISABLE_CFI __attribute__((no_sanitize("cfi-icall")))
|
|
|
|
#else
|
|
|
|
/* If CFI is not enabled, use an empty define to not change the behavior */
|
|
|
|
#define QEMU_DISABLE_CFI
|
|
|
|
#endif
|
|
|
|
|
2011-07-11 19:24:44 +02:00
|
|
|
#endif /* COMPILER_H */
|