Skip to content
This repository was archived by the owner on Nov 8, 2023. It is now read-only.

Commit e3e9468

Browse files
myxoidCarlos Llamas
authored andcommitted
ANDROID: update KABI macros for gendwarfksyms
With the transition from genksyms to gendwarfksyms, the mechanisms for achieving stable MODVERSIONS CRCs in the face of "safe" ABI changes are now very different. The macros for padding reservation / use have much the same interface, though the variant specifically for vendors has been dropped as it was barely used. It is no longer possible to use compilation conditional on __GENKSYMS__ to control what is visible to symtypes generation as that now uses DWARF information from a single compilation pass (as opposed to source from a separate preprocessing pass). There are specific macros to deal with common cases like member replacement, enumerator addition and unwanted type definitions. Note that there is as yet no support for dealing with type size changes. Bug: 400972353 Change-Id: Ic9abadadeed6ca8f7be82165f831dab6f34e98d2 Signed-off-by: Giuliano Procida <gprocida@google.com>
1 parent 70c54ee commit e3e9468

File tree

1 file changed

+74
-57
lines changed

1 file changed

+74
-57
lines changed

include/linux/android_kabi.h

Lines changed: 74 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
/*
33
* android_kabi.h - Android kernel abi abstraction header
44
*
5-
* Copyright (C) 2020 Google, Inc.
5+
* Copyright (C) 2020-2025 Google, Inc.
66
*
77
* Heavily influenced by rh_kabi.h which came from the RHEL/CENTOS kernel and
88
* was:
@@ -29,49 +29,49 @@
2929
* If a field is added to a structure, the padding fields can be used to add
3030
* the new field in a "safe" way.
3131
*/
32+
3233
#ifndef _ANDROID_KABI_H
3334
#define _ANDROID_KABI_H
3435

36+
#include <linux/args.h>
3537
#include <linux/compiler.h>
38+
#include <linux/compiler_attributes.h>
3639
#include <linux/stringify.h>
3740

3841
/*
3942
* Worker macros, don't use these, use the ones without a leading '_'
4043
*/
4144

