The __UNIQUE_ID() macro causes problems as it turns out to not be deterministic across different compiler runs as it relies on the __COUNTER__ macro which could have been used on other .h files previous to this .h file being included. This shows up specifically when building with "LTO=thin" vs. "LTO=full" as different build paths seem to be triggered. As the structure name isn't really needed at all here, we were just including it for older compilers that could not handle anonymous structures in a union, just drop the whole thing which resolves the abi naming issue. Bug: 210255585 Reported-by: Giuliano Procida <gprocida@google.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I6b9449fa9d26ffc5d66b2f0f3b41e2d5f3003f68
114 lines
3.6 KiB
C
114 lines
3.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* android_kabi.h - Android kernel abi abstraction header
|
|
*
|
|
* Copyright (C) 2020 Google, Inc.
|
|
*
|
|
* Heavily influenced by rh_kabi.h which came from the RHEL/CENTOS kernel and
|
|
* was:
|
|
* Copyright (c) 2014 Don Zickus
|
|
* Copyright (c) 2015-2018 Jiri Benc
|
|
* Copyright (c) 2015 Sabrina Dubroca, Hannes Frederic Sowa
|
|
* Copyright (c) 2016-2018 Prarit Bhargava
|
|
* Copyright (c) 2017 Paolo Abeni, Larry Woodman
|
|
*
|
|
* These macros are to be used to try to help alleviate future kernel abi
|
|
* changes that will occur as LTS and other kernel patches are merged into the
|
|
* tree during a period in which the kernel abi is wishing to not be disturbed.
|
|
*
|
|
* There are two times these macros should be used:
|
|
* - Before the kernel abi is "frozen"
|
|
* Padding can be added to various kernel structures that have in the past
|
|
* been known to change over time. That will give "room" in the structure
|
|
* that can then be used when fields are added so that the structure size
|
|
* will not change.
|
|
*
|
|
* - After the kernel abi is "frozen"
|
|
* If a structure's field is changed to a type that is identical in size to
|
|
* the previous type, it can be changed with a union macro
|
|
* If a field is added to a structure, the padding fields can be used to add
|
|
* the new field in a "safe" way.
|
|
*/
|
|
#ifndef _ANDROID_KABI_H
|
|
#define _ANDROID_KABI_H
|
|
|
|
#include <linux/compiler.h>
|
|
|
|
/*
|
|
* Worker macros, don't use these, use the ones without a leading '_'
|
|
*/
|
|
|
|
#define __ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new) \
|
|
union { \
|
|
_Static_assert(sizeof(struct{_new;}) <= sizeof(struct{_orig;}), \
|
|
__FILE__ ":" __stringify(__LINE__) ": " \
|
|
__stringify(_new) \
|
|
" is larger than " \
|
|
__stringify(_orig) ); \
|
|
_Static_assert(__alignof__(struct{_new;}) <= __alignof__(struct{_orig;}), \
|
|
__FILE__ ":" __stringify(__LINE__) ": " \
|
|
__stringify(_orig) \
|
|
" is not aligned the same as " \
|
|
__stringify(_new) ); \
|
|
}
|
|
|
|
#ifdef __GENKSYMS__
|
|
|
|
#define _ANDROID_KABI_REPLACE(_orig, _new) _orig
|
|
|
|
#else
|
|
|
|
#define _ANDROID_KABI_REPLACE(_orig, _new) \
|
|
union { \
|
|
_new; \
|
|
struct { \
|
|
_orig; \
|
|
}; \
|
|
__ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new); \
|
|
}
|
|
|
|
#endif /* __GENKSYMS__ */
|
|
|
|
#define _ANDROID_KABI_RESERVE(n) u64 android_kabi_reserved##n
|
|
|
|
|
|
/*
|
|
* Macros to use _before_ the ABI is frozen
|
|
*/
|
|
|
|
/*
|
|
* ANDROID_KABI_RESERVE
|
|
* Reserve some "padding" in a structure for potential future use.
|
|
* This normally placed at the end of a structure.
|
|
* number: the "number" of the padding variable in the structure. Start with
|
|
* 1 and go up.
|
|
*/
|
|
#define ANDROID_KABI_RESERVE(number) _ANDROID_KABI_RESERVE(number)
|
|
|
|
|
|
/*
|
|
* Macros to use _after_ the ABI is frozen
|
|
*/
|
|
|
|
/*
|
|
* ANDROID_KABI_USE(number, _new)
|
|
* Use a previous padding entry that was defined with ANDROID_KABI_RESERVE
|
|
* number: the previous "number" of the padding variable
|
|
* _new: the variable to use now instead of the padding variable
|
|
*/
|
|
#define ANDROID_KABI_USE(number, _new) \
|
|
_ANDROID_KABI_REPLACE(_ANDROID_KABI_RESERVE(number), _new)
|
|
|
|
/*
|
|
* ANDROID_KABI_USE2(number, _new1, _new2)
|
|
* Use a previous padding entry that was defined with ANDROID_KABI_RESERVE for
|
|
* two new variables that fit into 64 bits. This is good for when you do not
|
|
* want to "burn" a 64bit padding variable for a smaller variable size if not
|
|
* needed.
|
|
*/
|
|
#define ANDROID_KABI_USE2(number, _new1, _new2) \
|
|
_ANDROID_KABI_REPLACE(_ANDROID_KABI_RESERVE(number), struct{ _new1; _new2; })
|
|
|
|
|
|
#endif /* _ANDROID_KABI_H */
|