From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Myron Stowe Date: Fri, 29 Jun 2018 20:05:41 -0400 Subject: [PATCH] kABI: Add generic kABI macros to use for kABI workarounds Message-id: <20180629200436.151355.18581.stgit@tak.stowe> Patchwork-id: 223206 O-Subject: [RHEL8.0 PATCH v3] kABI: Add generic kABI macros to use for kABI workarounds Bugzilla: 1546831 RH-Acked-by: Larry Woodman RH-Acked-by: Jarod Wilson Some kernel subsystem maintainers have asked about kABI for RHEL8.0 - getting kABI related "extension" structures and such into place. The consensus was to wait until the 4.17 re-base. Now that that's occurred, lets get this first step, kABI macros, into RHEL8.0 so developers will notice, and use, them in subsequent kABI related efforts. Content taken from RHEL 7. No functional change intended. Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1546831 Brew: https://brewweb.devel.redhat.com/taskinfo?taskID=16694565 Upstream Status: N/A (RHEL only) Testing: Passed through brew build. Upstream Status: RHEL only Signed-off-by: Myron Stowe Signed-off-by: Herton R. Krzesinski --- include/linux/rh_kabi.h | 172 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 include/linux/rh_kabi.h diff --git a/include/linux/rh_kabi.h b/include/linux/rh_kabi.h new file mode 100644 index 000000000000..e0d3353802bb --- /dev/null +++ b/include/linux/rh_kabi.h @@ -0,0 +1,172 @@ +/* + * rh_kabi.h - Red Hat kABI abstraction header + * + * Copyright (c) 2014 Don Zickus + * Copyright (c) 2015-2017 Jiri Benc + * Copyright (c) 2015 Sabrina Dubroca, Hannes Frederic Sowa + * Copyright (c) 2016-2018 Prarit Bhargava + * Copyright (c) 2017 Paolo Abeni, Larry Woodman + * + * This file is released under the GPLv2. + * See the file COPYING for more details. + * + * These kabi macros hide the changes from the kabi checker and from the + * process that computes the exported symbols' checksums. + * They have 2 variants: one (defined under __GENKSYMS__) used when + * generating the checksums, and the other used when building the kernel's + * binaries. + * + * The use of these macros does not guarantee that the usage and modification + * of code is correct. As with all Red Hat only changes, an engineer must + * explain why the use of the macro is valid in the patch containing the + * changes. + * + */ + +#ifndef _LINUX_RH_KABI_H +#define _LINUX_RH_KABI_H + +#include +#include + +/* + * RH_KABI_CONST + * Adds a new const modifier to a function parameter preserving the old + * checksum. + * + * RH_KABI_DEPRECATE + * Mark the element as deprecated and make it unusable by modules while + * preserving kABI checksums. + * + * RH_KABI_DEPRECATE_FN + * Mark the function pointer as deprecated and make it unusable by modules + * while preserving kABI checksums. + * + * RH_KABI_EXTEND + * Simple macro for adding a new element to a struct. + * + * Warning: only use if a hole exists for _all_ arches. Use pahole to verify. + * + * RH_KABI_FILL_HOLE + * Simple macro for filling a hole in a struct. + * + * RH_KABI_RENAME + * Simple macro for renaming an element without changing its type. This + * macro can be used in bitfields, for example. + * + * NOTE: does not include the final ';' + * + * RH_KABI_REPLACE + * Simple replacement of _orig with a union of _orig and _new. + * + * The RH_KABI_REPLACE* macros attempt to add the ability to use the '_new' + * element while preserving size alignment with the '_orig' element. + * + * The #ifdef __GENKSYMS__ preserves the kABI agreement, while the anonymous + * union structure preserves the size alignment (assuming the '_new' element + * is not bigger than the '_orig' element). + * + * RH_KABI_REPLACE_UNSAFE + * Unsafe version of RH_KABI_REPLACE. Only use for typedefs. + * + * RH_KABI_FORCE_CHANGE + * Force change of the symbol checksum. The argument of the macro is a + * version for cases we need to do this more than once. + * + * This macro does the opposite: it changes the symbol checksum without + * actually changing anything about the exported symbol. It is useful for + * symbols that are not whitelisted, we're changing them in an + * incompatible way and want to prevent 3rd party modules to silently + * corrupt memory. Instead, by changing the symbol checksum, such modules + * won't be loaded by the kernel. This macro should only be used as a + * last resort when all other KABI workarounds have failed. + * + * NOTE + * Don't use ';' after these macros as it messes up the kABI checker by + * changing what the resulting token string looks like. Instead let this + * macro add the ';' so it can be properly hidden from the kABI checker + * (mainly for RH_KABI_EXTEND, but applied to all macros for uniformity). + * + */ +#ifdef __GENKSYMS__ + +# define RH_KABI_CONST +# define RH_KABI_EXTEND(_new) +# define RH_KABI_FILL_HOLE(_new) +# define RH_KABI_FORCE_CHANGE(ver) __attribute__((rh_kabi_change ## ver)) +# define RH_KABI_RENAME(_orig, _new) _orig + +# define _RH_KABI_DEPRECATE(_type, _orig) _type _orig +# define _RH_KABI_DEPRECATE_FN(_type, _orig, _args...) _type (*_orig)(_args) +# define _RH_KABI_REPLACE(_orig, _new) _orig +# define _RH_KABI_REPLACE_UNSAFE(_orig, _new) _orig + +#else + +# define RH_KABI_ALIGN_WARNING ". Disable CONFIG_RH_KABI_SIZE_ALIGN_CHECKS if debugging." + +# define RH_KABI_CONST const +# define RH_KABI_EXTEND(_new) _new; +# define RH_KABI_FILL_HOLE(_new) _new; +# define RH_KABI_FORCE_CHANGE(ver) +# define RH_KABI_RENAME(_orig, _new) _new + + +#if IS_BUILTIN(CONFIG_RH_KABI_SIZE_ALIGN_CHECKS) +# define __RH_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) RH_KABI_ALIGN_WARNING); \ + _Static_assert(__alignof__(struct{_new;}) <= __alignof__(struct{_orig;}), \ + __FILE__ ":" __stringify(__LINE__) ": " __stringify(_orig) " is not aligned the same as " __stringify(_new) RH_KABI_ALIGN_WARNING); \ + } +#else +# define __RH_KABI_CHECK_SIZE_ALIGN(_orig, _new) +#endif + +# define _RH_KABI_DEPRECATE(_type, _orig) _type rh_reserved_##_orig +# define _RH_KABI_DEPRECATE_FN(_type, _orig, _args...) \ + _type (* rh_reserved_##_orig)(_args) +# define _RH_KABI_REPLACE(_orig, _new) \ + union { \ + _new; \ + struct { \ + _orig; \ + } __UNIQUE_ID(rh_kabi_hide); \ + __RH_KABI_CHECK_SIZE_ALIGN(_orig, _new); \ + } +# define _RH_KABI_REPLACE_UNSAFE(_orig, _new) _new + +#endif /* __GENKSYMS__ */ + +/* semicolon added wrappers for the RH_KABI_REPLACE macros */ +# define RH_KABI_DEPRECATE(_type, _orig) _RH_KABI_DEPRECATE(_type, _orig); +# define RH_KABI_DEPRECATE_FN(_type, _orig, _args...) \ + _RH_KABI_DEPRECATE_FN(_type, _orig, _args); +# define RH_KABI_REPLACE(_orig, _new) _RH_KABI_REPLACE(_orig, _new); +# define RH_KABI_REPLACE_UNSAFE(_orig, _new) _RH_KABI_REPLACE_UNSAFE(_orig, _new); +/* + * Macro for breaking up a random element into two smaller chunks using an + * anonymous struct inside an anonymous union. + */ +# define RH_KABI_REPLACE2(orig, _new1, _new2) RH_KABI_REPLACE(orig, struct{ _new1; _new2;}) + +# define RH_KABI_RESERVE(n) _RH_KABI_RESERVE(n); +/* + * Simple wrappers to replace standard Red Hat reserved elements. + */ +# define RH_KABI_USE(n, _new) RH_KABI_REPLACE(_RH_KABI_RESERVE(n), _new) +/* + * Macros for breaking up a reserved element into two smaller chunks using + * an anonymous struct inside an anonymous union. + */ +# define RH_KABI_USE2(n, _new1, _new2) RH_KABI_REPLACE(_RH_KABI_RESERVE(n), struct{ _new1; _new2; }) + +/* + * We tried to standardize on Red Hat reserved names. These wrappers + * leverage those common names making it easier to read and find in the + * code. + */ +# define _RH_KABI_RESERVE(n) unsigned long rh_reserved##n + +#endif /* _LINUX_RH_KABI_H */ -- 2.28.0