42-
#define __ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new) \
43-
union { \
44-
_Static_assert(sizeof(struct{_new;}) <= sizeof(struct{_orig;}), \
45-
__FILE__ ":" __stringify(__LINE__) ": " \
46-
__stringify(_new) \
47-
" is larger than " \
48-
__stringify(_orig) ); \
49-
_Static_assert(__alignof__(struct{_new;}) <= __alignof__(struct{_orig;}), \
50-
__FILE__ ":" __stringify(__LINE__) ": " \
51-
__stringify(_orig) \
52-
" is not aligned the same as " \
53-
__stringify(_new) ); \
45+
#define _ANDROID_KABI_RULE(hint, target, value) \
46+
static const char CONCATENATE(__gendwarfksyms_rule_, \
47+
__COUNTER__)[] __used __aligned(1) \
48+
__section(".discard.gendwarfksyms.kabi_rules") = \
49+
"1\0" #hint "\0" #target "\0" #value
50+
51+
#define _ANDROID_KABI_NORMAL_SIZE_ALIGN(_orig, _new) \
52+
union { \
53+
_Static_assert( \
54+
sizeof(struct { _new; }) <= \
55+
sizeof(struct { _orig; }), \
56+
FILE_LINE ": " __stringify(_new) \
57+
" is larger than " __stringify(_orig)); \
58+
_Static_assert( \
59+
__alignof__(struct { _new; }) <= \
60+
__alignof__(struct { _orig; }), \
61+
FILE_LINE ": " __stringify(_orig) \
62+
" is not aligned the same as " \
63+
__stringify(_new)); \
5464
}
5565

56-
#ifdef __GENKSYMS__
57-
58-
#define _ANDROID_KABI_REPLACE(_orig, _new) _orig
59-
60-
#else
61-
62-
#define _ANDROID_KABI_REPLACE(_orig, _new) \
63-
union { \
64-
_new; \
65-
struct { \
66-
_orig; \
67-
}; \
68-
__ANDROID_KABI_CHECK_SIZE_ALIGN(_orig, _new); \
66+
#define _ANDROID_KABI_REPLACE(_orig, _new) \
67+
union { \
68+
_new; \
69+
struct { \
70+
_orig; \
71+
}; \
72+
_ANDROID_KABI_NORMAL_SIZE_ALIGN(_orig, _new); \
6973
}
7074

71-
#endif /* __GENKSYMS__ */
72-
73-
#define _ANDROID_KABI_RESERVE(n) u64 __kabi_reserved##n
74-
7575

7676
/*
7777
* Macros to use _before_ the ABI is frozen
@@ -84,44 +84,61 @@
8484
* number: the "number" of the padding variable in the structure. Start with
8585
* 1 and go up.
8686
*/
87-
#ifdef CONFIG_ANDROID_KABI_RESERVE
88-
#define ANDROID_KABI_RESERVE(number) _ANDROID_KABI_RESERVE(number)
89-
#else
90-
#define ANDROID_KABI_RESERVE(number)
91-
#endif
87+
#define ANDROID_KABI_RESERVE(number) u64 __kabi_reserved##number
9288

9389
/*
94-
* ANDROID_KABI_BACKPORT_OK
95-
* Used to allow padding originally reserved with ANDROID_KABI_RESERVE
96-
* to be used for backports of non-LTS patches by partners. These
97-
* fields can by used by replacing with ANDROID_KABI_BACKPORT_USE()
98-
* for partner backports.
90+
* Macros to use _after_ the ABI is frozen
9991
*/
100-
#define ANDROID_KABI_BACKPORT_OK(number) ANDROID_KABI_RESERVE(number)
10192

10293
/*
103-
* Macros to use _after_ the ABI is frozen
94+
* ANDROID_KABI_DECLONLY(fqn)
95+
* Treat the struct/union/enum fqn as a declaration, i.e. even if
96+
* a definition is available, don't expand the contents.
97+
*/
98+
#define ANDROID_KABI_DECLONLY(fqn) _ANDROID_KABI_RULE(declonly, fqn, /**/)
99+
100+
/*
101+
* ANDROID_KABI_ENUMERATOR_IGNORE(fqn, field)
102+
* When expanding enum fqn, skip the provided field. This makes it
103+
* possible to hide added enum fields from versioning.
104+
*/
105+
#define ANDROID_KABI_ENUMERATOR_IGNORE(fqn, field) \
106+
_ANDROID_KABI_RULE(enumerator_ignore, fqn field, /**/)
107+
108+
/*
109+
* ANDROID_KABI_ENUMERATOR_VALUE(fqn, field, value)
110+
* When expanding enum fqn, use the provided value for the
111+
* specified field. This makes it possible to override enumerator
112+
* values when calculating versions.
113+
*/
114+
#define ANDROID_KABI_ENUMERATOR_VALUE(fqn, field, value) \
115+
_ANDROID_KABI_RULE(enumerator_value, fqn field, value)
116+
117+
/*
118+
* ANDROID_KABI_IGNORE
119+
* Add a new field that's ignored in versioning.
120+
*/
121+
#define ANDROID_KABI_IGNORE(n, _new) \
122+
union { \
123+
_new; \
124+
unsigned char __kabi_ignored##n; \
125+
}
126+
127+
/*
128+
* ANDROID_KABI_REPLACE
129+
* Replace a field with a compatible new field.
104130
*/
131+
#define ANDROID_KABI_REPLACE(_oldtype, _oldname, _new) \
132+
_ANDROID_KABI_REPLACE(_oldtype __kabi_renamed##_oldname, struct { _new; })
105133

106134
/*
107135
* ANDROID_KABI_USE(number, _new)
108136
* Use a previous padding entry that was defined with ANDROID_KABI_RESERVE
109137
* number: the previous "number" of the padding variable
110138
* _new: the variable to use now instead of the padding variable
111139
*/
112-
#define ANDROID_KABI_USE(number, _new) \
113-
_ANDROID_KABI_REPLACE(_ANDROID_KABI_RESERVE(number), _new)
114-
115-
/*
116-
* ANDROID_KABI_BACKPORT_USE(number, _new)
117-
* Use a previous padding entry that was defined with
118-
* ANDROID_KABI_BACKPORT_OK(). This is functionally identical
119-
* to ANDROID_KABI_USE() except that it differentiates the
120-
* normal use of KABI fields for LTS from KABI fields that
121-
* were released for use with other backports from upstream.
122-
*/
123-
#define ANDROID_KABI_BACKPORT_USE(number, _new) \
124-
ANDROID_KABI_USE(number, _new)
140+
#define ANDROID_KABI_USE(number, _new) \
141+
_ANDROID_KABI_REPLACE(ANDROID_KABI_RESERVE(number), _new)
125142

126143
/*
127144
* ANDROID_KABI_USE2(number, _new1, _new2)
@@ -130,8 +147,8 @@
130147
* want to "burn" a 64bit padding variable for a smaller variable size if not
131148
* needed.
132149
*/
133-
#define ANDROID_KABI_USE2(number, _new1, _new2) \
134-
_ANDROID_KABI_REPLACE(_ANDROID_KABI_RESERVE(number), struct{ _new1; _new2; })
150+
#define ANDROID_KABI_USE2(number, _new1, _new2) \
151+
_ANDROID_KABI_REPLACE(ANDROID_KABI_RESERVE(number), struct{ _new1; _new2; })
135152

136153

137154
#endif /* _ANDROID_KABI_H */

0 commit comments

Comments
 (0)