From b13e981d72c14ba4c39f85f0d24a8f7947a1b2c4 Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens Date: Sat, 14 Apr 2018 23:00:12 +0200 Subject: [PATCH] tools/mkimage: update to version 2018.03 This activates support for fit images and some other new mkimage features. Some of the patches were applied upstream and could be removed. Signed-off-by: Hauke Mehrtens --- tools/mkimage/Makefile | 21 +- .../patches/010-freebsd-ulong-fix.patch | 6 +- .../030-allow-to-use-different-magic.patch | 78 +- tools/mkimage/patches/040-include_order.patch | 11 - .../patches/050-image_h_portability.patch | 2 +- .../patches/060-remove_kernel_includes.patch | 2 +- .../070-socfpgaimage_portability.patch | 52 -- .../patches/080-remove_compiler_check.patch | 14 +- .../090-reproducible-SOURCE_DATE_EPOCH.patch | 82 -- .../mkimage/patches/100-freebsd-compat.patch | 2 +- .../mkimage/patches/110-fix_musl_build.patch | 67 -- .../patches/200-compiler-support.patch | 702 ------------------ ...00-rsa-sign-add-support-for-libressl.patch | 68 ++ .../patches/210-link-libcrypto-static.patch | 14 + .../patches/210-openssl-1.1.x-compat.patch | 97 --- 15 files changed, 147 insertions(+), 1071 deletions(-) delete mode 100644 tools/mkimage/patches/040-include_order.patch delete mode 100644 tools/mkimage/patches/070-socfpgaimage_portability.patch delete mode 100644 tools/mkimage/patches/090-reproducible-SOURCE_DATE_EPOCH.patch delete mode 100644 tools/mkimage/patches/110-fix_musl_build.patch delete mode 100644 tools/mkimage/patches/200-compiler-support.patch create mode 100644 tools/mkimage/patches/200-rsa-sign-add-support-for-libressl.patch create mode 100644 tools/mkimage/patches/210-link-libcrypto-static.patch delete mode 100644 tools/mkimage/patches/210-openssl-1.1.x-compat.patch diff --git a/tools/mkimage/Makefile b/tools/mkimage/Makefile index 00f85ae272..c7e1dfd672 100644 --- a/tools/mkimage/Makefile +++ b/tools/mkimage/Makefile @@ -7,14 +7,13 @@ include $(TOPDIR)/rules.mk PKG_NAME:=mkimage -PKG_VERSION:=2014.10 +PKG_VERSION:=2018.03 PKG_SOURCE:=u-boot-$(PKG_VERSION).tar.bz2 PKG_SOURCE_URL:=\ http://mirror2.openwrt.org/sources \ ftp://ftp.denx.de/pub/u-boot -PKG_HASH:=d3b132a7a9b3f3182b7aad71c2dfbd4fc15bea83e12c76134eb3ffefc07d1c71 -PKG_CAT:=bzcat +PKG_HASH:=7e7477534409d5368eb1371ffde6820f0f79780a1a1f676161c48442cb303dfd HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/u-boot-$(PKG_VERSION) @@ -22,17 +21,17 @@ include $(INCLUDE_DIR)/host-build.mk define Host/Prepare $(Host/Prepare/Default) - rm -f \ - $(HOST_BUILD_DIR)/include/errno.h \ - $(HOST_BUILD_DIR)/include/malloc.h \ - $(HOST_BUILD_DIR)/tools/.depend - touch $(HOST_BUILD_DIR)/include/config.mk - touch $(HOST_BUILD_DIR)/include/config.h + mkdir -p $(HOST_BUILD_DIR)/include/config + touch $(HOST_BUILD_DIR)/include/config/auto.conf endef define Host/Compile - $(MAKE) -C $(HOST_BUILD_DIR) defconfig HOSTCFLAGS="$(HOST_CPPFLAGS) $(HOST_CFLAGS)" HOSTLDFLAGS="$(HOST_LDFLAGS)" HOST_LOADLIBES="$$$$(pkg-config --static --libs libcrypto)" - $(MAKE) -C $(HOST_BUILD_DIR) tools-only HOSTCFLAGS="$(HOST_CPPFLAGS) $(HOST_CFLAGS)" HOSTLDFLAGS="$(HOST_LDFLAGS)" HOST_LOADLIBES="$$$$(pkg-config --static --libs libcrypto)" + $(MAKE) -C $(HOST_BUILD_DIR) \ + HOSTCFLAGS="$(HOST_CFLAGS)" \ + HOSTLDFLAGS="$(HOST_LDFLAGS)" \ + no-dot-config-targets=tools-only \ + CONFIG_FIT_SIGNATURE=y \ + tools-only endef define Host/Install diff --git a/tools/mkimage/patches/010-freebsd-ulong-fix.patch b/tools/mkimage/patches/010-freebsd-ulong-fix.patch index 1101e72d15..7d891657f8 100644 --- a/tools/mkimage/patches/010-freebsd-ulong-fix.patch +++ b/tools/mkimage/patches/010-freebsd-ulong-fix.patch @@ -1,6 +1,6 @@ --- a/include/image.h +++ b/include/image.h -@@ -44,6 +44,10 @@ struct lmb; +@@ -51,6 +51,10 @@ struct lmb; #endif /* USE_HOSTCC */ @@ -8,6 +8,6 @@ +#define ulong unsigned long +#endif + - #if defined(CONFIG_FIT) + #if IMAGE_ENABLE_FIT #include - #include + #include diff --git a/tools/mkimage/patches/030-allow-to-use-different-magic.patch b/tools/mkimage/patches/030-allow-to-use-different-magic.patch index dcab48894c..c6de9a0aaf 100644 --- a/tools/mkimage/patches/030-allow-to-use-different-magic.patch +++ b/tools/mkimage/patches/030-allow-to-use-different-magic.patch @@ -1,6 +1,6 @@ --- a/tools/mkimage.c +++ b/tools/mkimage.c -@@ -24,6 +24,7 @@ struct image_tool_params params = { +@@ -21,6 +21,7 @@ static struct image_tool_params params = .arch = IH_ARCH_PPC, .type = IH_TYPE_KERNEL, .comp = IH_COMP_GZIP, @@ -8,52 +8,58 @@ .dtc = MKIMAGE_DEFAULT_DTC_OPTIONS, .imagename = "", .imagename2 = "", -@@ -168,6 +169,16 @@ main (int argc, char **argv) - genimg_get_comp_id (*++argv)) < 0) - usage (); - goto NXTARG; -+ case 'M': -+ if (--argc <=0) -+ usage (); -+ params.magic = strtoul (*++argv, &ptr, 16); -+ if (*ptr) { -+ fprintf (stderr, -+ "%s: invalid magic %s\n", -+ params.cmdname, *argv); -+ } -+ goto NXTARG; - case 'D': - if (--argc <= 0) - usage (); -@@ -623,12 +634,13 @@ static void usage(void) - fprintf (stderr, "Usage: %s -l image\n" +@@ -77,11 +78,12 @@ static void usage(const char *msg) " -l ==> list image header information\n", params.cmdname); -- fprintf (stderr, " %s [-x] -A arch -O os -T type -C comp " -+ fprintf (stderr, " %s [-x] -A arch -O os -T type -C comp -M magic " - "-a addr -e ep -n name -d data_file[:data_file...] image\n" - " -A ==> set architecture to 'arch'\n" - " -O ==> set operating system to 'os'\n" - " -T ==> set image type to 'type'\n" - " -C ==> set compression type 'comp'\n" -+ " -M ==> set image magic to 'magic'\n" - " -a ==> set load address to 'addr' (hex)\n" - " -e ==> set entry point to 'ep' (hex)\n" - " -n ==> set image name to 'name'\n" + fprintf(stderr, +- " %s [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image\n" ++ " %s [-x] -A arch -O os -T type -C comp -M magic -a addr -e ep -n name -d data_file[:data_file...] image\n" + " -A ==> set architecture to 'arch'\n" + " -O ==> set operating system to 'os'\n" + " -T ==> set image type to 'type'\n" + " -C ==> set compression type 'comp'\n" ++ " -M ==> set image magic to 'magic'\n" + " -a ==> set load address to 'addr' (hex)\n" + " -e ==> set entry point to 'ep' (hex)\n" + " -n ==> set image name to 'name'\n" +@@ -144,7 +146,7 @@ static void process_args(int argc, char + int opt; + + while ((opt = getopt(argc, argv, +- "a:A:b:c:C:d:D:e:Ef:Fk:i:K:ln:N:p:O:rR:qsT:vVx")) != -1) { ++ "a:A:b:c:C:d:D:e:Ef:Fk:i:K:lM:n:N:p:O:rR:qsT:vVx")) != -1) { + switch (opt) { + case 'a': + params.addr = strtoull(optarg, &ptr, 16); +@@ -222,6 +224,14 @@ static void process_args(int argc, char + case 'l': + params.lflag = 1; + break; ++ case 'M': ++ params.magic = strtoull(optarg, &ptr, 16); ++ if (*ptr) { ++ fprintf(stderr, "%s: invalid magic %s\n", ++ params.cmdname, optarg); ++ exit(EXIT_FAILURE); ++ } ++ break; + case 'n': + params.imagename = optarg; + break; --- a/tools/default_image.c +++ b/tools/default_image.c -@@ -98,7 +98,7 @@ static void image_set_header(void *ptr, - sbuf->st_size - sizeof(image_header_t)); +@@ -106,7 +106,7 @@ static void image_set_header(void *ptr, + imagesize = sbuf->st_size - sizeof(image_header_t); /* Build new header */ - image_set_magic(hdr, IH_MAGIC); + image_set_magic(hdr, params->magic); - image_set_time(hdr, sbuf->st_mtime); - image_set_size(hdr, sbuf->st_size - sizeof(image_header_t)); + image_set_time(hdr, time); + image_set_size(hdr, imagesize); image_set_load(hdr, params->addr); --- a/tools/imagetool.h +++ b/tools/imagetool.h -@@ -44,6 +44,7 @@ struct image_tool_params { +@@ -54,6 +54,7 @@ struct image_tool_params { int arch; int type; int comp; diff --git a/tools/mkimage/patches/040-include_order.patch b/tools/mkimage/patches/040-include_order.patch deleted file mode 100644 index 3b9ecc6bd3..0000000000 --- a/tools/mkimage/patches/040-include_order.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/tools/Makefile -+++ b/tools/Makefile -@@ -194,7 +194,7 @@ endif # !LOGO_BMP - # Define _GNU_SOURCE to obtain the getline prototype from stdio.h - # - HOST_EXTRACFLAGS += -include $(srctree)/include/libfdt_env.h \ -- $(patsubst -I%,-idirafter%, $(filter -I%, $(UBOOTINCLUDE))) \ -+ -I$(srctree)/include \ - -I$(srctree)/lib/libfdt \ - -I$(srctree)/tools \ - -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE) \ diff --git a/tools/mkimage/patches/050-image_h_portability.patch b/tools/mkimage/patches/050-image_h_portability.patch index b3ad27388c..dabab39908 100644 --- a/tools/mkimage/patches/050-image_h_portability.patch +++ b/tools/mkimage/patches/050-image_h_portability.patch @@ -8,7 +8,7 @@ /* Define this to avoid #ifdefs later on */ struct lmb; -@@ -258,13 +257,13 @@ struct lmb; +@@ -308,13 +307,13 @@ enum { * all data in network byte order (aka natural aka bigendian). */ typedef struct image_header { diff --git a/tools/mkimage/patches/060-remove_kernel_includes.patch b/tools/mkimage/patches/060-remove_kernel_includes.patch index fa533cd22d..e61d8cc496 100644 --- a/tools/mkimage/patches/060-remove_kernel_includes.patch +++ b/tools/mkimage/patches/060-remove_kernel_includes.patch @@ -1,6 +1,6 @@ --- a/include/compiler.h +++ b/include/compiler.h -@@ -58,6 +58,11 @@ typedef uint8_t __u8; +@@ -66,6 +66,11 @@ typedef uint8_t __u8; typedef uint16_t __u16; typedef uint32_t __u32; typedef unsigned int uint; diff --git a/tools/mkimage/patches/070-socfpgaimage_portability.patch b/tools/mkimage/patches/070-socfpgaimage_portability.patch deleted file mode 100644 index e273c275d0..0000000000 --- a/tools/mkimage/patches/070-socfpgaimage_portability.patch +++ /dev/null @@ -1,52 +0,0 @@ ---- a/tools/socfpgaimage.c -+++ b/tools/socfpgaimage.c -@@ -74,12 +74,12 @@ static uint16_t hdr_checksum(struct socf - static void build_header(uint8_t *buf, uint8_t version, uint8_t flags, - uint16_t length_bytes) - { -- header.validation = htole32(VALIDATION_WORD); -+ header.validation = cpu_to_le32(VALIDATION_WORD); - header.version = version; - header.flags = flags; -- header.length_u32 = htole16(length_bytes/4); -+ header.length_u32 = cpu_to_le16(length_bytes/4); - header.zero = 0; -- header.checksum = htole16(hdr_checksum(&header)); -+ header.checksum = cpu_to_le16(hdr_checksum(&header)); - - memcpy(buf, &header, sizeof(header)); - } -@@ -92,12 +92,12 @@ static int verify_header(const uint8_t * - { - memcpy(&header, buf, sizeof(header)); - -- if (le32toh(header.validation) != VALIDATION_WORD) -+ if (le32_to_cpu(header.validation) != VALIDATION_WORD) - return -1; -- if (le16toh(header.checksum) != hdr_checksum(&header)) -+ if (le16_to_cpu(header.checksum) != hdr_checksum(&header)) - return -1; - -- return le16toh(header.length_u32) * 4; -+ return le16_to_cpu(header.length_u32) * 4; - } - - /* Sign the buffer and return the signed buffer size */ -@@ -116,7 +116,7 @@ static int sign_buffer(uint8_t *buf, - /* Calculate and apply the CRC */ - calc_crc = ~pbl_crc32(0, (char *)buf, len); - -- *((uint32_t *)(buf + len)) = htole32(calc_crc); -+ *((uint32_t *)(buf + len)) = cpu_to_le32(calc_crc); - - if (!pad_64k) - return len + 4; -@@ -150,7 +150,7 @@ static int verify_buffer(const uint8_t * - - calc_crc = ~pbl_crc32(0, (const char *)buf, len); - -- buf_crc = le32toh(*((uint32_t *)(buf + len))); -+ buf_crc = le32_to_cpu(*((uint32_t *)(buf + len))); - - if (buf_crc != calc_crc) { - fprintf(stderr, "CRC32 does not match (%08x != %08x)\n", diff --git a/tools/mkimage/patches/080-remove_compiler_check.patch b/tools/mkimage/patches/080-remove_compiler_check.patch index 3e71ad5b07..5e0792f25f 100644 --- a/tools/mkimage/patches/080-remove_compiler_check.patch +++ b/tools/mkimage/patches/080-remove_compiler_check.patch @@ -1,8 +1,8 @@ ---- a/include/linux/compiler-gcc4.h -+++ b/include/linux/compiler-gcc4.h -@@ -2,13 +2,6 @@ - #error "Please don't include directly, include instead." - #endif +--- a/include/linux/compiler-gcc.h ++++ b/include/linux/compiler-gcc.h +@@ -146,13 +146,6 @@ + + #if GCC_VERSION >= 40000 -/* GCC 4.1.[01] miscompiles __weak */ -#ifdef __KERNEL__ @@ -12,5 +12,5 @@ -#endif - #define __used __attribute__((__used__)) - #define __must_check __attribute__((warn_unused_result)) - #define __compiler_offsetof(a,b) __builtin_offsetof(a,b) + #define __compiler_offsetof(a, b) \ + __builtin_offsetof(a, b) diff --git a/tools/mkimage/patches/090-reproducible-SOURCE_DATE_EPOCH.patch b/tools/mkimage/patches/090-reproducible-SOURCE_DATE_EPOCH.patch deleted file mode 100644 index c238fd62ed..0000000000 --- a/tools/mkimage/patches/090-reproducible-SOURCE_DATE_EPOCH.patch +++ /dev/null @@ -1,82 +0,0 @@ -From f3f431a712729a1af94d01bd1bfde17a252ff02c Mon Sep 17 00:00:00 2001 -From: Paul Kocialkowski -Date: Sun, 26 Jul 2015 18:48:15 +0200 -Subject: [PATCH] Reproducible U-Boot build support, using SOURCE_DATE_EPOCH - -In order to achieve reproducible builds in U-Boot, timestamps that are defined -at build-time have to be somewhat eliminated. The SOURCE_DATE_EPOCH environment -variable allows setting a fixed value for those timestamps. - -Simply by setting SOURCE_DATE_EPOCH to a fixed value, a number of targets can be -built reproducibly. This is the case for e.g. sunxi devices. - -However, some other devices might need some more tweaks, especially regarding -the image generation tools. - -Signed-off-by: Paul Kocialkowski ---- - Makefile | 7 ++++--- - README | 12 ++++++++++++ - tools/default_image.c | 21 ++++++++++++++++++++- - 3 files changed, 36 insertions(+), 4 deletions(-) - ---- a/README -+++ b/README -@@ -4928,6 +4928,18 @@ within that device. - normal addressable memory via the LBC. CONFIG_SYS_LS_MC_FW_ADDR is the - virtual address in NOR flash. - -+Reproducible builds -+------------------- -+ -+In order to achieve reproducible builds, timestamps used in the U-Boot build -+process have to be set to a fixed value. -+ -+This is done using the SOURCE_DATE_EPOCH environment variable. -+SOURCE_DATE_EPOCH is to be set on the build host's shell, not as a configuration -+option for U-Boot or an environment variable in U-Boot. -+ -+SOURCE_DATE_EPOCH should be set to a number of seconds since the epoch, in UTC. -+ - Building the Software: - ====================== - ---- a/tools/default_image.c -+++ b/tools/default_image.c -@@ -89,6 +89,9 @@ static void image_set_header(void *ptr, - struct image_tool_params *params) - { - uint32_t checksum; -+ char *source_date_epoch; -+ struct tm *time_universal; -+ time_t time; - - image_header_t * hdr = (image_header_t *)ptr; - -@@ -97,9 +100,25 @@ static void image_set_header(void *ptr, - sizeof(image_header_t)), - sbuf->st_size - sizeof(image_header_t)); - -+ source_date_epoch = getenv("SOURCE_DATE_EPOCH"); -+ if (source_date_epoch != NULL) { -+ time = (time_t) strtol(source_date_epoch, NULL, 10); -+ -+ time_universal = gmtime(&time); -+ if (time_universal == NULL) { -+ fprintf(stderr, "%s: SOURCE_DATE_EPOCH is not valid\n", -+ __func__); -+ time = 0; -+ } else { -+ time = mktime(time_universal); -+ } -+ } else { -+ time = sbuf->st_mtime; -+ } -+ - /* Build new header */ - image_set_magic(hdr, params->magic); -- image_set_time(hdr, sbuf->st_mtime); -+ image_set_time(hdr, time); - image_set_size(hdr, sbuf->st_size - sizeof(image_header_t)); - image_set_load(hdr, params->addr); - image_set_ep(hdr, params->ep); diff --git a/tools/mkimage/patches/100-freebsd-compat.patch b/tools/mkimage/patches/100-freebsd-compat.patch index e014af5708..1567285714 100644 --- a/tools/mkimage/patches/100-freebsd-compat.patch +++ b/tools/mkimage/patches/100-freebsd-compat.patch @@ -1,6 +1,6 @@ --- a/Makefile +++ b/Makefile -@@ -584,7 +584,10 @@ UBOOTINCLUDE := \ +@@ -634,7 +634,10 @@ UBOOTINCLUDE := \ -I$(srctree)/arch/$(ARCH)/include \ -include $(srctree)/include/linux/kconfig.h diff --git a/tools/mkimage/patches/110-fix_musl_build.patch b/tools/mkimage/patches/110-fix_musl_build.patch deleted file mode 100644 index 13f7ab0431..0000000000 --- a/tools/mkimage/patches/110-fix_musl_build.patch +++ /dev/null @@ -1,67 +0,0 @@ -From: Jörg Krause -Date: Wed, 22 Apr 2015 19:36:22 +0000 (+0200) -Subject: Fix musl build -X-Git-Tag: v2015.07-rc2~281 -X-Git-Url: http://git.denx.de/?p=u-boot.git;a=commitdiff_plain;h=26e355d131a6b56ea78a156c1cee4f6ba0500b37;hp=1cdd9412002000aafcfb6f10cd02069adc66ba49 - -Fix musl build - -This patch fixes cross-compiling U-Boot tools with the musl C library: - * including is needed for ulong - * defining _GNU_SOURCE is needed for loff_t - -Tested for target at91sam9261ek_dataflash_cs3. - -Signed-off-by: Jörg Krause -Cc: Tom Rini ---- - -diff --git a/include/image.h b/include/image.h -index 3844be6..60b924a 100644 ---- a/include/image.h -+++ b/include/image.h -@@ -23,6 +23,7 @@ - struct lmb; - - #ifdef USE_HOSTCC -+#include - - /* new uImage format support enabled on host */ - #define CONFIG_FIT 1 -diff --git a/tools/env/fw_env.c b/tools/env/fw_env.c -index 1173eea..daa02a7 100644 ---- a/tools/env/fw_env.c -+++ b/tools/env/fw_env.c -@@ -8,6 +8,8 @@ - * SPDX-License-Identifier: GPL-2.0+ - */ - -+#define _GNU_SOURCE -+ - #include - #include - #include -diff --git a/tools/imagetool.h b/tools/imagetool.h -index 3e15b4e..b7874f4 100644 ---- a/tools/imagetool.h -+++ b/tools/imagetool.h -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - #include - #include - #include -diff --git a/tools/proftool.c b/tools/proftool.c -index 3482951..9ce7a77 100644 ---- a/tools/proftool.c -+++ b/tools/proftool.c -@@ -16,6 +16,7 @@ - #include - #include - #include -+#include - - #include - #include diff --git a/tools/mkimage/patches/200-compiler-support.patch b/tools/mkimage/patches/200-compiler-support.patch deleted file mode 100644 index ca9c5b5a30..0000000000 --- a/tools/mkimage/patches/200-compiler-support.patch +++ /dev/null @@ -1,702 +0,0 @@ -diff --git b/include/linux/compiler-gcc.h a/include/linux/compiler-gcc.h -index e057bd2..22ab246 100644 ---- b/include/linux/compiler-gcc.h -+++ a/include/linux/compiler-gcc.h -@@ -5,14 +5,28 @@ - /* - * Common definitions for all gcc versions go here. - */ --#define GCC_VERSION (__GNUC__ * 10000 \ -- + __GNUC_MINOR__ * 100 \ -- + __GNUC_PATCHLEVEL__) -- -+#define GCC_VERSION (__GNUC__ * 10000 \ -+ + __GNUC_MINOR__ * 100 \ -+ + __GNUC_PATCHLEVEL__) - - /* Optimization barrier */ -+ - /* The "volatile" is due to gcc bugs */ - #define barrier() __asm__ __volatile__("": : :"memory") -+/* -+ * This version is i.e. to prevent dead stores elimination on @ptr -+ * where gcc and llvm may behave differently when otherwise using -+ * normal barrier(): while gcc behavior gets along with a normal -+ * barrier(), llvm needs an explicit input variable to be assumed -+ * clobbered. The issue is as follows: while the inline asm might -+ * access any memory it wants, the compiler could have fit all of -+ * @ptr into memory registers instead, and since @ptr never escaped -+ * from that, it proofed that the inline asm wasn't touching any of -+ * it. This version works well with both compilers, i.e. we're telling -+ * the compiler that the inline asm absolutely may see the contents -+ * of @ptr. See also: https://llvm.org/bugs/show_bug.cgi?id=15495 -+ */ -+#define barrier_data(ptr) __asm__ __volatile__("": :"r"(ptr) :"memory") - - /* - * This macro obfuscates arithmetic on a variable address so that gcc -@@ -32,58 +46,63 @@ - * the inline assembly constraint from =g to =r, in this particular - * case either is valid. - */ --#define RELOC_HIDE(ptr, off) \ -- ({ unsigned long __ptr; \ -- __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ -- (typeof(ptr)) (__ptr + (off)); }) -+#define RELOC_HIDE(ptr, off) \ -+({ \ -+ unsigned long __ptr; \ -+ __asm__ ("" : "=r"(__ptr) : "0"(ptr)); \ -+ (typeof(ptr)) (__ptr + (off)); \ -+}) - - /* Make the optimizer believe the variable can be manipulated arbitrarily. */ --#define OPTIMIZER_HIDE_VAR(var) __asm__ ("" : "=r" (var) : "0" (var)) -+#define OPTIMIZER_HIDE_VAR(var) \ -+ __asm__ ("" : "=r" (var) : "0" (var)) - - #ifdef __CHECKER__ --#define __must_be_array(arr) 0 -+#define __must_be_array(a) 0 - #else - /* &a[0] degrades to a pointer: a different type from an array */ --#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) -+#define __must_be_array(a) BUILD_BUG_ON_ZERO(__same_type((a), &(a)[0])) - #endif - - /* - * Force always-inline if the user requests it so via the .config, - * or if gcc is too old: - */ --#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ -+#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \ - !defined(CONFIG_OPTIMIZE_INLINING) || (__GNUC__ < 4) --# define inline inline __attribute__((always_inline)) notrace --# define __inline__ __inline__ __attribute__((always_inline)) notrace --# define __inline __inline __attribute__((always_inline)) notrace -+#define inline inline __attribute__((always_inline)) notrace -+#define __inline__ __inline__ __attribute__((always_inline)) notrace -+#define __inline __inline __attribute__((always_inline)) notrace - #else - /* A lot of inline functions can cause havoc with function tracing */ --# define inline inline notrace --# define __inline__ __inline__ notrace --# define __inline __inline notrace -+#define inline inline notrace -+#define __inline__ __inline__ notrace -+#define __inline __inline notrace - #endif - --#define __deprecated __attribute__((deprecated)) --#ifndef __packed --#define __packed __attribute__((packed)) --#endif --#ifndef __weak --#define __weak __attribute__((weak)) --#endif -+#define __always_inline inline __attribute__((always_inline)) -+#define noinline __attribute__((noinline)) -+ -+#define __deprecated __attribute__((deprecated)) -+#define __packed __attribute__((packed)) -+#define __weak __attribute__((weak)) -+#define __alias(symbol) __attribute__((alias(#symbol))) - - /* -- * it doesn't make sense on ARM (currently the only user of __naked) to trace -- * naked functions because then mcount is called without stack and frame pointer -- * being set up and there is no chance to restore the lr register to the value -- * before mcount was called. -+ * it doesn't make sense on ARM (currently the only user of __naked) -+ * to trace naked functions because then mcount is called without -+ * stack and frame pointer being set up and there is no chance to -+ * restore the lr register to the value before mcount was called. -+ * -+ * The asm() bodies of naked functions often depend on standard calling -+ * conventions, therefore they must be noinline and noclone. - * -- * The asm() bodies of naked functions often depend on standard calling conventions, -- * therefore they must be noinline and noclone. GCC 4.[56] currently fail to enforce -- * this, so we must do so ourselves. See GCC PR44290. -+ * GCC 4.[56] currently fail to enforce this, so we must do so ourselves. -+ * See GCC PR44290. - */ --#define __naked __attribute__((naked)) noinline __noclone notrace -+#define __naked __attribute__((naked)) noinline __noclone notrace - --#define __noreturn __attribute__((noreturn)) -+#define __noreturn __attribute__((noreturn)) - - /* - * From the GCC manual: -@@ -95,34 +114,170 @@ - * would be. - * [...] - */ --#ifndef __pure --#define __pure __attribute__((pure)) -+#define __pure __attribute__((pure)) -+#define __aligned(x) __attribute__((aligned(x))) -+#define __printf(a, b) __attribute__((format(printf, a, b))) -+#define __scanf(a, b) __attribute__((format(scanf, a, b))) -+#define __attribute_const__ __attribute__((__const__)) -+#define __maybe_unused __attribute__((unused)) -+#define __always_unused __attribute__((unused)) -+ -+/* gcc version specific checks */ -+ -+#if GCC_VERSION < 30200 -+# error Sorry, your compiler is too old - please upgrade it. -+#endif -+ -+#if GCC_VERSION < 30300 -+# define __used __attribute__((__unused__)) -+#else -+# define __used __attribute__((__used__)) -+#endif -+ -+#ifdef CONFIG_GCOV_KERNEL -+# if GCC_VERSION < 30400 -+# error "GCOV profiling support for gcc versions below 3.4 not included" -+# endif /* __GNUC_MINOR__ */ -+#endif /* CONFIG_GCOV_KERNEL */ -+ -+#if GCC_VERSION >= 30400 -+#define __must_check __attribute__((warn_unused_result)) -+#endif -+ -+#if GCC_VERSION >= 40000 -+ -+/* GCC 4.1.[01] miscompiles __weak */ -+#ifdef __KERNEL__ -+# if GCC_VERSION >= 40100 && GCC_VERSION <= 40101 -+# error Your version of gcc miscompiles the __weak directive -+# endif -+#endif -+ -+#define __used __attribute__((__used__)) -+#define __compiler_offsetof(a, b) \ -+ __builtin_offsetof(a, b) -+ -+#if GCC_VERSION >= 40100 && GCC_VERSION < 40600 -+# define __compiletime_object_size(obj) __builtin_object_size(obj, 0) -+#endif -+ -+#if GCC_VERSION >= 40300 -+/* Mark functions as cold. gcc will assume any path leading to a call -+ * to them will be unlikely. This means a lot of manual unlikely()s -+ * are unnecessary now for any paths leading to the usual suspects -+ * like BUG(), printk(), panic() etc. [but let's keep them for now for -+ * older compilers] -+ * -+ * Early snapshots of gcc 4.3 don't support this and we can't detect this -+ * in the preprocessor, but we can live with this because they're unreleased. -+ * Maketime probing would be overkill here. -+ * -+ * gcc also has a __attribute__((__hot__)) to move hot functions into -+ * a special section, but I don't see any sense in this right now in -+ * the kernel context -+ */ -+#define __cold __attribute__((__cold__)) -+ -+#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) -+ -+#ifndef __CHECKER__ -+# define __compiletime_warning(message) __attribute__((warning(message))) -+# define __compiletime_error(message) __attribute__((error(message))) -+#endif /* __CHECKER__ */ -+#endif /* GCC_VERSION >= 40300 */ -+ -+#if GCC_VERSION >= 40500 -+/* -+ * Mark a position in code as unreachable. This can be used to -+ * suppress control flow warnings after asm blocks that transfer -+ * control elsewhere. -+ * -+ * Early snapshots of gcc 4.5 don't support this and we can't detect -+ * this in the preprocessor, but we can live with this because they're -+ * unreleased. Really, we need to have autoconf for the kernel. -+ */ -+#define unreachable() __builtin_unreachable() -+ -+/* Mark a function definition as prohibited from being cloned. */ -+#define __noclone __attribute__((__noclone__)) -+ -+#endif /* GCC_VERSION >= 40500 */ -+ -+#if GCC_VERSION >= 40600 -+/* -+ * When used with Link Time Optimization, gcc can optimize away C functions or -+ * variables which are referenced only from assembly code. __visible tells the -+ * optimizer that something else uses this function or variable, thus preventing -+ * this. -+ */ -+#define __visible __attribute__((externally_visible)) - #endif --#ifndef __aligned --#define __aligned(x) __attribute__((aligned(x))) -+ -+ -+#if GCC_VERSION >= 40900 && !defined(__CHECKER__) -+/* -+ * __assume_aligned(n, k): Tell the optimizer that the returned -+ * pointer can be assumed to be k modulo n. The second argument is -+ * optional (default 0), so we use a variadic macro to make the -+ * shorthand. -+ * -+ * Beware: Do not apply this to functions which may return -+ * ERR_PTRs. Also, it is probably unwise to apply it to functions -+ * returning extra information in the low bits (but in that case the -+ * compiler should see some alignment anyway, when the return value is -+ * massaged by 'flags = ptr & 3; ptr &= ~3;'). -+ */ -+#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__))) - #endif --#define __printf(a, b) __attribute__((format(printf, a, b))) --#define __scanf(a, b) __attribute__((format(scanf, a, b))) --#define noinline __attribute__((noinline)) --#define __attribute_const__ __attribute__((__const__)) --#define __maybe_unused __attribute__((unused)) --#define __always_unused __attribute__((unused)) - --#define __gcc_header(x) #x --#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h) --#define gcc_header(x) _gcc_header(x) --#include gcc_header(__GNUC__) -+/* -+ * GCC 'asm goto' miscompiles certain code sequences: -+ * -+ * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 -+ * -+ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. -+ * -+ * (asm goto is automatically volatile - the naming reflects this.) -+ */ -+#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) -+ -+#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP -+#if GCC_VERSION >= 40400 -+#define __HAVE_BUILTIN_BSWAP32__ -+#define __HAVE_BUILTIN_BSWAP64__ -+#endif -+#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600) -+#define __HAVE_BUILTIN_BSWAP16__ -+#endif -+#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ -+ -+#if GCC_VERSION >= 50000 -+#define KASAN_ABI_VERSION 4 -+#elif GCC_VERSION >= 40902 -+#define KASAN_ABI_VERSION 3 -+#endif -+ -+#if GCC_VERSION >= 40902 -+/* -+ * Tell the compiler that address safety instrumentation (KASAN) -+ * should not be applied to that function. -+ * Conflicts with inlining: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 -+ */ -+#define __no_sanitize_address __attribute__((no_sanitize_address)) -+#endif -+ -+#endif /* gcc version >= 40000 specific checks */ - - #if !defined(__noclone) - #define __noclone /* not needed */ - #endif - -+#if !defined(__no_sanitize_address) -+#define __no_sanitize_address -+#endif -+ - /* - * A trick to suppress uninitialized variable warning without generating any - * code - */ - #define uninitialized_var(x) x = x -- --#ifndef __always_inline --#define __always_inline inline __attribute__((always_inline)) --#endif -diff --git b/include/linux/compiler-gcc3.h a/include/linux/compiler-gcc3.h -deleted file mode 100644 -index 7d89feb..0000000 ---- b/include/linux/compiler-gcc3.h -+++ /dev/null -@@ -1,23 +0,0 @@ --#ifndef __LINUX_COMPILER_H --#error "Please don't include directly, include instead." --#endif -- --#if GCC_VERSION < 30200 --# error Sorry, your compiler is too old - please upgrade it. --#endif -- --#if GCC_VERSION >= 30300 --# define __used __attribute__((__used__)) --#else --# define __used __attribute__((__unused__)) --#endif -- --#if GCC_VERSION >= 30400 --#define __must_check __attribute__((warn_unused_result)) --#endif -- --#ifdef CONFIG_GCOV_KERNEL --# if GCC_VERSION < 30400 --# error "GCOV profiling support for gcc versions below 3.4 not included" --# endif /* __GNUC_MINOR__ */ --#endif /* CONFIG_GCOV_KERNEL */ -diff --git b/include/linux/compiler-gcc4.h a/include/linux/compiler-gcc4.h -deleted file mode 100644 -index c982a09..0000000 ---- b/include/linux/compiler-gcc4.h -+++ /dev/null -@@ -1,81 +0,0 @@ --#ifndef __LINUX_COMPILER_H --#error "Please don't include directly, include instead." --#endif -- --#define __used __attribute__((__used__)) --#define __must_check __attribute__((warn_unused_result)) --#define __compiler_offsetof(a,b) __builtin_offsetof(a,b) -- --#if GCC_VERSION >= 40100 && GCC_VERSION < 40600 --# define __compiletime_object_size(obj) __builtin_object_size(obj, 0) --#endif -- --#if GCC_VERSION >= 40300 --/* Mark functions as cold. gcc will assume any path leading to a call -- to them will be unlikely. This means a lot of manual unlikely()s -- are unnecessary now for any paths leading to the usual suspects -- like BUG(), printk(), panic() etc. [but let's keep them for now for -- older compilers] -- -- Early snapshots of gcc 4.3 don't support this and we can't detect this -- in the preprocessor, but we can live with this because they're unreleased. -- Maketime probing would be overkill here. -- -- gcc also has a __attribute__((__hot__)) to move hot functions into -- a special section, but I don't see any sense in this right now in -- the kernel context */ --#define __cold __attribute__((__cold__)) -- --#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__) -- --#ifndef __CHECKER__ --# define __compiletime_warning(message) __attribute__((warning(message))) --# define __compiletime_error(message) __attribute__((error(message))) --#endif /* __CHECKER__ */ --#endif /* GCC_VERSION >= 40300 */ -- --#if GCC_VERSION >= 40500 --/* -- * Mark a position in code as unreachable. This can be used to -- * suppress control flow warnings after asm blocks that transfer -- * control elsewhere. -- * -- * Early snapshots of gcc 4.5 don't support this and we can't detect -- * this in the preprocessor, but we can live with this because they're -- * unreleased. Really, we need to have autoconf for the kernel. -- */ --#define unreachable() __builtin_unreachable() -- --/* Mark a function definition as prohibited from being cloned. */ --#define __noclone __attribute__((__noclone__)) -- --#endif /* GCC_VERSION >= 40500 */ -- --#if GCC_VERSION >= 40600 --/* -- * Tell the optimizer that something else uses this function or variable. -- */ --#define __visible __attribute__((externally_visible)) --#endif -- --/* -- * GCC 'asm goto' miscompiles certain code sequences: -- * -- * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 -- * -- * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. -- * Fixed in GCC 4.8.2 and later versions. -- * -- * (asm goto is automatically volatile - the naming reflects this.) -- */ --#define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) -- --#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP --#if GCC_VERSION >= 40400 --#define __HAVE_BUILTIN_BSWAP32__ --#define __HAVE_BUILTIN_BSWAP64__ --#endif --#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600) --#define __HAVE_BUILTIN_BSWAP16__ --#endif --#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */ -diff --git b/include/linux/compiler-intel.h a/include/linux/compiler-intel.h -index ba147a1..d4c7113 100644 ---- b/include/linux/compiler-intel.h -+++ a/include/linux/compiler-intel.h -@@ -13,9 +13,14 @@ - /* Intel ECC compiler doesn't support gcc specific asm stmts. - * It uses intrinsics to do the equivalent things. - */ -+#undef barrier -+#undef barrier_data - #undef RELOC_HIDE - #undef OPTIMIZER_HIDE_VAR - -+#define barrier() __memory_barrier() -+#define barrier_data(ptr) barrier() -+ - #define RELOC_HIDE(ptr, off) \ - ({ unsigned long __ptr; \ - __ptr = (unsigned long) (ptr); \ -diff --git b/include/linux/compiler.h a/include/linux/compiler.h -index d5ad7b1..020ad16 100644 ---- b/include/linux/compiler.h -+++ a/include/linux/compiler.h -@@ -17,6 +17,7 @@ - # define __release(x) __context__(x,-1) - # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) - # define __percpu __attribute__((noderef, address_space(3))) -+# define __pmem __attribute__((noderef, address_space(5))) - #ifdef CONFIG_SPARSE_RCU_POINTER - # define __rcu __attribute__((noderef, address_space(4))) - #else -@@ -42,6 +43,7 @@ extern void __chk_io_ptr(const volatile void __iomem *); - # define __cond_lock(x,c) (c) - # define __percpu - # define __rcu -+# define __pmem - #endif - - /* Indirect macros required for expanded argument pasting, eg. __LINE__. */ -@@ -54,7 +56,11 @@ extern void __chk_io_ptr(const volatile void __iomem *); - #include - #endif - -+#if defined(CC_USING_HOTPATCH) && !defined(__CHECKER__) -+#define notrace __attribute__((hotpatch(0,0))) -+#else - #define notrace __attribute__((no_instrument_function)) -+#endif - - /* Intel compiler defines __GNUC__. So we will overwrite implementations - * coming from above header files here -@@ -138,7 +144,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); - */ - #define if(cond, ...) __trace_if( (cond , ## __VA_ARGS__) ) - #define __trace_if(cond) \ -- if (__builtin_constant_p((cond)) ? !!(cond) : \ -+ if (__builtin_constant_p(!!(cond)) ? !!(cond) : \ - ({ \ - int ______r; \ - static struct ftrace_branch_data \ -@@ -165,6 +171,10 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); - # define barrier() __memory_barrier() - #endif - -+#ifndef barrier_data -+# define barrier_data(ptr) barrier() -+#endif -+ - /* Unreachable code */ - #ifndef unreachable - # define unreachable() do { } while (1) -@@ -186,6 +196,126 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); - # define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __LINE__) - #endif - -+#include -+ -+#define __READ_ONCE_SIZE \ -+({ \ -+ switch (size) { \ -+ case 1: *(__u8 *)res = *(volatile __u8 *)p; break; \ -+ case 2: *(__u16 *)res = *(volatile __u16 *)p; break; \ -+ case 4: *(__u32 *)res = *(volatile __u32 *)p; break; \ -+ case 8: *(__u64 *)res = *(volatile __u64 *)p; break; \ -+ default: \ -+ barrier(); \ -+ __builtin_memcpy((void *)res, (const void *)p, size); \ -+ barrier(); \ -+ } \ -+}) -+ -+static __always_inline -+void __read_once_size(const volatile void *p, void *res, int size) -+{ -+ __READ_ONCE_SIZE; -+} -+ -+#ifdef CONFIG_KASAN -+/* -+ * This function is not 'inline' because __no_sanitize_address confilcts -+ * with inlining. Attempt to inline it may cause a build failure. -+ * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67368 -+ * '__maybe_unused' allows us to avoid defined-but-not-used warnings. -+ */ -+static __no_sanitize_address __maybe_unused -+void __read_once_size_nocheck(const volatile void *p, void *res, int size) -+{ -+ __READ_ONCE_SIZE; -+} -+#else -+static __always_inline -+void __read_once_size_nocheck(const volatile void *p, void *res, int size) -+{ -+ __READ_ONCE_SIZE; -+} -+#endif -+ -+static __always_inline void __write_once_size(volatile void *p, void *res, int size) -+{ -+ switch (size) { -+ case 1: *(volatile __u8 *)p = *(__u8 *)res; break; -+ case 2: *(volatile __u16 *)p = *(__u16 *)res; break; -+ case 4: *(volatile __u32 *)p = *(__u32 *)res; break; -+ case 8: *(volatile __u64 *)p = *(__u64 *)res; break; -+ default: -+ barrier(); -+ __builtin_memcpy((void *)p, (const void *)res, size); -+ barrier(); -+ } -+} -+ -+/* -+ * Prevent the compiler from merging or refetching reads or writes. The -+ * compiler is also forbidden from reordering successive instances of -+ * READ_ONCE, WRITE_ONCE and ACCESS_ONCE (see below), but only when the -+ * compiler is aware of some particular ordering. One way to make the -+ * compiler aware of ordering is to put the two invocations of READ_ONCE, -+ * WRITE_ONCE or ACCESS_ONCE() in different C statements. -+ * -+ * In contrast to ACCESS_ONCE these two macros will also work on aggregate -+ * data types like structs or unions. If the size of the accessed data -+ * type exceeds the word size of the machine (e.g., 32 bits or 64 bits) -+ * READ_ONCE() and WRITE_ONCE() will fall back to memcpy and print a -+ * compile-time warning. -+ * -+ * Their two major use cases are: (1) Mediating communication between -+ * process-level code and irq/NMI handlers, all running on the same CPU, -+ * and (2) Ensuring that the compiler does not fold, spindle, or otherwise -+ * mutilate accesses that either do not require ordering or that interact -+ * with an explicit memory barrier or atomic instruction that provides the -+ * required ordering. -+ */ -+ -+#define __READ_ONCE(x, check) \ -+({ \ -+ union { typeof(x) __val; char __c[1]; } __u; \ -+ if (check) \ -+ __read_once_size(&(x), __u.__c, sizeof(x)); \ -+ else \ -+ __read_once_size_nocheck(&(x), __u.__c, sizeof(x)); \ -+ __u.__val; \ -+}) -+#define READ_ONCE(x) __READ_ONCE(x, 1) -+ -+/* -+ * Use READ_ONCE_NOCHECK() instead of READ_ONCE() if you need -+ * to hide memory access from KASAN. -+ */ -+#define READ_ONCE_NOCHECK(x) __READ_ONCE(x, 0) -+ -+#define WRITE_ONCE(x, val) \ -+({ \ -+ union { typeof(x) __val; char __c[1]; } __u = \ -+ { .__val = (__force typeof(x)) (val) }; \ -+ __write_once_size(&(x), __u.__c, sizeof(x)); \ -+ __u.__val; \ -+}) -+ -+/** -+ * smp_cond_acquire() - Spin wait for cond with ACQUIRE ordering -+ * @cond: boolean expression to wait for -+ * -+ * Equivalent to using smp_load_acquire() on the condition variable but employs -+ * the control dependency of the wait to reduce the barrier on many platforms. -+ * -+ * The control dependency provides a LOAD->STORE order, the additional RMB -+ * provides LOAD->LOAD order, together they provide LOAD->{LOAD,STORE} order, -+ * aka. ACQUIRE. -+ */ -+#define smp_cond_acquire(cond) do { \ -+ while (!(cond)) \ -+ cpu_relax(); \ -+ smp_rmb(); /* ctrl + rmb := acquire */ \ -+} while (0) -+ - #endif /* __KERNEL__ */ - - #endif /* __ASSEMBLY__ */ -@@ -304,6 +434,14 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); - #define __visible - #endif - -+/* -+ * Assume alignment of return value. -+ */ -+#ifndef __assume_aligned -+#define __assume_aligned(a, ...) -+#endif -+ -+ - /* Are two types/vars the same type (ignoring qualifiers)? */ - #ifndef __same_type - # define __same_type(a, b) __builtin_types_compatible_p(typeof(a), typeof(b)) -@@ -311,7 +449,7 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); - - /* Is this type a native word size -- useful for atomic operations */ - #ifndef __native_word --# define __native_word(t) (sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) -+# define __native_word(t) (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) - #endif - - /* Compile time object size, -1 for unknown */ -@@ -373,12 +511,38 @@ void ftrace_likely_update(struct ftrace_branch_data *f, int val, int expect); - * to make the compiler aware of ordering is to put the two invocations of - * ACCESS_ONCE() in different C statements. - * -- * This macro does absolutely -nothing- to prevent the CPU from reordering, -- * merging, or refetching absolutely anything at any time. Its main intended -- * use is to mediate communication between process-level code and irq/NMI -- * handlers, all running on the same CPU. -+ * ACCESS_ONCE will only work on scalar types. For union types, ACCESS_ONCE -+ * on a union member will work as long as the size of the member matches the -+ * size of the union and the size is smaller than word size. -+ * -+ * The major use cases of ACCESS_ONCE used to be (1) Mediating communication -+ * between process-level code and irq/NMI handlers, all running on the same CPU, -+ * and (2) Ensuring that the compiler does not fold, spindle, or otherwise -+ * mutilate accesses that either do not require ordering or that interact -+ * with an explicit memory barrier or atomic instruction that provides the -+ * required ordering. -+ * -+ * If possible use READ_ONCE()/WRITE_ONCE() instead. -+ */ -+#define __ACCESS_ONCE(x) ({ \ -+ __maybe_unused typeof(x) __var = (__force typeof(x)) 0; \ -+ (volatile typeof(x) *)&(x); }) -+#define ACCESS_ONCE(x) (*__ACCESS_ONCE(x)) -+ -+/** -+ * lockless_dereference() - safely load a pointer for later dereference -+ * @p: The pointer to load -+ * -+ * Similar to rcu_dereference(), but for situations where the pointed-to -+ * object's lifetime is managed by something other than RCU. That -+ * "something other" might be reference counting or simple immortality. - */ --#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) -+#define lockless_dereference(p) \ -+({ \ -+ typeof(p) _________p1 = READ_ONCE(p); \ -+ smp_read_barrier_depends(); /* Dependency order vs. p above. */ \ -+ (_________p1); \ -+}) - - /* Ignore/forbid kprobes attach on very low level functions marked by this attribute: */ - #ifdef CONFIG_KPROBES diff --git a/tools/mkimage/patches/200-rsa-sign-add-support-for-libressl.patch b/tools/mkimage/patches/200-rsa-sign-add-support-for-libressl.patch new file mode 100644 index 0000000000..29058e22b7 --- /dev/null +++ b/tools/mkimage/patches/200-rsa-sign-add-support-for-libressl.patch @@ -0,0 +1,68 @@ +From 69176c8602e29f4bd30457240374800d88dc39ed Mon Sep 17 00:00:00 2001 +From: Hauke Mehrtens +Date: Sat, 14 Apr 2018 22:39:34 +0200 +Subject: [PATCH] rsa-sign: add support for libressl + +--- + lib/rsa/rsa-sign.c | 15 +++++++++------ + 1 file changed, 9 insertions(+), 6 deletions(-) + +--- a/lib/rsa/rsa-sign.c ++++ b/lib/rsa/rsa-sign.c +@@ -21,7 +21,8 @@ + #define HAVE_ERR_REMOVE_THREAD_STATE + #endif + +-#if OPENSSL_VERSION_NUMBER < 0x10100000L ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || \ ++ (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL) + static void RSA_get0_key(const RSA *r, + const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) + { +@@ -300,7 +301,8 @@ static int rsa_init(void) + { + int ret; + +-#if OPENSSL_VERSION_NUMBER < 0x10100000L ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || \ ++ (defined(LIBRESSL_VERSION_NUMBER) && LIBRESSL_VERSION_NUMBER < 0x2070000fL) + ret = SSL_library_init(); + #else + ret = OPENSSL_init_ssl(0, NULL); +@@ -309,7 +311,7 @@ static int rsa_init(void) + fprintf(stderr, "Failure to init SSL library\n"); + return -1; + } +-#if OPENSSL_VERSION_NUMBER < 0x10100000L ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) + SSL_load_error_strings(); + + OpenSSL_add_all_algorithms(); +@@ -355,7 +357,7 @@ err_set_rsa: + err_engine_init: + ENGINE_free(e); + err_engine_by_id: +-#if OPENSSL_VERSION_NUMBER < 0x10100000L ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) + ENGINE_cleanup(); + #endif + return ret; +@@ -363,7 +365,7 @@ err_engine_by_id: + + static void rsa_remove(void) + { +-#if OPENSSL_VERSION_NUMBER < 0x10100000L ++#if OPENSSL_VERSION_NUMBER < 0x10100000L || defined(LIBRESSL_VERSION_NUMBER) + CRYPTO_cleanup_all_ex_data(); + ERR_free_strings(); + #ifdef HAVE_ERR_REMOVE_THREAD_STATE +@@ -433,7 +435,8 @@ static int rsa_sign_with_key(RSA *rsa, s + ret = rsa_err("Could not obtain signature"); + goto err_sign; + } +- #if OPENSSL_VERSION_NUMBER < 0x10100000L ++ #if OPENSSL_VERSION_NUMBER < 0x10100000L || \ ++ defined(LIBRESSL_VERSION_NUMBER) + EVP_MD_CTX_cleanup(context); + #else + EVP_MD_CTX_reset(context); diff --git a/tools/mkimage/patches/210-link-libcrypto-static.patch b/tools/mkimage/patches/210-link-libcrypto-static.patch new file mode 100644 index 0000000000..66412ce43b --- /dev/null +++ b/tools/mkimage/patches/210-link-libcrypto-static.patch @@ -0,0 +1,14 @@ +OpenWrt links the libressl statically against mkimage, make sure all the +needed dependencies are added too. + +--- a/tools/Makefile ++++ b/tools/Makefile +@@ -145,7 +145,7 @@ endif + # MXSImage needs LibSSL + ifneq ($(CONFIG_MX23)$(CONFIG_MX28)$(CONFIG_ARMADA_38X)$(CONFIG_ARMADA_39X)$(CONFIG_FIT_SIGNATURE),) + HOSTLOADLIBES_mkimage += \ +- $(shell pkg-config --libs libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto") ++ $(shell pkg-config --libs --static libssl libcrypto 2> /dev/null || echo "-lssl -lcrypto") + + # OS X deprecate openssl in favour of CommonCrypto, supress deprecation + # warnings on those systems diff --git a/tools/mkimage/patches/210-openssl-1.1.x-compat.patch b/tools/mkimage/patches/210-openssl-1.1.x-compat.patch deleted file mode 100644 index b1bc08856e..0000000000 --- a/tools/mkimage/patches/210-openssl-1.1.x-compat.patch +++ /dev/null @@ -1,97 +0,0 @@ ---- a/lib/rsa/rsa-sign.c -+++ b/lib/rsa/rsa-sign.c -@@ -15,10 +15,25 @@ - #include - #include - --#if OPENSSL_VERSION_NUMBER >= 0x10000000L -+#if OPENSSL_VERSION_NUMBER < 0x10000000L -+#define HAVE_ERR_REMOVE_STATE -+#elif OPENSSL_VERSION_NUMBER < 0x10100000L - #define HAVE_ERR_REMOVE_THREAD_STATE - #endif - -+#if (OPENSSL_VERSION_NUMBER < 0x10100005L) || defined(LIBRESSL_VERSION_NUMBER) -+static void RSA_get0_key(const RSA *r, -+ const BIGNUM **n, const BIGNUM **e, const BIGNUM **d) -+{ -+ if (n != NULL) -+ *n = r->n; -+ if (e != NULL) -+ *e = r->e; -+ if (d != NULL) -+ *d = r->d; -+} -+#endif -+ - static int rsa_err(const char *msg) - { - unsigned long sslErr = ERR_get_error(); -@@ -154,7 +169,8 @@ static void rsa_remove(void) - ERR_free_strings(); - #ifdef HAVE_ERR_REMOVE_THREAD_STATE - ERR_remove_thread_state(NULL); --#else -+#endif -+#ifdef HAVE_ERR_REMOVE_STATE - ERR_remove_state(0); - #endif - EVP_cleanup(); -@@ -210,7 +226,6 @@ static int rsa_sign_with_key(RSA *rsa, s - ret = rsa_err("Could not obtain signature"); - goto err_sign; - } -- EVP_MD_CTX_cleanup(context); - EVP_MD_CTX_destroy(context); - EVP_PKEY_free(key); - -@@ -270,23 +285,26 @@ static int rsa_get_exponent(RSA *key, ui - BIGNUM *bn_te; - uint64_t te; - -+ const BIGNUM *bn_e; -+ RSA_get0_key(key, NULL, &bn_e, NULL); -+ - ret = -EINVAL; - bn_te = NULL; - - if (!e) - goto cleanup; - -- if (BN_num_bits(key->e) > 64) -+ if (BN_num_bits(bn_e) > 64) - goto cleanup; - -- *e = BN_get_word(key->e); -+ *e = BN_get_word(bn_e); - -- if (BN_num_bits(key->e) < 33) { -+ if (BN_num_bits(bn_e) < 33) { - ret = 0; - goto cleanup; - } - -- bn_te = BN_dup(key->e); -+ bn_te = BN_dup(bn_e); - if (!bn_te) - goto cleanup; - -@@ -319,6 +337,9 @@ int rsa_get_params(RSA *key, uint64_t *e - BN_CTX *bn_ctx = BN_CTX_new(); - int ret = 0; - -+ const BIGNUM *bn_n; -+ RSA_get0_key(key, &bn_n, NULL, NULL); -+ - /* Initialize BIGNUMs */ - big1 = BN_new(); - big2 = BN_new(); -@@ -337,7 +358,7 @@ int rsa_get_params(RSA *key, uint64_t *e - if (0 != rsa_get_exponent(key, exponent)) - ret = -1; - -- if (!BN_copy(n, key->n) || !BN_set_word(big1, 1L) || -+ if (!BN_copy(n, bn_n) || !BN_set_word(big1, 1L) || - !BN_set_word(big2, 2L) || !BN_set_word(big32, 32L)) - ret = -1; - -- 2.25.1