From ba2c15a927f408b7bdb264cd91b6cc4da1af07cc Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Nov 01 2019 18:29:42 +0000 Subject: import gnu-efi-3.0.8-2.el7 --- diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d5a3ba9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/gnu-efi-3.0.6.tar.bz2 diff --git a/.gnu-efi.metadata b/.gnu-efi.metadata new file mode 100644 index 0000000..27be31e --- /dev/null +++ b/.gnu-efi.metadata @@ -0,0 +1 @@ +9f0f75b64c84423f3386da6f3200f5ed7471d9cb SOURCES/gnu-efi-3.0.6.tar.bz2 diff --git a/SOURCES/0001-PATCH-Disable-AVX-instruction-set-on-IA32-and-x86_64.patch b/SOURCES/0001-PATCH-Disable-AVX-instruction-set-on-IA32-and-x86_64.patch new file mode 100644 index 0000000..6511d83 --- /dev/null +++ b/SOURCES/0001-PATCH-Disable-AVX-instruction-set-on-IA32-and-x86_64.patch @@ -0,0 +1,44 @@ +From 99d94682de590719f9333fcf091910a9581b44c0 Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Thu, 13 Jul 2017 08:43:16 -0400 +Subject: [PATCH 01/25] [PATCH] Disable AVX instruction set on IA32 and x86_64 + platforms + +If gnu-efi is compiled with "-march=native" on a host that supports AVX, both +gcc and clang will use AVX instructions freely which is currently not supported +and will result in a non-functional gnu-efi build (e.g. black screen, hangs). + +For now, disable AVX on IA32 and x86_64 by checking first if the compiler does +actually support the appropriate flag (-mno-avx) and use it if possible. + +Credit for the compiler command line to check if a flag is supported goes to +Gentoo's awesome flag-o-matic eclass, where it is taken from. Thanks. + +Signed-off-by: Matthias Dahl +Signed-off-by: Nigel Croxon +--- + Make.defaults | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/Make.defaults b/Make.defaults +index 16f1fd21848..446e676dc14 100755 +--- a/Make.defaults ++++ b/Make.defaults +@@ -120,6 +120,14 @@ ifeq ($(ARCH),x86_64) + endif + endif + ++ifneq (,$(filter $(ARCH),ia32 x86_64)) ++ # Disable AVX, if the compiler supports that. ++ CC_CAN_DISABLE_AVX=$(shell $(CC) -Werror -c -o /dev/null -xc -mno-avx - /dev/null 2>&1 && echo 1) ++ ifeq ($(CC_CAN_DISABLE_AVX), 1) ++ CFLAGS += -mno-avx ++ endif ++endif ++ + ifeq ($(ARCH),mips64el) + CFLAGS += -march=mips64r2 + ARCH3264 = -mabi=64 +-- +2.15.0 + diff --git a/SOURCES/0002-Use-ARFLAGS-when-invoking-ar.patch b/SOURCES/0002-Use-ARFLAGS-when-invoking-ar.patch new file mode 100644 index 0000000..86f565f --- /dev/null +++ b/SOURCES/0002-Use-ARFLAGS-when-invoking-ar.patch @@ -0,0 +1,30 @@ +From 08a46615c70f5af195443fcf5d0fd425fa329096 Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Mon, 7 Aug 2017 13:32:54 -0400 +Subject: [PATCH 02/25] Use ARFLAGS when invoking ar. + +The use of ARFLAGS makes these flags overridable. +The '-U' option is already added to ARFLAGS in Make.defaults. + +Signed-off-by: Janosch Hildebrand +Signed-off-by: Nigel Croxon +--- + lib/Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/Makefile b/lib/Makefile +index b8d1ce70d48..0e6410dac55 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -75,7 +75,7 @@ libsubdirs: + for sdir in $(SUBDIRS); do mkdir -p $$sdir; done + + libefi.a: $(OBJS) +- $(AR) rv -U $@ $^ ++ $(AR) $(ARFLAGS) $@ $^ + + clean: + rm -f libefi.a *~ $(OBJS) */*.o +-- +2.15.0 + diff --git a/SOURCES/0003-Stripped-diff-for-makefile.patch b/SOURCES/0003-Stripped-diff-for-makefile.patch new file mode 100644 index 0000000..9b53f68 --- /dev/null +++ b/SOURCES/0003-Stripped-diff-for-makefile.patch @@ -0,0 +1,31 @@ +From 15bcddc996694c904b3848c83031da5cd3a4719e Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Mon, 6 Nov 2017 09:06:31 -0500 +Subject: [PATCH 03/25] Stripped diff for makefile + +This patch allows one to run make outside the source tree +with make -f . + +Signed-off-by: wolfra +Signed-off-by: Nigel Croxon +--- + Makefile | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index 646de6f7044..37592bd6930 100644 +--- a/Makefile ++++ b/Makefile +@@ -36,7 +36,8 @@ + + VERSION = 3.0.6 + +-SRCDIR = $(shell pwd) ++MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) ++SRCDIR = $(dir $(MKFILE_PATH)) + + VPATH = $(SRCDIR) + +-- +2.15.0 + diff --git a/SOURCES/0004-Make-sure-stdint.h-is-always-used-with-MSVC-on-ARM-A.patch b/SOURCES/0004-Make-sure-stdint.h-is-always-used-with-MSVC-on-ARM-A.patch new file mode 100644 index 0000000..d9c242d --- /dev/null +++ b/SOURCES/0004-Make-sure-stdint.h-is-always-used-with-MSVC-on-ARM-A.patch @@ -0,0 +1,94 @@ +From 39ce220cb6fde14bedf2ef61695f3d20726e41ef Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Mon, 6 Nov 2017 09:26:05 -0500 +Subject: [PATCH 04/25] Make sure stdint.h is always used with MSVC on + ARM/ARM64, since all the versions of Visual Studio that support ARM or ARM64 + have that header. Without this, uint64_t would be defined to unsigned long, + which is 32-bits in the Microsoft world. + +Also fix aarch64/initplat.c so that memset/memcpy only apply +to gcc. Otherwise MSVC throws an error for __SIZE_TYPE__. + +Updating this patch to v2, since it turns out MSVC will also emit +memset and memcpy intrinsics that we can use an implementation for. +This is true for both ARM and ARM64. +To make this work, I'm defining __SIZE_TYPE__ to UINTN if not +already defined. + +Signed-off-by: Pete Batard +Signed-off-by: Nigel Croxon +--- + lib/aarch64/initplat.c | 4 ++++ + lib/arm/initplat.c | 6 +++++- + inc/aarch64/efibind.h | 2 +- + inc/arm/efibind.h | 2 +- + 4 files changed, 11 insertions(+), 3 deletions(-) + +diff --git a/lib/aarch64/initplat.c b/lib/aarch64/initplat.c +index 4b118656d7c..25207f42c8f 100644 +--- a/lib/aarch64/initplat.c ++++ b/lib/aarch64/initplat.c +@@ -25,6 +25,10 @@ InitializeLibPlatform ( + { + } + ++#ifndef __SIZE_TYPE__ ++#define __SIZE_TYPE__ UINTN ++#endif ++ + /* + * Calls to these functions may be emitted implicitly by GCC even when + * -ffreestanding is in effect. +diff --git a/lib/arm/initplat.c b/lib/arm/initplat.c +index 09f06a9c871..c77d26d9045 100644 +--- a/lib/arm/initplat.c ++++ b/lib/arm/initplat.c +@@ -25,7 +25,10 @@ InitializeLibPlatform ( + { + } + +-#ifdef __GNUC__ ++#ifndef __SIZE_TYPE__ ++#define __SIZE_TYPE__ UINTN ++#endif ++ + /* + * Calls to these functions may be emitted implicitly by GCC even when + * -ffreestanding is in effect. +@@ -51,6 +54,7 @@ void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n) + return dest; + } + ++#ifdef __GNUC__ + void __div0(void) + { + // TODO handle divide by zero fault +diff --git a/inc/aarch64/efibind.h b/inc/aarch64/efibind.h +index ef7148d5312..182a2109062 100644 +--- a/inc/aarch64/efibind.h ++++ b/inc/aarch64/efibind.h +@@ -15,7 +15,7 @@ + * either version 2 of the License, or (at your option) any later version. + */ + +-#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) ++#if !defined(_MSC_VER) && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L )) + + // ANSI C 1999/2000 stdint.h integer width declarations + +diff --git a/inc/arm/efibind.h b/inc/arm/efibind.h +index 06f6ea1aeb8..40a5a9cd428 100644 +--- a/inc/arm/efibind.h ++++ b/inc/arm/efibind.h +@@ -15,7 +15,7 @@ + * either version 2 of the License, or (at your option) any later version. + */ + +-#if !defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L ) ++#if !defined(_MSC_VER) && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L )) + + // ANSI C 1999/2000 stdint.h integer width declarations + +-- +2.15.0 + diff --git a/SOURCES/0005-Add-EFI_DRIVER_ENTRY_POINT-support-for-MSVC-ARM64.patch b/SOURCES/0005-Add-EFI_DRIVER_ENTRY_POINT-support-for-MSVC-ARM64.patch new file mode 100644 index 0000000..ba6608e --- /dev/null +++ b/SOURCES/0005-Add-EFI_DRIVER_ENTRY_POINT-support-for-MSVC-ARM64.patch @@ -0,0 +1,44 @@ +From 787b53a66cbbec6b10d47264b9eea9b24bc4e34c Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Mon, 6 Nov 2017 09:34:14 -0500 +Subject: [PATCH 05/25] Add EFI_DRIVER_ENTRY_POINT support for MSVC/ARM64 + +Similar to what we do for other MSVC architectures. + +Signed-off-by: Pete Batard +Signed-off-by: Nigel Croxon +--- + inc/aarch64/efibind.h | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/inc/aarch64/efibind.h b/inc/aarch64/efibind.h +index 182a2109062..bdaa5238e84 100644 +--- a/inc/aarch64/efibind.h ++++ b/inc/aarch64/efibind.h +@@ -115,9 +115,13 @@ typedef uint64_t UINTN; + + // + // When build similiar to FW, then link everything together as +-// one big module. ++// one big module. For the MSVC toolchain, we simply tell the ++// linker what our driver init function is using /ENTRY. + // +- ++#if defined(_MSC_EXTENSIONS) ++#define EFI_DRIVER_ENTRY_POINT(InitFunction) \ ++ __pragma(comment(linker, "/ENTRY:" # InitFunction)) ++#else + #define EFI_DRIVER_ENTRY_POINT(InitFunction) \ + UINTN \ + InitializeDriver ( \ +@@ -134,6 +138,7 @@ typedef uint64_t UINTN; + EFI_SYSTEM_TABLE *systab \ + ) __attribute__((weak, \ + alias ("InitializeDriver"))); ++#endif + + #define LOAD_INTERNAL_DRIVER(_if, type, name, entry) \ + (_if)->LoadInternal(type, name, entry) +-- +2.15.0 + diff --git a/SOURCES/0006-Move-memcpy-memset-definition-to-global-init.c.patch b/SOURCES/0006-Move-memcpy-memset-definition-to-global-init.c.patch new file mode 100644 index 0000000..107ddc5 --- /dev/null +++ b/SOURCES/0006-Move-memcpy-memset-definition-to-global-init.c.patch @@ -0,0 +1,215 @@ +From b1d426ce67cbeaa1a8ec7d9b8d0d8071ae4563b4 Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Mon, 6 Nov 2017 09:38:38 -0500 +Subject: [PATCH 06/25] Move memcpy/memset definition to global init.c + +Following up on previous patch, I think we should move +memcpy/memset definitions to the global init.c, since MSVC does +also inserts calls to memset/memcpy for the x86_32 platform, +even when disabling standard libraries and intrinsics. + +All in all, it looks like, for all platforms, we should assume +that a compiler may still insert these calls regardless. + +Signed-off-by: Pete Batard +Signed-off-by: Nigel Croxon +--- + lib/aarch64/initplat.c | 29 ----------------------------- + lib/arm/initplat.c | 33 ++------------------------------- + lib/init.c | 47 ++++++++++++++++++++++++++++++++++++++--------- + lib/mips64el/initplat.c | 25 ------------------------- + 4 files changed, 40 insertions(+), 94 deletions(-) + +diff --git a/lib/aarch64/initplat.c b/lib/aarch64/initplat.c +index 25207f42c8f..6c5e1fa5217 100644 +--- a/lib/aarch64/initplat.c ++++ b/lib/aarch64/initplat.c +@@ -24,32 +24,3 @@ InitializeLibPlatform ( + ) + { + } +- +-#ifndef __SIZE_TYPE__ +-#define __SIZE_TYPE__ UINTN +-#endif +- +-/* +- * Calls to these functions may be emitted implicitly by GCC even when +- * -ffreestanding is in effect. +- */ +-void *memset(void *s, int c, __SIZE_TYPE__ n) +-{ +- unsigned char *p = s; +- +- while (n--) +- *p++ = c; +- +- return s; +-} +- +-void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n) +-{ +- const unsigned char *q = src; +- unsigned char *p = dest; +- +- while (n--) +- *p++ = *q++; +- +- return dest; +-} +diff --git a/lib/arm/initplat.c b/lib/arm/initplat.c +index c77d26d9045..135a649210a 100644 +--- a/lib/arm/initplat.c ++++ b/lib/arm/initplat.c +@@ -25,39 +25,10 @@ InitializeLibPlatform ( + { + } + +-#ifndef __SIZE_TYPE__ +-#define __SIZE_TYPE__ UINTN +-#endif +- +-/* +- * Calls to these functions may be emitted implicitly by GCC even when +- * -ffreestanding is in effect. +- */ +-void *memset(void *s, int c, __SIZE_TYPE__ n) +-{ +- unsigned char *p = s; +- +- while (n--) +- *p++ = c; +- +- return s; +-} +- +-void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n) +-{ +- unsigned char *p = dest; +- unsigned char const *q = src; +- +- while (n--) +- *p++ = *q++; +- +- return dest; +-} +- + #ifdef __GNUC__ + void __div0(void) + { +- // TODO handle divide by zero fault +- while (1); ++ // TODO handle divide by zero fault ++ while (1); + } + #endif +diff --git a/lib/init.c b/lib/init.c +index 4225d314b7a..4f238c0a2cc 100644 +--- a/lib/init.c ++++ b/lib/init.c +@@ -49,7 +49,7 @@ Returns: + if (!LibInitialized) { + LibInitialized = TRUE; + LibFwInstance = FALSE; +- LibImageHandle = ImageHandle; ++ LibImageHandle = ImageHandle; + + + // +@@ -71,17 +71,16 @@ Returns: + + if (ImageHandle) { + Status = uefi_call_wrapper( +- BS->HandleProtocol, +- 3, +- ImageHandle, +- &LoadedImageProtocol, +- (VOID*)&LoadedImage +- ); ++ BS->HandleProtocol, ++ 3, ++ ImageHandle, ++ &LoadedImageProtocol, ++ (VOID*)&LoadedImage ++ ); + + if (!EFI_ERROR(Status)) { + PoolAllocationType = LoadedImage->ImageDataType; + } +- + EFIDebugVariable (); + } + +@@ -181,5 +180,35 @@ EFIDebugVariable ( + Status = uefi_call_wrapper(RT->GetVariable, 5, L"EFIDebug", &EfiGlobalVariable, &Attributes, &DataSize, &NewEFIDebug); + if (!EFI_ERROR(Status)) { + EFIDebug = NewEFIDebug; +- } ++ } ++} ++ ++/* ++ * Calls to memset/memcpy may be emitted implicitly by GCC or MSVC ++ * even when -ffreestanding or /NODEFAULTLIB are in effect. ++ */ ++ ++#ifndef __SIZE_TYPE__ ++#define __SIZE_TYPE__ UINTN ++#endif ++ ++void *memset(void *s, int c, __SIZE_TYPE__ n) ++{ ++ unsigned char *p = s; ++ ++ while (n--) ++ *p++ = c; ++ ++ return s; ++} ++ ++void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n) ++{ ++ const unsigned char *q = src; ++ unsigned char *p = dest; ++ ++ while (n--) ++ *p++ = *q++; ++ ++ return dest; + } +diff --git a/lib/mips64el/initplat.c b/lib/mips64el/initplat.c +index 4b118656d7c..6c5e1fa5217 100644 +--- a/lib/mips64el/initplat.c ++++ b/lib/mips64el/initplat.c +@@ -24,28 +24,3 @@ InitializeLibPlatform ( + ) + { + } +- +-/* +- * Calls to these functions may be emitted implicitly by GCC even when +- * -ffreestanding is in effect. +- */ +-void *memset(void *s, int c, __SIZE_TYPE__ n) +-{ +- unsigned char *p = s; +- +- while (n--) +- *p++ = c; +- +- return s; +-} +- +-void *memcpy(void *dest, const void *src, __SIZE_TYPE__ n) +-{ +- const unsigned char *q = src; +- unsigned char *p = dest; +- +- while (n--) +- *p++ = *q++; +- +- return dest; +-} +-- +2.15.0 + diff --git a/SOURCES/0007-Bump-revision-from-VERSION-3.0.6-to-VERSION-3.0.7.patch b/SOURCES/0007-Bump-revision-from-VERSION-3.0.6-to-VERSION-3.0.7.patch new file mode 100644 index 0000000..485dc13 --- /dev/null +++ b/SOURCES/0007-Bump-revision-from-VERSION-3.0.6-to-VERSION-3.0.7.patch @@ -0,0 +1,26 @@ +From f99001cd7d4c27d1b365b70ac45b14f84ee46237 Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Mon, 6 Nov 2017 09:44:21 -0500 +Subject: [PATCH 07/25] Bump revision from VERSION = 3.0.6 to VERSION = 3.0.7 + +Signed-off-by: Nigel Croxon +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index 37592bd6930..a9f7e134e14 100644 +--- a/Makefile ++++ b/Makefile +@@ -34,7 +34,7 @@ + # SUCH DAMAGE. + # + +-VERSION = 3.0.6 ++VERSION = 3.0.7 + + MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) + SRCDIR = $(dir $(MKFILE_PATH)) +-- +2.15.0 + diff --git a/SOURCES/0008-Currently-we-have-DivU64x32-on-ia32-but-it-tries-to-.patch b/SOURCES/0008-Currently-we-have-DivU64x32-on-ia32-but-it-tries-to-.patch new file mode 100644 index 0000000..0b7d2ef --- /dev/null +++ b/SOURCES/0008-Currently-we-have-DivU64x32-on-ia32-but-it-tries-to-.patch @@ -0,0 +1,38 @@ +From d039cd620b8a270d9b231691c9b31d6824f18c08 Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Wed, 10 Jan 2018 10:28:36 -0500 +Subject: [PATCH 08/25] Currently we have DivU64x32 on ia32, but it tries to + call __umoddi3 and __udivdi3 from libgcc, which we don't have. This fixes it + to use our implementation in that case. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + lib/ia32/math.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/lib/ia32/math.c b/lib/ia32/math.c +index 81f51bf45e4..fce7a8d4875 100644 +--- a/lib/ia32/math.c ++++ b/lib/ia32/math.c +@@ -140,7 +140,7 @@ DivU64x32 ( + // divide 64bit by 32bit and get a 64bit result + // N.B. only works for 31bit divisors!! + { +-#if defined(__GNUC__) && !defined(__MINGW32__) ++#if 0 && defined(__GNUC__) && !defined(__MINGW32__) + if (Remainder) + *Remainder = Dividend % Divisor; + return Dividend / Divisor; +@@ -157,7 +157,7 @@ DivU64x32 ( + + Rem = 0; + for (bit=0; bit < 64; bit++) { +-#ifdef __MINGW32__ ++#if defined(__GNUC__) || defined(__MINGW32__) + asm ( + "shll $1, %0\n\t" + "rcll $1, 4%0\n\t" +-- +2.15.0 + diff --git a/SOURCES/0009-gnuefi-preserve-.gnu.hash-sections-unbreaks-elilo-on.patch b/SOURCES/0009-gnuefi-preserve-.gnu.hash-sections-unbreaks-elilo-on.patch new file mode 100644 index 0000000..2b0ad6e --- /dev/null +++ b/SOURCES/0009-gnuefi-preserve-.gnu.hash-sections-unbreaks-elilo-on.patch @@ -0,0 +1,148 @@ +From 2cc0b085fb82e80d43cc08c8376dff9f9532a72d Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich +Date: Sat, 27 Jan 2018 20:29:05 +0000 +Subject: [PATCH 09/25] gnuefi: preserve .gnu.hash sections (unbreaks elilo on + IA-64) + +Gentoo has slightly modified linker defaults: --hash-style=gnu +This means all ELF files in system have '.gnu.hash' section +but no '.hash' section. + +gnuefi's ldscript did not account for it and as a result +one symbol 'ImageBase' did not resolve locally for elilo.so +and caused 'elilo' to fail to load by ia64 EFI: + Loading.: Gentoo (try new elilo) + ImageAddress: pointer is outside of image + ImageAddress: pointer is outside of image + +Those two relocations come from crt0-efi-ia64.S PE32 entry point +fdescr: + +``` + #define IMAGE_REL_BASED_DIR64<->10 + .section .reloc, "a" + data4 _start_plabel // Page RVA + data4 12 // Block Size (2*4+2*2) + data2 (IMAGE_REL_BASED_DIR64<<12) + 0 // reloc for plabel's entry point + data2 (IMAGE_REL_BASED_DIR64<<12) + 8 // reloc for plabel's global pointer +``` + +These refer ImageBase. + +The change adds '.gnu.hash' collection (follows existing '.hash' +collection). + +Tested on IA-64 by successfully booting elilo-3.16. + +Bug: https://bugs.gentoo.org/575300 +Signed-off-by: Sergei Trofimovich +--- + README.gnuefi | 8 +++++++- + gnuefi/elf_ia32_efi.lds | 4 +++- + gnuefi/elf_ia32_fbsd_efi.lds | 4 +++- + gnuefi/elf_ia64_efi.lds | 4 +++- + gnuefi/elf_x86_64_efi.lds | 4 +++- + gnuefi/elf_x86_64_fbsd_efi.lds | 4 +++- + 6 files changed, 22 insertions(+), 6 deletions(-) + +diff --git a/README.gnuefi b/README.gnuefi +index a7feec0ba28..512698c28b4 100644 +--- a/README.gnuefi ++++ b/README.gnuefi +@@ -231,11 +231,17 @@ and page sized.These eight sections are used to group together the much + greater number of sections that are typically present in ELF object files. + Specifically: + +- .hash ++ .hash (and/or .gnu.hash) + Collects the ELF .hash info (this section _must_ be the first + section in order to build a shared object file; the section is + not actually loaded or used at runtime). + ++ GNU binutils provides a mechanism to generate different hash info ++ via --hash-style= option. In this case output ++ shared object will contain .hash section, .gnu.hash section or ++ both. In order to generate correct output linker script preserves ++ both types of hash sections. ++ + .text + Collects all sections containing executable code. + +diff --git a/gnuefi/elf_ia32_efi.lds b/gnuefi/elf_ia32_efi.lds +index 6cc4ce1b8c7..f27fe5fc6e6 100644 +--- a/gnuefi/elf_ia32_efi.lds ++++ b/gnuefi/elf_ia32_efi.lds +@@ -5,7 +5,9 @@ SECTIONS + { + . = 0; + ImageBase = .; +- .hash : { *(.hash) } /* this MUST come first! */ ++ /* .hash and/or .gnu.hash MUST come first! */ ++ .hash : { *(.hash) } ++ .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .text : + { +diff --git a/gnuefi/elf_ia32_fbsd_efi.lds b/gnuefi/elf_ia32_fbsd_efi.lds +index 77d6fade1a5..cd309e24f7f 100644 +--- a/gnuefi/elf_ia32_fbsd_efi.lds ++++ b/gnuefi/elf_ia32_fbsd_efi.lds +@@ -5,7 +5,9 @@ SECTIONS + { + . = 0; + ImageBase = .; +- .hash : { *(.hash) } /* this MUST come first! */ ++ /* .hash and/or .gnu.hash MUST come first! */ ++ .hash : { *(.hash) } ++ .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .text : + { +diff --git a/gnuefi/elf_ia64_efi.lds b/gnuefi/elf_ia64_efi.lds +index baca9623b57..190792a0c94 100644 +--- a/gnuefi/elf_ia64_efi.lds ++++ b/gnuefi/elf_ia64_efi.lds +@@ -5,7 +5,9 @@ SECTIONS + { + . = 0; + ImageBase = .; +- .hash : { *(.hash) } /* this MUST come first! */ ++ /* .hash and/or .gnu.hash MUST come first! */ ++ .hash : { *(.hash) } ++ .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .text : + { +diff --git a/gnuefi/elf_x86_64_efi.lds b/gnuefi/elf_x86_64_efi.lds +index 942d1f3eff7..7be59023510 100644 +--- a/gnuefi/elf_x86_64_efi.lds ++++ b/gnuefi/elf_x86_64_efi.lds +@@ -6,7 +6,9 @@ SECTIONS + { + . = 0; + ImageBase = .; +- .hash : { *(.hash) } /* this MUST come first! */ ++ /* .hash and/or .gnu.hash MUST come first! */ ++ .hash : { *(.hash) } ++ .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .eh_frame : + { +diff --git a/gnuefi/elf_x86_64_fbsd_efi.lds b/gnuefi/elf_x86_64_fbsd_efi.lds +index 6fd2031c13b..fe1f3342cae 100644 +--- a/gnuefi/elf_x86_64_fbsd_efi.lds ++++ b/gnuefi/elf_x86_64_fbsd_efi.lds +@@ -6,7 +6,9 @@ SECTIONS + { + . = 0; + ImageBase = .; +- .hash : { *(.hash) } /* this MUST come first! */ ++ /* .hash and/or .gnu.hash MUST come first! */ ++ .hash : { *(.hash) } ++ .gnu.hash : { *(.gnu.hash) } + . = ALIGN(4096); + .eh_frame : + { +-- +2.15.0 + diff --git a/SOURCES/0010-gnu-efi-fix-lib-ia64-setjmp.S-IA-64-build-failure.patch b/SOURCES/0010-gnu-efi-fix-lib-ia64-setjmp.S-IA-64-build-failure.patch new file mode 100644 index 0000000..16286a4 --- /dev/null +++ b/SOURCES/0010-gnu-efi-fix-lib-ia64-setjmp.S-IA-64-build-failure.patch @@ -0,0 +1,161 @@ +From 0e6995a96b0f5867c8d85fbd251cfbc295a3fc4d Mon Sep 17 00:00:00 2001 +From: Sergei Trofimovich +Date: Sun, 28 Jan 2018 16:44:21 +0000 +Subject: [PATCH 10/25] gnu-efi: fix lib/ia64/setjmp.S IA-64 build failure + +The build failed as: + lib/ia64/setjmp.S:171: Error: Unknown opcode `ldf.nt1 f26=[r10],8' + lib/ia64/setjmp.S:178: Error: Operand 1 of `ldf.fill.nt1' should be a floating-point register + +The change syncs longjmp definition with + edk2/EdkCompatibilityPkg/Foundation/Library/EdkIIGlueLib/Library/BaseLib/Ipf/setjmp.s +pulling in: +- branch in the end of function +- registers used wrong instruction for float restore + +Signed-off-by: Sergei Trofimovich +--- + lib/ia64/setjmp.S | 61 +++++++++++++++++++++++++++---------------------------- + 1 file changed, 30 insertions(+), 31 deletions(-) + +diff --git a/lib/ia64/setjmp.S b/lib/ia64/setjmp.S +index c806fbc82b6..bbb29d8b8f5 100644 +--- a/lib/ia64/setjmp.S ++++ b/lib/ia64/setjmp.S +@@ -16,11 +16,11 @@ BASIS, + .globl setjmp + .type setjmp, @function + setjmp: +- alloc loc = ar.pfs, 1, 2, 1, 0 ++ alloc loc0 = ar.pfs, 1, 2, 1, 0 + ;; + mov r14 = ar.unat + mov r15 = ar.bsp +- add r10 = 0x10 * 20, in0 ++ add r10 = 0x10*20, in0 + ;; + stf.spill.nta [in0] = f2, 0x10 + st8.spill.nta [r10] = r4, 8 +@@ -98,29 +98,25 @@ setjmp: + + .globl longjmp + .type longjmp, @function +- .regstk ++ .regstk 2, 0, 0, 0 + longjmp: +- add r10 = 0x10 * 20 + 8*14, in0 +- movl r2 = ~(((1<<14) - 1) << 16) | 3) ++ add r10 = 0x10*20 + 8*14, in0 ++ movl r2 = ~((((1<<14) - 1) << 16) | 3) + ;; + ld8.nt1 r14 = [r10], -8*2 + mov r15 = ar.bspstore + ;; + ld8.nt1 r17 = [r10], -8 + mov r16 = ar.rsc +- cmp.leu p6 = r14, r15 ++ cmp.leu p6 = r14, r15 + ;; + ld8.nt1 r18 = [r10], -8 + ld8.nt1 r25 = [r10], -8 +- and r2 = r16, r2 ++ and r2 = r16, r2 + ;; +- ldf.fill.nt1 f2 = [in0], 0x10 ++ ldf.fill.nt1 f2 = [in0], 0x10 + ld8.nt1 r24 = [r10], -8 +- mov b5 = r25 +- ;; +- mov ar.rsc = r2 +- ld8.nt1 r23 = [r10], -8 +- mov b5 = r25 ++ mov b5 = r25 + ;; + mov ar.rsc = r2 + ld8.nt1 r23 = [r10], -8 +@@ -137,51 +133,51 @@ _skip_flushrs: + mov r31 = ar.rnat + loadrs + ;; +- ldf.fill.nt1 f4 = [in0], 0x10 ++ ldf.fill.nt1 f4 = [in0], 0x10 + ld8.nt1 r22 = [r10], -8 +- dep r2 = -1, r14, 3, 6 ++ dep r2 = -1, r14, 3, 6 + ;; +- ldf.fill.nt1 f5 = [in0], 0x10 +- ld8.nt1 f21 = [r10], -8 +- cmp p6 = r2, r15 ++ ldf.fill.nt1 f5 = [in0], 0x10 ++ ld8.nt1 r21 = [r10], -8 ++ cmp.ltu p6 = r2, r15 + ;; + ld8.nt1 r20 = [r10], -0x10 + (p6) ld8.nta r31 = [r2] +- mov b3 = r23 ++ mov b3 = r23 + ;; + ldf.fill.nt1 f16 = [in0], 0x10 +- ld8.fill.nt1 r7 = [r10], -8 +- mov b2 = r22 ++ ld8.fill.nt1 r7 = [r10], -8 ++ mov b2 = r22 + ;; + ldf.fill.nt1 f17 = [in0], 0x10 +- ld8.fill.nt1 r6 = [r10], -8 +- mov b1 = r21 ++ ld8.fill.nt1 r6 = [r10], -8 ++ mov b1 = r21 + ;; + ldf.fill.nt1 f18 = [in0], 0x10 +- ld8.fill.nt1 r5 = [r10], -8 +- mov b0 = r20 ++ ld8.fill.nt1 r5 = [r10], -8 ++ mov b0 = r20 + ;; + ldf.fill.nt1 f19 = [in0], 0x10 +- ld8.fill.nt1 r4 = [r10], 8*13 ++ ld8.fill.nt1 r4 = [r10], 8*13 + ;; + ldf.fill.nt1 f20 = [in0], 0x10 + ld8.nt1 r19 = [r10], 0x10 + ;; + ldf.fill.nt1 f21 = [in0], 0x10 +- ldf.nt1 f26 = [r10], 8 ++ ld8.nt1 r26 = [r10], 8 + mov ar.pfs = r19 + ;; + ldf.fill.nt1 f22 = [in0], 0x10 + ld8.nt1 r27 = [r10], 8 +- mov pr = r26, -1 ++ mov pr = r26, -1 + ;; +- ldf.fill.nt1 r23 = [in0], 0x10 ++ ldf.fill.nt1 f23 = [in0], 0x10 + ld8.nt1 r28 = [r10], -17*8 - 0x10 + mov ar.lc = r27 + ;; + ldf.fill.nt1 f24 = [in0], 0x10 + ldf.fill.nt1 f25 = [in0], 0x10 +- mov r8 = in1 ++ mov r8 = in1 + ;; + ldf.fill.nt1 f26 = [in0], 0x10 + ldf.fill.nt1 f31 = [r10], -0x10 +@@ -192,9 +188,12 @@ _skip_flushrs: + ldf.fill.nt1 f28 = [in0] + ldf.fill.nt1 f29 = [r10], 0x10*3 + 8*4 + ;; +- ld8.fill.nt1 sp = [r10] ++ ld8.fill.nt1 sp = [r10] + mov ar.unat = r18 + ;; + mov ar.bspstore = r14 + mov ar.rnat = r31 + ;; ++ invala ++ mov ar.rsc = r16 ++ br.ret.sptk b0 +-- +2.15.0 + diff --git a/SOURCES/0011-Fix-some-types-gcc-doesn-t-like.patch b/SOURCES/0011-Fix-some-types-gcc-doesn-t-like.patch new file mode 100644 index 0000000..aa66e4e --- /dev/null +++ b/SOURCES/0011-Fix-some-types-gcc-doesn-t-like.patch @@ -0,0 +1,73 @@ +From a46a62b12b58139c31d4288384808365c4053bf2 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:21 -0400 +Subject: [PATCH 11/25] Fix some types gcc doesn't like + +Most of these come from building on i386 with -Wextra, but they're still +incorrect everywhere else; they just happen to have identical typedefs +at other places, so the compiler doesn't care. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + apps/AllocPages.c | 2 +- + apps/FreePages.c | 2 +- + apps/route80h.c | 2 +- + inc/efilink.h | 2 +- + 4 files changed, 4 insertions(+), 4 deletions(-) + +diff --git a/apps/AllocPages.c b/apps/AllocPages.c +index 77a082ec0a3..bb81849c26e 100644 +--- a/apps/AllocPages.c ++++ b/apps/AllocPages.c +@@ -116,7 +116,7 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) + INTN AllocType = -1; + INTN MemType = -1; + INTN NumPages = -1; +- UINTN Addr = 0; ++ EFI_PHYSICAL_ADDRESS Addr = 0; + + InitializeLib(image, systab); + +diff --git a/apps/FreePages.c b/apps/FreePages.c +index bbf2f52b4cf..247c75dc2be 100644 +--- a/apps/FreePages.c ++++ b/apps/FreePages.c +@@ -89,7 +89,7 @@ efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) + INTN err = 0; + + INTN PgCnt = -1; +- UINTN PhysAddr = 0; ++ EFI_PHYSICAL_ADDRESS PhysAddr = 0; + + InitializeLib(image, systab); + +diff --git a/apps/route80h.c b/apps/route80h.c +index 8df860c1232..e1f62f06824 100644 +--- a/apps/route80h.c ++++ b/apps/route80h.c +@@ -129,7 +129,7 @@ efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) + lpcif.rcba &= ~1UL; + + Print(L"rcba: 0x%8x\n", lpcif.rcba, lpcif.rcba); +- set_bit((uint32_t *)(uint64_t)(lpcif.rcba + GCS_OFFSET_ADDR), ++ set_bit((uint32_t *)(intptr_t)(lpcif.rcba + GCS_OFFSET_ADDR), + GCS_RPR_SHIFT, GCS_RPR_PCI); + + return EFI_SUCCESS; +diff --git a/inc/efilink.h b/inc/efilink.h +index b2ff4fa2f87..cc5aa2dc57b 100644 +--- a/inc/efilink.h ++++ b/inc/efilink.h +@@ -142,7 +142,7 @@ typedef struct _LIST_ENTRY { + // EFI_FIELD_OFFSET - returns the byte offset to a field within a structure + // + +-#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(&(((TYPE *) 0)->Field))) ++#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(intptr_t)(&(((TYPE *) 0)->Field))) + + // + // CONTAINING_RECORD - returns a pointer to the structure +-- +2.15.0 + diff --git a/SOURCES/0012-Fix-arm-build-paths-in-the-makefile.patch b/SOURCES/0012-Fix-arm-build-paths-in-the-makefile.patch new file mode 100644 index 0000000..746989a --- /dev/null +++ b/SOURCES/0012-Fix-arm-build-paths-in-the-makefile.patch @@ -0,0 +1,38 @@ +From 5fa13d4609ae6187f68928c6e0834cdf716442f9 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:22 -0400 +Subject: [PATCH 12/25] Fix arm build paths in the makefile + +Previous work was apparently done with arm-linux-gnueabi-gcc as a +cross-builder, but our armv7 builders have native gcc with the target as +armv7hl-linux-gnueabi, so we need to munge the arch there to get our arm +path. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + Make.defaults | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Make.defaults b/Make.defaults +index 446e676dc14..6d300fb0f24 100755 +--- a/Make.defaults ++++ b/Make.defaults +@@ -62,12 +62,12 @@ OBJCOPY := $(prefix)$(CROSS_COMPILE)objcopy + + # Host/target identification + OS := $(shell uname -s) +-HOSTARCH := $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed s,i[3456789]86,ia32,) ++HOSTARCH := $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv7.*,arm,' ) + ARCH := $(HOSTARCH) + + # Get ARCH from the compiler if cross compiling + ifneq ($(CROSS_COMPILE),) +- override ARCH := $(shell $(CC) -dumpmachine | cut -f1 -d-| sed s,i[3456789]86,ia32,) ++ override ARCH := $(shell $(CC) -dumpmachine | cut -f1 -d-| sed -e s,i[3456789]86,ia32, -e 's,armv7.*,arm,' ) + endif + + # FreeBSD (and possibly others) reports amd64 instead of x86_64 +-- +2.15.0 + diff --git a/SOURCES/0013-Work-around-Werror-maybe-uninitialized-not-being-ver.patch b/SOURCES/0013-Work-around-Werror-maybe-uninitialized-not-being-ver.patch new file mode 100644 index 0000000..fb6057f --- /dev/null +++ b/SOURCES/0013-Work-around-Werror-maybe-uninitialized-not-being-ver.patch @@ -0,0 +1,32 @@ +From e861bb3861cca6c6d7b4d42fa915e9e9fa3dc9fc Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:23 -0400 +Subject: [PATCH 13/25] Work around -Werror=maybe-uninitialized not being very + bright. + +The compiler doesn't believe the loop always executes at least once, +even though the data in the first array entry doesn't satisfy the exit +condition. So just initialize the thing to shut it up. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + apps/route80h.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/apps/route80h.c b/apps/route80h.c +index e1f62f06824..5272dd3cd44 100644 +--- a/apps/route80h.c ++++ b/apps/route80h.c +@@ -93,7 +93,7 @@ efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) + InitializeLib(image_handle, systab); + EFI_PCI_IO *pciio = NULL; + lpcif_t lpcif; +- EFI_STATUS rc; ++ EFI_STATUS rc = EFI_SUCCESS; + struct { + uint16_t vendor; + uint16_t device; +-- +2.15.0 + diff --git a/SOURCES/0014-Fix-a-sign-error-in-the-debughook-example-app.patch b/SOURCES/0014-Fix-a-sign-error-in-the-debughook-example-app.patch new file mode 100644 index 0000000..d78fad8 --- /dev/null +++ b/SOURCES/0014-Fix-a-sign-error-in-the-debughook-example-app.patch @@ -0,0 +1,40 @@ +From 25cebcee2ae0b92829841321220ec9837479c118 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:24 -0400 +Subject: [PATCH 14/25] Fix a sign error in the debughook example app + +On ISO C90 on i386 4294967294 is a signed integer, and so x can't be +greater (or equal) to that. Make it an unsigned and choose a better type +for the variable. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + apps/debughook.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/apps/debughook.c b/apps/debughook.c +index 93cd0cf7eb0..78e4a767b1d 100644 +--- a/apps/debughook.c ++++ b/apps/debughook.c +@@ -50,7 +50,7 @@ DebugHook(void) + UINT8 *data = NULL; + UINTN dataSize = 0; + EFI_STATUS efi_status; +- register volatile UINTN x = 0; ++ register volatile unsigned long long x = 0; + extern char _text, _data; + + if (x) +@@ -71,7 +71,7 @@ DebugHook(void) + while (x++) { + /* Make this so it can't /totally/ DoS us. */ + #if defined(__x86_64__) || defined(__i386__) || defined(__i686__) +- if (x > 4294967294) ++ if (x > 4294967294ULL) + break; + __asm__ __volatile__("pause"); + #elif defined(__aarch64__) +-- +2.15.0 + diff --git a/SOURCES/0015-Fix-typedef-of-EFI_PXE_BASE_CODE.patch b/SOURCES/0015-Fix-typedef-of-EFI_PXE_BASE_CODE.patch new file mode 100644 index 0000000..3f42514 --- /dev/null +++ b/SOURCES/0015-Fix-typedef-of-EFI_PXE_BASE_CODE.patch @@ -0,0 +1,50 @@ +From 28b487d1ae66c7311e13c07c802276ea26f026e9 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:25 -0400 +Subject: [PATCH 15/25] Fix typedef of EFI_PXE_BASE_CODE + +Commit 751cbce3 fixed up a bunch of types to better match the edk2 +definitions and the names in the UEFI Spec, but while doing so +inadvertantly defined things thusly: + + INTERFACE_DECL(_EFI_PXE_BASE_CODE_PROTOCOL); + ... + typedef struct _EFI_PXE_BASE_CODE_PROTOCOL { + ... + } EFI_PXE_BASE_CODE_PROTOCOL; + ... + typedef struct _EFI_PXE_BASE_CODE_PROTOCOL _EFI_PXE_BASE_CODE; + typedef struct EFI_PXE_BASE_CODE_PROTOCOL EFI_PXE_BASE_CODE; + +Because EFI_BASE_CODE_PROTOCOL is declared with a typedef, and is +therefore in the type namespace rather than the struct namespace, this +results in EFI_PXE_BASE_CODE being a forward declaration of an +incomplete type. The net result is that code which dereferences any +field in the struct, even with the correct names, will not correctly +build. + +This patch changes both _EFI_PXE_BASE_CODE and EFI_PXE_BASE_CODE +typedefs to inherit from struct _EFI_PXE_BASE_CODE_PROTOCOL. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + inc/efipxebc.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/inc/efipxebc.h b/inc/efipxebc.h +index 035a853a7ef..3760c7cbb78 100644 +--- a/inc/efipxebc.h ++++ b/inc/efipxebc.h +@@ -419,7 +419,7 @@ typedef struct _EFI_PXE_BASE_CODE_PROTOCOL { + // Use 'EFI_PXE_BASE_CODE_PROTOCOL_GUID' instead. + + typedef struct _EFI_PXE_BASE_CODE_PROTOCOL _EFI_PXE_BASE_CODE; +-typedef EFI_PXE_BASE_CODE_PROTOCOL EFI_PXE_BASE_CODE; ++typedef struct _EFI_PXE_BASE_CODE_PROTOCOL EFI_PXE_BASE_CODE; + + // + // Call Back Definitions +-- +2.15.0 + diff --git a/SOURCES/0016-make-clang-not-complain-about-fno-merge-all-constant.patch b/SOURCES/0016-make-clang-not-complain-about-fno-merge-all-constant.patch new file mode 100644 index 0000000..30f8611 --- /dev/null +++ b/SOURCES/0016-make-clang-not-complain-about-fno-merge-all-constant.patch @@ -0,0 +1,32 @@ +From f0bf464a37d740a9539e8356a2e8611da63455df Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:26 -0400 +Subject: [PATCH 16/25] make clang not complain about -fno-merge-all-constants + +Make clang not complain about -fno-merge-all-constants + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + Make.defaults | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/Make.defaults b/Make.defaults +index 6d300fb0f24..a457190aa3a 100755 +--- a/Make.defaults ++++ b/Make.defaults +@@ -170,8 +170,9 @@ CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \ + else + CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \ + -fshort-wchar -fno-strict-aliasing \ +- -fno-merge-all-constants -ffreestanding -fno-stack-protector \ +- -fno-stack-check ++ -ffreestanding -fno-stack-protector -fno-stack-check \ ++ -fno-stack-check \ ++ $(if $(findstring gcc,$(CC)),-fno-merge-all-constants,) + endif + + ARFLAGS += -U +-- +2.15.0 + diff --git a/SOURCES/0017-Fix-another-place-clang-complains-about.patch b/SOURCES/0017-Fix-another-place-clang-complains-about.patch new file mode 100644 index 0000000..d66cb83 --- /dev/null +++ b/SOURCES/0017-Fix-another-place-clang-complains-about.patch @@ -0,0 +1,29 @@ +From 5abc3858a25fa6774c6e2d89cc5d1d14a9c9f7cb Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:27 -0400 +Subject: [PATCH 17/25] Fix another place clang complains about + +Fix another place clang complains about. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + lib/guid.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/lib/guid.c b/lib/guid.c +index 8daa505ed97..6498e9063cf 100644 +--- a/lib/guid.c ++++ b/lib/guid.c +@@ -97,7 +97,7 @@ static struct { + { &SMapId, L"ShellDevPathMap" }, + { &SAliasId, L"ShellAlias" }, + +- { NULL, NULL } ++ { NULL, L"" } + }; + + // +-- +2.15.0 + diff --git a/SOURCES/0018-gnu-efi-add-some-more-common-string-functions.patch b/SOURCES/0018-gnu-efi-add-some-more-common-string-functions.patch new file mode 100644 index 0000000..778e06d --- /dev/null +++ b/SOURCES/0018-gnu-efi-add-some-more-common-string-functions.patch @@ -0,0 +1,345 @@ +From 9485c65f6d28b71ff697849c1c8d47fd077ccd07 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:28 -0400 +Subject: [PATCH 18/25] gnu-efi: add some more common string functions. + +This adds bounded string helper functions: + +StrnLen() +StrnCpy() +StrnCat() +StpnCpy() + +And the unbounded function StpCpy(). + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + lib/runtime/rtstr.c | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++-- + lib/str.c | 53 ++++++++++++++++++++++++++++++ + inc/efilib.h | 33 +++++++++++++++++++ + inc/efirtlib.h | 38 ++++++++++++++++++++++ + 4 files changed, 213 insertions(+), 3 deletions(-) + +diff --git a/lib/runtime/rtstr.c b/lib/runtime/rtstr.c +index e283c09582e..80ff4891199 100644 +--- a/lib/runtime/rtstr.c ++++ b/lib/runtime/rtstr.c +@@ -57,6 +57,61 @@ RtStrCpy ( + *Dest = 0; + } + ++#ifndef __GNUC__ ++#pragma RUNTIME_CODE(RtStrnCpy) ++#endif ++VOID ++RUNTIMEFUNCTION ++RtStrnCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ) ++// copy strings ++{ ++ UINTN Size = RtStrnLen(Src, Len); ++ if (Size != Len) ++ RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16)); ++ RtCopyMem(Dest, Src, Size * sizeof(CHAR16)); ++} ++ ++#ifndef __GNUC__ ++#pragma RUNTIME_CODE(RtStrCpy) ++#endif ++CHAR16 * ++RUNTIMEFUNCTION ++RtStpCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src ++ ) ++// copy strings ++{ ++ while (*Src) { ++ *(Dest++) = *(Src++); ++ } ++ *Dest = 0; ++ return Dest; ++} ++ ++#ifndef __GNUC__ ++#pragma RUNTIME_CODE(RtStrnCpy) ++#endif ++CHAR16 * ++RUNTIMEFUNCTION ++RtStpnCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ) ++// copy strings ++{ ++ UINTN Size = RtStrnLen(Src, Len); ++ if (Size != Len) ++ RtSetMem(Dest + Len, '\0', (Len - Size) * sizeof(CHAR16)); ++ RtCopyMem(Dest, Src, Size * sizeof(CHAR16)); ++ return Dest + Size; ++} ++ + #ifndef __GNUC__ + #pragma RUNTIME_CODE(RtStrCat) + #endif +@@ -66,10 +121,24 @@ RtStrCat ( + IN CHAR16 *Dest, + IN CONST CHAR16 *Src + ) +-{ ++{ + RtStrCpy(Dest+StrLen(Dest), Src); + } + ++#ifndef __GNUC__ ++#pragma RUNTIME_CODE(RtStrCat) ++#endif ++VOID ++RUNTIMEFUNCTION ++RtStrnCat ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ) ++{ ++ RtStrnCpy(Dest+StrLen(Dest), Src, Len); ++} ++ + #ifndef __GNUC__ + #pragma RUNTIME_CODE(RtStrLen) + #endif +@@ -81,11 +150,28 @@ RtStrLen ( + // string length + { + UINTN len; +- ++ + for (len=0; *s1; s1+=1, len+=1) ; + return len; + } + ++#ifndef __GNUC__ ++#pragma RUNTIME_CODE(RtStrnLen) ++#endif ++UINTN ++RUNTIMEFUNCTION ++RtStrnLen ( ++ IN CONST CHAR16 *s1, ++ IN UINTN Len ++ ) ++// copy strings ++{ ++ UINTN i; ++ for (i = 0; *s1 && i < Len; i++) ++ s1++; ++ return i; ++} ++ + #ifndef __GNUC__ + #pragma RUNTIME_CODE(RtStrSize) + #endif +@@ -97,7 +183,7 @@ RtStrSize ( + // string size + { + UINTN len; +- ++ + for (len=0; *s1; s1+=1, len+=1) ; + return (len + 1) * sizeof(CHAR16); + } +diff --git a/lib/str.c b/lib/str.c +index cf1495c1fc8..9a89f30ee55 100644 +--- a/lib/str.c ++++ b/lib/str.c +@@ -113,6 +113,38 @@ StrCpy ( + RtStrCpy (Dest, Src); + } + ++VOID ++StrnCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ) ++// copy strings ++{ ++ RtStrnCpy (Dest, Src, Len); ++} ++ ++CHAR16 * ++StpCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src ++ ) ++// copy strings ++{ ++ return RtStpCpy (Dest, Src); ++} ++ ++CHAR16 * ++StpnCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ) ++// copy strings ++{ ++ return RtStpnCpy (Dest, Src, Len); ++} ++ + VOID + StrCat ( + IN CHAR16 *Dest, +@@ -122,6 +154,27 @@ StrCat ( + RtStrCat(Dest, Src); + } + ++VOID ++StrnCat ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ) ++{ ++ RtStrnCat(Dest, Src, Len); ++} ++ ++ ++UINTN ++StrnLen ( ++ IN CONST CHAR16 *s1, ++ IN UINTN Len ++ ) ++// string length ++{ ++ return RtStrnLen(s1, Len); ++} ++ + UINTN + StrLen ( + IN CONST CHAR16 *s1 +diff --git a/inc/efilib.h b/inc/efilib.h +index 22da65bbc27..8a507aff7cd 100644 +--- a/inc/efilib.h ++++ b/inc/efilib.h +@@ -313,17 +313,50 @@ StrCpy ( + IN CONST CHAR16 *Src + ); + ++VOID ++StrnCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ); ++ ++CHAR16 * ++StpCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src ++ ); ++ ++CHAR16 * ++StpnCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ); ++ + VOID + StrCat ( + IN CHAR16 *Dest, + IN CONST CHAR16 *Src + ); + ++VOID ++StrnCat ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ); ++ + UINTN + StrLen ( + IN CONST CHAR16 *s1 + ); + ++UINTN ++StrnLen ( ++ IN CONST CHAR16 *s1, ++ IN UINTN Len ++ ); ++ + UINTN + StrSize ( + IN CONST CHAR16 *s1 +diff --git a/inc/efirtlib.h b/inc/efirtlib.h +index c073ead97a7..49d0b4d3ae0 100644 +--- a/inc/efirtlib.h ++++ b/inc/efirtlib.h +@@ -69,6 +69,29 @@ RtStrCpy ( + IN CONST CHAR16 *Src + ); + ++VOID ++RUNTIMEFUNCTION ++RtStrnCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ); ++ ++CHAR16 * ++RUNTIMEFUNCTION ++RtStpCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src ++ ); ++ ++CHAR16 * ++RUNTIMEFUNCTION ++RtStpnCpy ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ); ++ + VOID + RUNTIMEFUNCTION + RtStrCat ( +@@ -76,12 +99,27 @@ RtStrCat ( + IN CONST CHAR16 *Src + ); + ++VOID ++RUNTIMEFUNCTION ++RtStrnCat ( ++ IN CHAR16 *Dest, ++ IN CONST CHAR16 *Src, ++ IN UINTN Len ++ ); ++ + UINTN + RUNTIMEFUNCTION + RtStrLen ( + IN CONST CHAR16 *s1 + ); + ++UINTN ++RUNTIMEFUNCTION ++RtStrnLen ( ++ IN CONST CHAR16 *s1, ++ IN UINTN Len ++ ); ++ + UINTN + RUNTIMEFUNCTION + RtStrSize ( +-- +2.15.0 + diff --git a/SOURCES/0019-Add-D-to-print-device-paths.patch b/SOURCES/0019-Add-D-to-print-device-paths.patch new file mode 100644 index 0000000..53bf24b --- /dev/null +++ b/SOURCES/0019-Add-D-to-print-device-paths.patch @@ -0,0 +1,47 @@ +From 28793041d7f26a6771837967c495f3ae7ba1134a Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:29 -0400 +Subject: [PATCH 19/25] Add %D to print device paths + +Add %D to print device paths. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + lib/print.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/lib/print.c b/lib/print.c +index ed79c43825b..35e43c03db5 100644 +--- a/lib/print.c ++++ b/lib/print.c +@@ -1005,6 +1005,7 @@ Routine Description: + t - EFI time structure + g - Pointer to GUID + r - EFI status code (result code) ++ D - pointer to Device Path with normal ending. + + N - Set output attribute to normal + H - Set output attribute to highlight +@@ -1167,6 +1168,18 @@ Returns: + Item.Item.pw = Item.Scratch; + break; + ++ case 'D': ++ { ++ EFI_DEVICE_PATH *dp = va_arg(ps->args, EFI_DEVICE_PATH *); ++ CHAR16 *dpstr = DevicePathToStr(dp); ++ StrnCpy(Item.Scratch, dpstr, PRINT_ITEM_BUFFER_LEN); ++ Item.Scratch[PRINT_ITEM_BUFFER_LEN-1] = L'\0'; ++ FreePool(dpstr); ++ ++ Item.Item.pw = Item.Scratch; ++ break; ++ } ++ + case 'f': + FloatToString ( + Item.Scratch, +-- +2.15.0 + diff --git a/SOURCES/0020-Make-ARCH-overrideable-on-the-command-line.patch b/SOURCES/0020-Make-ARCH-overrideable-on-the-command-line.patch new file mode 100644 index 0000000..ce84e13 --- /dev/null +++ b/SOURCES/0020-Make-ARCH-overrideable-on-the-command-line.patch @@ -0,0 +1,31 @@ +From 2c624c22fe873099d398e86b9f09cffcae9f0af8 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:30 -0400 +Subject: [PATCH 20/25] Make ARCH overrideable on the command line + +Make ARCH overrideable on the command line. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + Make.defaults | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/Make.defaults b/Make.defaults +index a457190aa3a..4aa57ac5f7c 100755 +--- a/Make.defaults ++++ b/Make.defaults +@@ -62,8 +62,8 @@ OBJCOPY := $(prefix)$(CROSS_COMPILE)objcopy + + # Host/target identification + OS := $(shell uname -s) +-HOSTARCH := $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv7.*,arm,' ) +-ARCH := $(HOSTARCH) ++HOSTARCH ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv7.*,arm,' ) ++ARCH ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv7.*,arm,' ) + + # Get ARCH from the compiler if cross compiling + ifneq ($(CROSS_COMPILE),) +-- +2.15.0 + diff --git a/SOURCES/0021-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch b/SOURCES/0021-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch new file mode 100644 index 0000000..880fae6 --- /dev/null +++ b/SOURCES/0021-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch @@ -0,0 +1,447 @@ +From 5ec879ace760faacfa940a1933e0339e8f3811bd Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:31 -0400 +Subject: [PATCH 21/25] apps: Add bltgrid and lfbgrid, and add error checks to + modelist + +This adds bltgrid and lfbgrid, which draw checkerboards using GOP's +Blt() and linear framebuffer, respectively, and adds some error checks +to modelist.efi. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + apps/bltgrid.c | 131 +++++++++++++++++++++++++++++++++++++++++++ + apps/lfbgrid.c | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + apps/modelist.c | 56 +++++++++---------- + apps/Makefile | 3 +- + 4 files changed, 328 insertions(+), 32 deletions(-) + create mode 100644 apps/bltgrid.c + create mode 100644 apps/lfbgrid.c + +diff --git a/apps/bltgrid.c b/apps/bltgrid.c +new file mode 100644 +index 00000000000..2adde6a3211 +--- /dev/null ++++ b/apps/bltgrid.c +@@ -0,0 +1,131 @@ ++#include ++#include ++ ++extern EFI_GUID GraphicsOutputProtocol; ++ ++static void ++fill_boxes(UINT32 *PixelBuffer, UINT32 Width, UINT32 Height) ++{ ++ UINT32 y, x = 0; ++ /* ++ * This assums BGRR, but it doesn't really matter; we pick red and ++ * green so it'll just be blue/green if the pixel format is backwards. ++ */ ++ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Red = {0, 0, 0xff, 0}, ++ Green = {0, 0xff, 0, 0}, ++ *Color; ++ ++ for (y = 0; y < Height; y++) { ++ Color = ((y / 32) % 2 == 0) ? &Red : &Green; ++ for (x = 0; x < Width; x++) { ++ if (x % 32 == 0 && x != 0) ++ Color = (Color == &Red) ? &Green : &Red; ++ PixelBuffer[y * Width + x] = *(UINT32 *)Color; ++ } ++ } ++} ++ ++static void ++draw_boxes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop) ++{ ++ int i, imax; ++ EFI_STATUS rc; ++ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; ++ UINTN NumPixels; ++ UINT32 *PixelBuffer; ++ UINT32 BufferSize; ++ ++ if (gop->Mode) { ++ imax = gop->Mode->MaxMode; ++ } else { ++ Print(L"gop->Mode is NULL\n"); ++ return; ++ } ++ ++ for (i = 0; i < imax; i++) { ++ UINTN SizeOfInfo; ++ rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, ++ &info); ++ if (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) { ++ Print(L"gop->QueryMode() returned %r\n", rc); ++ Print(L"Trying to start GOP with SetMode().\n"); ++ rc = uefi_call_wrapper(gop->SetMode, 2, gop, ++ gop->Mode ? gop->Mode->Mode : 0); ++ rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, ++ &SizeOfInfo, &info); ++ } ++ ++ if (EFI_ERROR(rc)) { ++ Print(L"%d: Bad response from QueryMode: %r (%d)\n", ++ i, rc, rc); ++ continue; ++ } ++ ++ if (CompareMem(info, gop->Mode->Info, sizeof (*info))) ++ continue; ++ ++ NumPixels = info->VerticalResolution * info->HorizontalResolution; ++ BufferSize = NumPixels * sizeof(UINT32); ++ ++ PixelBuffer = AllocatePool(BufferSize); ++ if (!PixelBuffer) { ++ Print(L"Allocation of 0x%08lx bytes failed.\n", ++ sizeof(UINT32) * NumPixels); ++ return; ++ } ++ ++ fill_boxes(PixelBuffer, ++ info->HorizontalResolution, info->VerticalResolution); ++ ++ uefi_call_wrapper(gop->Blt, 10, gop, ++ (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *)PixelBuffer, ++ EfiBltBufferToVideo, ++ 0, 0, 0, 0, ++ info->HorizontalResolution, ++ info->VerticalResolution, ++ 0); ++ return; ++ } ++ Print(L"Never found the active video mode?\n"); ++} ++ ++static EFI_STATUS ++SetWatchdog(UINTN seconds) ++{ ++ EFI_STATUS rc; ++ rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff, ++ 0, NULL); ++ if (EFI_ERROR(rc)) { ++ CHAR16 Buffer[64]; ++ StatusToString(Buffer, rc); ++ Print(L"Bad response from QueryMode: %s (%d)\n", Buffer, rc); ++ } ++ return rc; ++} ++ ++EFI_STATUS ++efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) ++{ ++ EFI_STATUS rc; ++ EFI_GRAPHICS_OUTPUT_PROTOCOL *gop; ++ ++ InitializeLib(image_handle, systab); ++ ++ SetWatchdog(10); ++ ++ rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop); ++ if (EFI_ERROR(rc)) { ++ Print(L"Could not locate GOP: %r\n", rc); ++ return rc; ++ } ++ ++ if (!gop) { ++ Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc); ++ return EFI_UNSUPPORTED; ++ } ++ ++ draw_boxes(gop); ++ ++ SetWatchdog(0); ++ return EFI_SUCCESS; ++} +diff --git a/apps/lfbgrid.c b/apps/lfbgrid.c +new file mode 100644 +index 00000000000..53a255afbb9 +--- /dev/null ++++ b/apps/lfbgrid.c +@@ -0,0 +1,170 @@ ++#include ++#include ++ ++extern EFI_GUID GraphicsOutputProtocol; ++ ++#define be32_to_cpu(x) __builtin_bswap32(x) ++ ++static void ++fill_boxes(UINT32 *PixelBuffer, UINT32 Width, UINT32 Height, UINT32 Pitch, ++ EFI_GRAPHICS_PIXEL_FORMAT Format, EFI_PIXEL_BITMASK Info ) ++{ ++ UINT32 Red, Green; ++ UINT32 y, x, color; ++ ++ switch(Format) { ++ case PixelRedGreenBlueReserved8BitPerColor: ++ Red = be32_to_cpu(0xff000000); ++ Green = be32_to_cpu(0x00ff0000); ++ break; ++ case PixelBlueGreenRedReserved8BitPerColor: ++ Red = be32_to_cpu(0x0000ff00); ++ Green = be32_to_cpu(0x00ff0000); ++ break; ++ case PixelBitMask: ++ Red = Info.RedMask; ++ Green = Info.GreenMask; ++ break; ++ case PixelBltOnly: ++ return; ++ default: ++ Print(L"Invalid pixel format\n"); ++ return; ++ } ++ ++ for (y = 0; y < Height; y++) { ++ color = ((y / 32) % 2 == 0) ? Red : Green; ++ for (x = 0; x < Width; x++) { ++ if (x % 32 == 0 && x != 0) ++ color = (color == Red) ? Green : Red; ++ PixelBuffer[y * Pitch + x] = color; ++ } ++ } ++} ++ ++static void ++draw_boxes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop) ++{ ++ int i, imax; ++ EFI_STATUS rc; ++ EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; ++ UINTN NumPixels; ++ UINT32 *PixelBuffer; ++ UINT32 CopySize, BufferSize; ++#if defined(__x86_64__) || defined(__aarch64__) ++ UINT64 FrameBufferAddr; ++#elif defined(__i386__) || defined(__arm__) ++ UINT32 FrameBufferAddr; ++#else ++#error YOUR ARCH HERE ++#endif ++ ++ if (gop->Mode) { ++ imax = gop->Mode->MaxMode; ++ } else { ++ Print(L"gop->Mode is NULL\n"); ++ return; ++ } ++ ++ for (i = 0; i < imax; i++) { ++ UINTN SizeOfInfo; ++ rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, ++ &info); ++ if (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) { ++ Print(L"gop->QueryMode() returned %r\n", rc); ++ Print(L"Trying to start GOP with SetMode().\n"); ++ rc = uefi_call_wrapper(gop->SetMode, 2, gop, ++ gop->Mode ? gop->Mode->Mode : 0); ++ rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, ++ &SizeOfInfo, &info); ++ } ++ ++ if (EFI_ERROR(rc)) { ++ Print(L"%d: Bad response from QueryMode: %r (%d)\n", ++ i, rc, rc); ++ continue; ++ } ++ ++ if (CompareMem(info, gop->Mode->Info, sizeof (*info))) ++ continue; ++ ++ NumPixels = info->VerticalResolution * info->PixelsPerScanLine; ++ BufferSize = NumPixels * sizeof(UINT32); ++ if (BufferSize == gop->Mode->FrameBufferSize) { ++ CopySize = BufferSize; ++ } else { ++ CopySize = BufferSize < gop->Mode->FrameBufferSize ? ++ BufferSize : gop->Mode->FrameBufferSize; ++ Print(L"height * pitch * pixelsize = %lu buf fb size is %lu; using %lu\n", ++ BufferSize, gop->Mode->FrameBufferSize, CopySize); ++ } ++ ++ PixelBuffer = AllocatePool(BufferSize); ++ if (!PixelBuffer) { ++ Print(L"Allocation of 0x%08lx bytes failed.\n", ++ sizeof(UINT32) * NumPixels); ++ return; ++ } ++ ++ fill_boxes(PixelBuffer, info->HorizontalResolution, ++ info->VerticalResolution, info->PixelsPerScanLine, ++ info->PixelFormat, info->PixelInformation); ++ ++ if (info->PixelFormat == PixelBltOnly) { ++ Print(L"No linear framebuffer on this device.\n"); ++ return; ++ } ++#if defined(__x86_64__) || defined(__aarch64__) ++ FrameBufferAddr = (UINT64)gop->Mode->FrameBufferBase; ++#elif defined(__i386__) || defined(__arm__) ++ FrameBufferAddr = (UINT32)(UINT64)gop->Mode->FrameBufferBase; ++#else ++#error YOUR ARCH HERE ++#endif ++ ++ CopyMem((VOID *)FrameBufferAddr, PixelBuffer, CopySize); ++ return; ++ } ++ Print(L"Never found the active video mode?\n"); ++} ++ ++static EFI_STATUS ++SetWatchdog(UINTN seconds) ++{ ++ EFI_STATUS rc; ++ rc = uefi_call_wrapper(BS->SetWatchdogTimer, 4, seconds, 0x1ffff, ++ 0, NULL); ++ if (EFI_ERROR(rc)) { ++ CHAR16 Buffer[64]; ++ StatusToString(Buffer, rc); ++ Print(L"Bad response from QueryMode: %s (%d)\n", Buffer, rc); ++ } ++ return rc; ++} ++ ++EFI_STATUS ++efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) ++{ ++ EFI_STATUS rc; ++ EFI_GRAPHICS_OUTPUT_PROTOCOL *gop; ++ ++ InitializeLib(image_handle, systab); ++ ++ SetWatchdog(10); ++ ++ rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop); ++ if (EFI_ERROR(rc)) { ++ Print(L"Could not locate GOP: %r\n", rc); ++ return rc; ++ } ++ ++ if (!gop) { ++ Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc); ++ return EFI_UNSUPPORTED; ++ } ++ ++ draw_boxes(gop); ++ ++ SetWatchdog(0); ++ return EFI_SUCCESS; ++} +diff --git a/apps/modelist.c b/apps/modelist.c +index 8d816d1d9da..26892e1d5f5 100644 +--- a/apps/modelist.c ++++ b/apps/modelist.c +@@ -3,57 +3,44 @@ + + extern EFI_GUID GraphicsOutputProtocol; + +-static int memcmp(const void *s1, const void *s2, UINTN n) +-{ +- const unsigned char *c1 = s1, *c2 = s2; +- int d = 0; +- +- if (!s1 && !s2) +- return 0; +- if (s1 && !s2) +- return 1; +- if (!s1 && s2) +- return -1; +- +- while (n--) { +- d = (int)*c1++ - (int)*c2++; +- if (d) +- break; +- } +- return d; +-} +- + static void + print_modes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop) + { + int i, imax; + EFI_STATUS rc; + +- imax = gop->Mode->MaxMode; ++ if (gop->Mode) { ++ imax = gop->Mode->MaxMode; ++ Print(L"GOP reports MaxMode %d\n", imax); ++ } else { ++ Print(L"gop->Mode is NULL\n"); ++ imax = 1; ++ } + +- Print(L"GOP reports MaxMode %d\n", imax); + for (i = 0; i < imax; i++) { + EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *info; + UINTN SizeOfInfo; + rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, &SizeOfInfo, + &info); + if (EFI_ERROR(rc) && rc == EFI_NOT_STARTED) { ++ Print(L"gop->QueryMode() returned %r\n", rc); ++ Print(L"Trying to start GOP with SetMode().\n"); + rc = uefi_call_wrapper(gop->SetMode, 2, gop, +- gop->Mode->Mode); ++ gop->Mode ? gop->Mode->Mode : 0); + rc = uefi_call_wrapper(gop->QueryMode, 4, gop, i, + &SizeOfInfo, &info); + } + + if (EFI_ERROR(rc)) { +- CHAR16 Buffer[64]; +- StatusToString(Buffer, rc); +- Print(L"%d: Bad response from QueryMode: %s (%d)\n", +- i, Buffer, rc); ++ Print(L"%d: Bad response from QueryMode: %r (%d)\n", ++ i, rc, rc); + continue; + } +- Print(L"%c%d: %dx%d ", memcmp(info,gop->Mode->Info,sizeof(*info)) == 0 ? '*' : ' ', i, +- info->HorizontalResolution, +- info->VerticalResolution); ++ Print(L"%c%d: %dx%d ", ++ (gop->Mode && ++ CompareMem(info,gop->Mode->Info,sizeof(*info)) == 0 ++ ) ? '*' : ' ', ++ i, info->HorizontalResolution, info->VerticalResolution); + switch(info->PixelFormat) { + case PixelRedGreenBlueReserved8BitPerColor: + Print(L"RGBR"); +@@ -104,8 +91,15 @@ efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) + SetWatchdog(10); + + rc = LibLocateProtocol(&GraphicsOutputProtocol, (void **)&gop); +- if (EFI_ERROR(rc)) ++ if (EFI_ERROR(rc)) { ++ Print(L"Could not locate GOP: %r\n", rc); + return rc; ++ } ++ ++ if (!gop) { ++ Print(L"LocateProtocol(GOP, &gop) returned %r but GOP is NULL\n", rc); ++ return EFI_UNSUPPORTED; ++ } + + print_modes(gop); + +diff --git a/apps/Makefile b/apps/Makefile +index 5fffd4254c8..4e26444c469 100644 +--- a/apps/Makefile ++++ b/apps/Makefile +@@ -61,7 +61,8 @@ LOADLIBES += -T $(LDSCRIPT) + TARGET_APPS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi \ + printenv.efi t7.efi t8.efi tcc.efi modelist.efi \ + route80h.efi drv0_use.efi AllocPages.efi exit.efi \ +- FreePages.efi setjmp.efi debughook.efi debughook.efi.debug ++ FreePages.efi setjmp.efi debughook.efi debughook.efi.debug \ ++ bltgrid.efi lfbgrid.efi + TARGET_BSDRIVERS = drv0.efi + TARGET_RTDRIVERS = + +-- +2.15.0 + diff --git a/SOURCES/0022-Nerf-Werror-pragma-away.patch b/SOURCES/0022-Nerf-Werror-pragma-away.patch new file mode 100644 index 0000000..305cb2f --- /dev/null +++ b/SOURCES/0022-Nerf-Werror-pragma-away.patch @@ -0,0 +1,29 @@ +From be57aadba6092027d21c04d4ededb2e83abe9016 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:32 -0400 +Subject: [PATCH 22/25] Nerf -Werror=pragma away + +Nerf -Werror=-pragma away + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + Make.defaults | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/Make.defaults b/Make.defaults +index 4aa57ac5f7c..ed4b60c2423 100755 +--- a/Make.defaults ++++ b/Make.defaults +@@ -87,6 +87,8 @@ OBJDIR := $(TOPDIR)/$(ARCH) + # Arch-specific compilation flags + CPPFLAGS += -DCONFIG_$(ARCH) + ++CFLAGS += -Wno-error=pragmas ++ + ifeq ($(ARCH),ia64) + CFLAGS += -mfixed-range=f32-f127 + endif +-- +2.15.0 + diff --git a/SOURCES/0023-Call-ar-in-deterministic-mode.patch b/SOURCES/0023-Call-ar-in-deterministic-mode.patch new file mode 100644 index 0000000..1af9e80 --- /dev/null +++ b/SOURCES/0023-Call-ar-in-deterministic-mode.patch @@ -0,0 +1,72 @@ +From 656e495d515b0fc1f01add164aa4bba9a49ceb31 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:34 -0400 +Subject: [PATCH 23/25] Call ar in deterministic mode. + +We need the x86_64 and i686 builds of .a's to be the same, and that +means we need to not have timestamps. Also force the timestamps on disk +just in case that doesn't work, because RHEL's ar /silently ignores -D/. + +v2: use "ar rvD" not "ar rv -D". + +It's a wonder anybody ever gets these command line options right, if +"ar rv -D libfoo.a foo.o" doesn't use deterministic mode (or +complain), but "ar rvD libfoo.a foo.o" does. + +v3: Add a bunch of junk to try to set timestamps to 0 manually + +For some reason I'm still getting timestamps in the .a even though ar seems to +be invoked correctly. When I do "mock -r rhel-7-build --shell" and run make +manually, they're fine. Very strange. + +v4: go back to v2, the problem isn't in the make process. + +"ar rDv" works just fine, but /usr/lib/rpm/redhat/brp-strip-static-archive is +calling "%{__strip} -g $for_each.a", and it's rewriting our binary from +ts/uid/gid of 0/0/0 to $epoch/$UID/$GID. Awesomely /usr/bin/strip it seems to +have 3 modes of operation: +-U: the default, which adds $epoch/$UID/$GID to your binary archive + instead of just removing stuff. Clearly the Principle of Least + Surprise is strong here. +-p: preserve the timestamp from the original .a, but add UID and GID, + because this is 1980 and people use ar(1) for archiving stuff they + might want that out of. +-D: Condescend at you in a command line error and explain that -D both + is and is not a valid option: + /usr/bin/strip: invalid option -- 'D' + Usage: /usr/bin/strip in-file(s) + Removes symbols and sections from files + The options are: + ... + -D --enable-deterministic-archives + Produce deterministic output when stripping archives + So I agree that it's invalid, but I think we may be pronouncing that + second vowel differently. They say in-VAL-id, I say IN-vuh-lid. + +Nobody should ever have to run "strace -ttt -v -f -o make.strace make all", +just to discover the problem isn't even in there. + +Related: rhbz#1310782 + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + Make.defaults | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Make.defaults b/Make.defaults +index ed4b60c2423..ba743f17893 100755 +--- a/Make.defaults ++++ b/Make.defaults +@@ -177,7 +177,7 @@ CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \ + $(if $(findstring gcc,$(CC)),-fno-merge-all-constants,) + endif + +-ARFLAGS += -U ++ARFLAGS := rDv + ASFLAGS += $(ARCH3264) + LDFLAGS += -nostdlib --warn-common --no-undefined --fatal-warnings \ + --build-id=sha1 +-- +2.15.0 + diff --git a/SOURCES/0024-Add-debug-helper-applications.patch b/SOURCES/0024-Add-debug-helper-applications.patch new file mode 100644 index 0000000..c2b4aec --- /dev/null +++ b/SOURCES/0024-Add-debug-helper-applications.patch @@ -0,0 +1,119 @@ +From b030bfce35fe4b9a4eec88442e2027e4d6ec60de Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 13 Mar 2018 15:20:35 -0400 +Subject: [PATCH 24/25] Add debug helper applications + +Add debug helper applications. + +Signed-off-by: Peter Jones +Signed-off-by: Nigel Croxon +--- + apps/setdbg.c | 37 +++++++++++++++++++++++++++++++++++++ + apps/unsetdbg.c | 37 +++++++++++++++++++++++++++++++++++++ + apps/Makefile | 2 +- + 3 files changed, 75 insertions(+), 1 deletion(-) + create mode 100644 apps/setdbg.c + create mode 100644 apps/unsetdbg.c + +diff --git a/apps/setdbg.c b/apps/setdbg.c +new file mode 100644 +index 00000000000..897140ec342 +--- /dev/null ++++ b/apps/setdbg.c +@@ -0,0 +1,37 @@ ++#include ++#include ++ ++EFI_GUID GRUB_EFI_GRUB_VARIABLE_GUID = {0x91376aff,0xcba6,0x42be,{0x94,0x9d,0x06,0xfd,0xe8,0x11,0x28,0xe8}}; ++EFI_GUID SHIM_GUID = {0x605dab50,0xe046,0x4300,{0xab,0xb6,0x3d,0xd8,0x10,0xdd,0x8b,0x23}}; ++ ++char grubenv[] = "# GRUB Environment Block\n\ ++debug=tcp,http,net\n\ ++####################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################"; ++ ++EFI_STATUS ++efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) ++{ ++ EFI_STATUS status; ++ InitializeLib(image, systab); ++#if 0 ++ UINT8 data = 1; ++ ++ status = RT->SetVariable(L"SHIM_DEBUG", &SHIM_GUID, ++ EFI_VARIABLE_NON_VOLATILE | ++ EFI_VARIABLE_BOOTSERVICE_ACCESS | ++ EFI_VARIABLE_RUNTIME_ACCESS, ++ sizeof(data), &data); ++ if (EFI_ERROR(status)) ++ Print(L"SetVariable failed: %r\n", status); ++#endif ++ ++ status = RT->SetVariable(L"GRUB_ENV", &SHIM_GUID, ++ EFI_VARIABLE_NON_VOLATILE | ++ EFI_VARIABLE_BOOTSERVICE_ACCESS | ++ EFI_VARIABLE_RUNTIME_ACCESS, ++ sizeof(grubenv)-1, grubenv); ++ if (EFI_ERROR(status)) ++ Print(L"SetVariable(GRUB_ENV) failed: %r\n", status); ++ ++ return EFI_SUCCESS; ++} +diff --git a/apps/unsetdbg.c b/apps/unsetdbg.c +new file mode 100644 +index 00000000000..731e09b1343 +--- /dev/null ++++ b/apps/unsetdbg.c +@@ -0,0 +1,37 @@ ++#include ++#include ++ ++EFI_GUID GRUB_EFI_GRUB_VARIABLE_GUID = {0x91376aff,0xcba6,0x42be,{0x94,0x9d,0x06,0xfd,0xe8,0x11,0x28,0xe8}}; ++EFI_GUID SHIM_GUID = {0x605dab50,0xe046,0x4300,{0xab,0xb6,0x3d,0xd8,0x10,0xdd,0x8b,0x23}}; ++ ++char grubenv[] = "# GRUB Environment Block\n\ ++debug=all\n\ ++#############################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################################"; ++ ++EFI_STATUS ++efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) ++{ ++ EFI_STATUS status; ++ UINT8 data = 1; ++ InitializeLib(image, systab); ++ ++ status = RT->SetVariable(L"SHIM_DEBUG", &SHIM_GUID, ++ EFI_VARIABLE_NON_VOLATILE | ++ EFI_VARIABLE_BOOTSERVICE_ACCESS | ++ EFI_VARIABLE_RUNTIME_ACCESS, ++ 0, &data); ++ if (EFI_ERROR(status)) ++ Print(L"SetVariable failed: %r\n", status); ++ ++#if 0 ++ status = RT->SetVariable(L"GRUB_ENV", &SHIM_GUID, ++ EFI_VARIABLE_NON_VOLATILE | ++ EFI_VARIABLE_BOOTSERVICE_ACCESS | ++ EFI_VARIABLE_RUNTIME_ACCESS, ++ sizeof(grubenv)-1, grubenv); ++ if (EFI_ERROR(status)) ++ Print(L"SetVariable(GRUB_ENV) failed: %r\n", status); ++#endif ++ ++ return EFI_SUCCESS; ++} +diff --git a/apps/Makefile b/apps/Makefile +index 4e26444c469..4e1b69a38c8 100644 +--- a/apps/Makefile ++++ b/apps/Makefile +@@ -62,7 +62,7 @@ TARGET_APPS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi \ + printenv.efi t7.efi t8.efi tcc.efi modelist.efi \ + route80h.efi drv0_use.efi AllocPages.efi exit.efi \ + FreePages.efi setjmp.efi debughook.efi debughook.efi.debug \ +- bltgrid.efi lfbgrid.efi ++ bltgrid.efi lfbgrid.efi setdbg.efi unsetdbg.efi + TARGET_BSDRIVERS = drv0.efi + TARGET_RTDRIVERS = + +-- +2.15.0 + diff --git a/SOURCES/0025-Bump-revision-from-VERSION-3.0.7-to-VERSION-3.0.8.patch b/SOURCES/0025-Bump-revision-from-VERSION-3.0.7-to-VERSION-3.0.8.patch new file mode 100644 index 0000000..06023e6 --- /dev/null +++ b/SOURCES/0025-Bump-revision-from-VERSION-3.0.7-to-VERSION-3.0.8.patch @@ -0,0 +1,26 @@ +From fc5af9e47fb63fbadf6acd218abc60352ce41e31 Mon Sep 17 00:00:00 2001 +From: Nigel Croxon +Date: Wed, 14 Mar 2018 14:54:51 -0400 +Subject: [PATCH 25/25] Bump revision from VERSION = 3.0.7 to VERSION = 3.0.8 + +Signed-off-by: Nigel Croxon +--- + Makefile | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/Makefile b/Makefile +index a9f7e134e14..4e58e029e7f 100644 +--- a/Makefile ++++ b/Makefile +@@ -34,7 +34,7 @@ + # SUCH DAMAGE. + # + +-VERSION = 3.0.7 ++VERSION = 3.0.8 + + MKFILE_PATH := $(abspath $(lastword $(MAKEFILE_LIST))) + SRCDIR = $(dir $(MKFILE_PATH)) +-- +2.15.0 + diff --git a/SOURCES/0026-Work-around-some-intptr_t-weirdnesses.patch b/SOURCES/0026-Work-around-some-intptr_t-weirdnesses.patch new file mode 100644 index 0000000..ed4ec43 --- /dev/null +++ b/SOURCES/0026-Work-around-some-intptr_t-weirdnesses.patch @@ -0,0 +1,40 @@ +From fbba8c5118b4ad6595e5d6e4fa85100db66cbe89 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 8 Jun 2018 16:46:37 -0400 +Subject: [PATCH] Work around some intptr_t weirdnesses + +Signed-off-by: Peter Jones +--- + apps/route80h.c | 2 ++ + inc/efilink.h | 2 +- + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/apps/route80h.c b/apps/route80h.c +index 5272dd3cd44..462fead906c 100644 +--- a/apps/route80h.c ++++ b/apps/route80h.c +@@ -1,6 +1,8 @@ + #include + #include + ++#include ++ + /* this example program changes the Reserved Page Route (RPR) bit on ICH10's General + * Control And Status Register (GCS) from LPC to PCI. In practical terms, it routes + * outb to port 80h to the PCI bus. */ +diff --git a/inc/efilink.h b/inc/efilink.h +index cc5aa2dc57b..40a81581540 100644 +--- a/inc/efilink.h ++++ b/inc/efilink.h +@@ -142,7 +142,7 @@ typedef struct _LIST_ENTRY { + // EFI_FIELD_OFFSET - returns the byte offset to a field within a structure + // + +-#define EFI_FIELD_OFFSET(TYPE,Field) ((UINTN)(intptr_t)(&(((TYPE *) 0)->Field))) ++#define EFI_FIELD_OFFSET(TYPE,Field) __builtin_offsetof(TYPE, Field) + + // + // CONTAINING_RECORD - returns a pointer to the structure +-- +2.17.1 + diff --git a/SOURCES/0027-Fix-a-minor-coverity-complaint-in-some-apps.patch b/SOURCES/0027-Fix-a-minor-coverity-complaint-in-some-apps.patch new file mode 100644 index 0000000..88dc8e8 --- /dev/null +++ b/SOURCES/0027-Fix-a-minor-coverity-complaint-in-some-apps.patch @@ -0,0 +1,59 @@ +From 3d3ff8a8c28843eca15a96c518c4f1aa0b7c3fbb Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 11 Jun 2018 13:41:05 -0400 +Subject: [PATCH] Fix a minor coverity complaint in some apps + +Coverity added a new kind of check, and it noticed some minor errors +with some types in two of the apps here, both of the same form: + +1. gnu-efi-3.0.6/apps/lfbgrid.c:91: overflow_before_widen: Potentially +overflowing expression "info->VerticalResolution * +info->PixelsPerScanLine" with type "unsigned int" (32 bits, unsigned) is +evaluated using 32-bit arithmetic, and then used in a context that +expects an expression of type "UINTN" (64 bits, unsigned). + +1. gnu-efi-3.0.6/apps/bltgrid.c:67: overflow_before_widen: Potentially +overflowing expression "info->VerticalResolution * +info->HorizontalResolution" with type "unsigned int" (32 bits, unsigned) +is evaluated using 32-bit arithmetic, and then used in a context that +expects an expression of type "UINTN" (64 bits, unsigned). + +This resolves both issues. + +Signed-off-by: Peter Jones +--- + apps/bltgrid.c | 3 ++- + apps/lfbgrid.c | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/apps/bltgrid.c b/apps/bltgrid.c +index 2adde6a3211..a0eb8c779e4 100644 +--- a/apps/bltgrid.c ++++ b/apps/bltgrid.c +@@ -64,7 +64,8 @@ draw_boxes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop) + if (CompareMem(info, gop->Mode->Info, sizeof (*info))) + continue; + +- NumPixels = info->VerticalResolution * info->HorizontalResolution; ++ NumPixels = (UINTN)info->VerticalResolution ++ * (UINTN)info->HorizontalResolution; + BufferSize = NumPixels * sizeof(UINT32); + + PixelBuffer = AllocatePool(BufferSize); +diff --git a/apps/lfbgrid.c b/apps/lfbgrid.c +index 53a255afbb9..ac50f4eafa9 100644 +--- a/apps/lfbgrid.c ++++ b/apps/lfbgrid.c +@@ -88,7 +88,8 @@ draw_boxes(EFI_GRAPHICS_OUTPUT_PROTOCOL *gop) + if (CompareMem(info, gop->Mode->Info, sizeof (*info))) + continue; + +- NumPixels = info->VerticalResolution * info->PixelsPerScanLine; ++ NumPixels = (UINTN)info->VerticalResolution ++ * (UINTN)info->PixelsPerScanLine; + BufferSize = NumPixels * sizeof(UINT32); + if (BufferSize == gop->Mode->FrameBufferSize) { + CopySize = BufferSize; +-- +2.17.1 + diff --git a/SPECS/gnu-efi.spec b/SPECS/gnu-efi.spec new file mode 100644 index 0000000..d3541b1 --- /dev/null +++ b/SPECS/gnu-efi.spec @@ -0,0 +1,445 @@ +Summary: Development Libraries and headers for EFI +Name: gnu-efi +Version: 3.0.8 +%global tarball_version 3.0.6 +Release: 2%{?dist}%{?buildid} +Epoch: 1 +Group: Development/System +License: BSD +URL: ftp://ftp.hpl.hp.com/pub/linux-ia64 +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +ExclusiveArch: x86_64 aarch64 +BuildRequires: git +%ifarch x86_64 +BuildRequires: glibc32 +#BuildRequires: glibc-devel(x86-32) +%endif +Source: http://superb-dca2.dl.sourceforge.net/project/gnu-efi/gnu-efi-%{tarball_version}.tar.bz2 + +# to make rpmlint shut up +%define lib %{nil}lib%{nil} + +Patch0001: 0001-PATCH-Disable-AVX-instruction-set-on-IA32-and-x86_64.patch +Patch0002: 0002-Use-ARFLAGS-when-invoking-ar.patch +Patch0003: 0003-Stripped-diff-for-makefile.patch +Patch0004: 0004-Make-sure-stdint.h-is-always-used-with-MSVC-on-ARM-A.patch +Patch0005: 0005-Add-EFI_DRIVER_ENTRY_POINT-support-for-MSVC-ARM64.patch +Patch0006: 0006-Move-memcpy-memset-definition-to-global-init.c.patch +Patch0007: 0007-Bump-revision-from-VERSION-3.0.6-to-VERSION-3.0.7.patch +Patch0008: 0008-Currently-we-have-DivU64x32-on-ia32-but-it-tries-to-.patch +Patch0009: 0009-gnuefi-preserve-.gnu.hash-sections-unbreaks-elilo-on.patch +Patch0010: 0010-gnu-efi-fix-lib-ia64-setjmp.S-IA-64-build-failure.patch +Patch0011: 0011-Fix-some-types-gcc-doesn-t-like.patch +Patch0012: 0012-Fix-arm-build-paths-in-the-makefile.patch +Patch0013: 0013-Work-around-Werror-maybe-uninitialized-not-being-ver.patch +Patch0014: 0014-Fix-a-sign-error-in-the-debughook-example-app.patch +Patch0015: 0015-Fix-typedef-of-EFI_PXE_BASE_CODE.patch +Patch0016: 0016-make-clang-not-complain-about-fno-merge-all-constant.patch +Patch0017: 0017-Fix-another-place-clang-complains-about.patch +Patch0018: 0018-gnu-efi-add-some-more-common-string-functions.patch +Patch0019: 0019-Add-D-to-print-device-paths.patch +Patch0020: 0020-Make-ARCH-overrideable-on-the-command-line.patch +Patch0021: 0021-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch +Patch0022: 0022-Nerf-Werror-pragma-away.patch +Patch0023: 0023-Call-ar-in-deterministic-mode.patch +Patch0024: 0024-Add-debug-helper-applications.patch +Patch0025: 0025-Bump-revision-from-VERSION-3.0.7-to-VERSION-3.0.8.patch +Patch0026: 0026-Work-around-some-intptr_t-weirdnesses.patch +Patch0027: 0027-Fix-a-minor-coverity-complaint-in-some-apps.patch + +%define debug_package %{nil} + +# brp-strip-static-archive will senselessly /add/ timestamps and uid/gid +# data to our .a and make them not multilib clean if we don't have this. +# Note that if we don't have the shell quotes there, -p becomes $2 on its +# invocation, and so it completely ignores it. +# +# Also note that if we try to use -D as we should (so it doesn't add +# uid/gid), strip(1) from binutils-2.25.1-22.base.el7.x86_64 throws a +# syntax error. +# +# True story. +# +%global __strip "%{__strip} -p" + +# Figure out the right file path to use +%global efidir %(eval echo $(grep ^ID= /etc/os-release | sed -e 's/^ID=//' -e 's/rhel/redhat/')) + +%ifarch x86_64 +%global efiarch x86_64 +%endif +%ifarch aarch64 +%global efiarch aarch64 +%endif +%ifarch %{ix86} +%global efiarch ia32 +%endif + +%description +This package contains development headers and libraries for developing +applications that run under EFI (Extensible Firmware Interface). + +%package devel +Summary: Development Libraries and headers for EFI +Group: Development/System +Obsoletes: gnu-efi < 1:3.0.2-1 +Requires: gnu-efi + +%description devel +This package contains development headers and libraries for developing +applications that run under EFI (Extensible Firmware Interface). + +%package utils +Summary: Utilities for EFI systems +Group: Applications/System + +%description utils +This package contains utilities for debugging and developing EFI systems. + +%prep +%setup -q -n gnu-efi-%{tarball_version} +git init +git config user.email "gnu-efi-owner@redhat.com" +git config user.name "RHEL Ninjas" +git config sendemail.to "gnu-efi-owner@fedoraproject.org" +git add . +git commit -a -q -m "%{version} baseline." +git am %{patches} - 3.0.8-2 +- Fix some minor coverity complaints. + Related: rhbz#1570032 + +* Fri Jun 08 2018 Peter Jones - 3.0.8-1 +- Update to version required by fwupdate-12 and shim-15. + Related: rhbz#1570032 + +* Thu Mar 30 2017 Peter Jones - 3.0.5-9 +- Just don't build the .i686 package at all. After a scratch build, it's + clear that "strip -p" is not good enough, because our different builders + have non-matching UIDs for the build process, and -p adds uid/gid to the + archive. So there's no way to fix the multiarch conflict here without + either fixing that or fixing strip(1) with: + https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=patch;h=7a093a78 + We don't strictly need the .i686 package anyway, since we've moved to + making the dependent binaries all build the ia32 bits on x86_64 for + other reasons. Related: rhbz#1310782 + +* Thu Mar 30 2017 Peter Jones - 3.0.5-9 +- One more attempt at nerfing timestamps. It's surprising how broken this + can be. + + "ar rDv" works just fine, but + /usr/lib/rpm/redhat/brp-strip-static-archive is calling "%%{__strip} -g + $for_each.a", and it's rewriting our binary from ts/uid/gid of 0/0/0 to + $epoch/$UID/$GID. Awesomely /usr/bin/strip it seems to have 3 modes of + operation: + -U: the default, which adds $epoch/$UID/$GID to your binary archive + instead of just removing stuff. Clearly the Principle of Least + Surprise is strong here. + -p: preserve the timestamp from the original .a, but add UID and GID, + because this is 1980 and people use ar(1) for archiving stuff they + might want that out of. + -D: Condescend at you in a command line error and explain that -D both + is and is not a valid option: + /usr/bin/strip: invalid option -- 'D' + Usage: /usr/bin/strip in-file(s) + Removes symbols and sections from files + The options are: + ... + -D --enable-deterministic-archives + Produce deterministic output when stripping archives + So I agree that it's invalid, but I think we may be pronouncing that + second vowel differently. They say in-VAL-id, I say IN-vuh-lid. + + Nobody should ever have to run "strace -ttt -v -f -o make.strace make + all", just to discover the problem isn't even in there. + Related: rhbz#1310782 + +* Tue Mar 28 2017 Peter Jones - 3.0.5-8 +- Nerf the timestamps on our .o files while building, because RHEL's ar(1) is + horrible and silently ignores the 'D' option. It's fine, I probably didn't + put it there for any reason. + Related: rhbz#1310782 + +* Tue Mar 28 2017 Peter Jones - 3.0.5-7 +- Call ar(1) in deterministic mode so our .a's are multipath clean. + Related: rhbz#1310782 + +* Mon Mar 20 2017 Peter Jones - 3.0.5-6 +- Also build the ia32 bits in a separate 32-bit package for other consumers. + Related: rhbz#1310782 + +* Wed Mar 15 2017 Peter Jones - 3.0.5-5 +- Fix a codegin bug that makes it want libgcc_s (but not know it) on ia32. + Related: rhbz#1310782 + +* Mon Mar 13 2017 Peter Jones - 3.0.5-4 +- Package the ia32 bits somewhat better. + Related: rhbz#1310782 + +* Mon Mar 13 2017 Peter Jones - 3.0.5-3 +- Include ia32 bits in the x86_64 packages instead of making a separate + 32-bit package + Resolves: rhbz#1310782 + +* Mon Mar 06 2017 Peter Jones - 3.0.5-2 +- Fix some bugs in the 3.0.5 release. + Related: rhbz#1310782 + +* Thu Feb 02 2017 Peter Jones - 3.0.5-1 +- Update to 3.0.5 +- Re-enable ia32 builds for the most hilarious changelog series... + Resolves: rhbz#1310782 + +* Mon Jun 15 2015 Peter Jones - 3.0.2-2 +- Fix .spec mismerge from upstream that causes ia32 to build. + Related: rhbz#1190191 + Related: rhbz#1115843 + Related: rhbz#1100048 + +* Mon Jun 15 2015 Peter Jones - 3.0.2-1 +- Update to 3.0.2 + Related: rhbz#1190191 + Related: rhbz#1115843 + Related: rhbz#1100048 +- Fix base package requirement on subpackages + +* Fri Aug 22 2014 Kyle McMartin - 3.0w-0.1 +- New upstream version 3.0w +- Add pjones' build fixes patch from that other distro. +- Enable AArch64 + +* Fri Dec 27 2013 Daniel Mach - 3.0u-2 +- Mass rebuild 2013-12-27 + +* Fri Oct 25 2013 Peter Jones - 3.0u-1 +- Reflect that we're not supporting this on anything but x86_64. + Related: rhbz#1017861 + +* Tue Sep 24 2013 Peter Jones - 3.0u-0.1 +- Update to 3.0u + Related: rhbz#996863 +- Split out subpackages so -devel can be multilib +- Fix path in apps subpackage to vary by distro. + +* Thu Jul 25 2013 Peter Jones - 3.0q-3 +- Revert to 3.0q + Related: rhbz#978766 + +* Fri Jun 07 2013 Peter Jones - 3.0t-0.1 +- Update to 3.0t +- Don't allow use of mmx or sse registers. + +* Thu May 16 2013 Peter Jones - 3.0s-2 +- Update to 3.0s + Related: rhbz#963359 + +* Thu Feb 14 2013 Fedora Release Engineering - 3.0q-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_19_Mass_Rebuild + +* Fri Jul 27 2012 Matthew Garrett - 3.0q-1 +- Update to current upstream +- License change - GPLv2+ to BSD + +* Thu Jul 19 2012 Fedora Release Engineering - 3.0e-18 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_18_Mass_Rebuild + +* Wed Apr 25 2012 Peter Jones - 3.0e-17 +- Align .reloc section as well to make secureboot work (mfleming) + +* Fri Jan 13 2012 Fedora Release Engineering - 3.0e-16 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_17_Mass_Rebuild + +* Thu Aug 11 2011 Peter Jones - 3.0e-15 +- Correctly pad the stack when doing uefi calls + Related: rhbz#677468 +- Add ability to write UEFI callbacks and drivers +- Add test harness for ABI Calling Conventions + +* Thu Jun 16 2011 Peter Jones - 3.0e-14 +- Handle uninitialized GOP driver gracefully. + +* Wed Feb 09 2011 Fedora Release Engineering - 3.0e-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + +* Fri Sep 10 2010 Peter Jones - 3.0e-12 +- Add "modelist.efi" test utility in apps/ + +* Mon Jul 26 2010 Peter Jones - 3.0e-11 +- Add PciIo headers. + +* Fri Jul 23 2010 Peter Jones - 3.0e-10 +- Add UEFI 2.x boot services. + +* Tue Aug 11 2009 Peter Jones - 3.0e-9 +- Change ExclusiveArch to reflect arch changes in repos. + +* Fri Jul 24 2009 Fedora Release Engineering - 3.0e-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_12_Mass_Rebuild + +* Fri Apr 03 2009 Peter Jones - 3.0e-7 +- Use nickc's workaround for #492183 + +* Tue Mar 31 2009 Peter Jones - 3.0e-6.1 +- Make a test package for nickc. + +* Thu Mar 12 2009 Chris Lumens 3.0e-6 +- Add IA64 back into the list of build arches (#489544). + +* Mon Mar 02 2009 Peter Jones - 3.0e-5 +- Switch to i586 from i386. + +* Tue Feb 24 2009 Fedora Release Engineering - 3.0e-4 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild + +* Fri Feb 13 2009 Peter Jones - 3.0e-3 +- Pad sections out in the provided linker scripts to make sure they all of + some content. + +* Fri Oct 03 2008 Peter Jones - 3.0e-2 +- Fix install paths on x86_64. + +* Thu Oct 02 2008 Peter Jones - 3.0e-1 +- Update to 3.0e +- Fix relocation bug in 3.0e + +* Tue Jul 29 2008 Tom "spot" Callaway - 3.0d-6 +- fix license tag + +* Mon Jul 28 2008 Peter Jones - 3.0d-5 +- Remove ia64 palproc code since its license isn't usable. +- Remove ia64 from ExclusiveArch since it can't build... + +* Thu Mar 27 2008 Peter Jones - 3.0d-4 +- Fix uefi_call_wrapper(x, 10, ...) . +- Add efi_main wrappers and EFI_CALL() macro so drivers are possible. + +* Mon Feb 18 2008 Fedora Release Engineering - 3.0d-3 +- Autorebuild for GCC 4.3 + +* Fri Jan 11 2008 Peter Jones - 3.0d-2 +- Get rid of a bogus #ifdef . + +* Wed Dec 19 2007 Peter Jones - 3.0d-1 +- Update to 3.0d + +* Tue Jun 12 2007 Chris Lumens - 3.0c-2 +- Fixes for package review (#225846). + +* Wed Jul 12 2006 Jesse Keating - 3.0c-1.1 +- rebuild + +* Thu Apr 27 2006 Chris Lumens 3.0c-1 +- Upgrade to gnu-efi-3.0c. +- Enable build on i386. + +* Tue Feb 07 2006 Jesse Keating - 3.0a-7.2 +- rebuilt for new gcc4.1 snapshot and glibc changes + +* Fri Dec 09 2005 Jesse Keating +- rebuilt + +* Thu Mar 3 2005 Jeremy Katz - 3.0a-7 +- rebuild with gcc 4 + +* Tue Sep 21 2004 Jeremy Katz - 3.0a-6 +- add fix from Jesse Barnes for newer binutils (#129197) + +* Tue Jun 15 2004 Elliot Lee +- rebuilt + +* Wed Apr 21 2004 Jeremy Katz - 3.0a-4 +- actually add the patch + +* Tue Apr 20 2004 Bill Nottingham 3.0a-3 +- add patch to coalesce some relocations (#120080, ) + +* Fri Feb 13 2004 Elliot Lee +- rebuilt + +* Fri Oct 4 2002 Jeremy Katz +- rebuild in new environment + +* Sun Jul 8 2001 Bill Nottingham +- update to 3.0 + +* Tue Jun 5 2001 Bill Nottingham +- add fix for invocations from the boot manager menu (#42222) + +* Tue May 22 2001 Bill Nottingham +- add bugfix for efibootmgr () + +* Mon May 21 2001 Bill Nottingham +- update to 2.5 +- add in efibootmgr from Dell () + +* Thu May 3 2001 Bill Nottingham +- fix booting of kernels with extra arguments (#37711) + +* Wed Apr 25 2001 Bill Nottingham +- take out Stephane's initrd patch + +* Fri Apr 20 2001 Bill Nottingham +- fix the verbosity patch to not break passing arguments to images + +* Wed Apr 18 2001 Bill Nottingham +- update to 2.0, build elilo, obsolete eli + +* Tue Dec 5 2000 Bill Nottingham +- update to 1.1 + +* Thu Oct 26 2000 Bill Nottingham +- add patch for new toolchain, update to 1.0 + +* Thu Aug 17 2000 Bill Nottingham +- update to 0.9