From 59b0c05accb386b6bd018e5a730beb22cdc4bc63 Mon Sep 17 00:00:00 2001 From: fun_yang Date: Wed, 27 Nov 2019 16:31:37 +0800 Subject: [PATCH] package init --- ...X-instruction-set-on-IA32-and-x86_64.patch | 44 ++ 0002-Use-ARFLAGS-when-invoking-ar.patch | 30 ++ 0003-Stripped-diff-for-makefile.patch | 31 ++ ....h-is-always-used-with-MSVC-on-ARM-A.patch | 94 ++++ ...R_ENTRY_POINT-support-for-MSVC-ARM64.patch | 44 ++ ...y-memset-definition-to-global-init.c.patch | 215 ++++++++ ...-from-VERSION-3.0.6-to-VERSION-3.0.7.patch | 26 + ...e-DivU64x32-on-ia32-but-it-tries-to-.patch | 38 ++ ....gnu.hash-sections-unbreaks-elilo-on.patch | 148 ++++++ ...ib-ia64-setjmp.S-IA-64-build-failure.patch | 161 ++++++ 0011-Fix-some-types-gcc-doesn-t-like.patch | 73 +++ ...-Fix-arm-build-paths-in-the-makefile.patch | 38 ++ ...or-maybe-uninitialized-not-being-ver.patch | 32 ++ ...n-error-in-the-debughook-example-app.patch | 40 ++ 0015-Fix-typedef-of-EFI_PXE_BASE_CODE.patch | 50 ++ ...omplain-about-fno-merge-all-constant.patch | 32 ++ ...-another-place-clang-complains-about.patch | 29 ++ ...dd-some-more-common-string-functions.patch | 345 +++++++++++++ 0019-Add-D-to-print-device-paths.patch | 47 ++ ...RCH-overrideable-on-the-command-line.patch | 31 ++ ...-and-lfbgrid-and-add-error-checks-to.patch | 447 ++++++++++++++++ 0022-Nerf-Werror-pragma-away.patch | 29 ++ 0023-Call-ar-in-deterministic-mode.patch | 72 +++ 0024-Add-debug-helper-applications.patch | 119 +++++ ...-from-VERSION-3.0.7-to-VERSION-3.0.8.patch | 26 + ...l-names-everywhere-the-compiler-does.patch | 481 ++++++++++++++++++ gnu-efi-3.0.6.tar.bz2 | Bin 0 -> 152088 bytes gnu-efi.spec | 107 ++++ 28 files changed, 2829 insertions(+) create mode 100644 0001-PATCH-Disable-AVX-instruction-set-on-IA32-and-x86_64.patch create mode 100644 0002-Use-ARFLAGS-when-invoking-ar.patch create mode 100644 0003-Stripped-diff-for-makefile.patch create mode 100644 0004-Make-sure-stdint.h-is-always-used-with-MSVC-on-ARM-A.patch create mode 100644 0005-Add-EFI_DRIVER_ENTRY_POINT-support-for-MSVC-ARM64.patch create mode 100644 0006-Move-memcpy-memset-definition-to-global-init.c.patch create mode 100644 0007-Bump-revision-from-VERSION-3.0.6-to-VERSION-3.0.7.patch create mode 100644 0008-Currently-we-have-DivU64x32-on-ia32-but-it-tries-to-.patch create mode 100644 0009-gnuefi-preserve-.gnu.hash-sections-unbreaks-elilo-on.patch create mode 100644 0010-gnu-efi-fix-lib-ia64-setjmp.S-IA-64-build-failure.patch create mode 100644 0011-Fix-some-types-gcc-doesn-t-like.patch create mode 100644 0012-Fix-arm-build-paths-in-the-makefile.patch create mode 100644 0013-Work-around-Werror-maybe-uninitialized-not-being-ver.patch create mode 100644 0014-Fix-a-sign-error-in-the-debughook-example-app.patch create mode 100644 0015-Fix-typedef-of-EFI_PXE_BASE_CODE.patch create mode 100644 0016-make-clang-not-complain-about-fno-merge-all-constant.patch create mode 100644 0017-Fix-another-place-clang-complains-about.patch create mode 100644 0018-gnu-efi-add-some-more-common-string-functions.patch create mode 100644 0019-Add-D-to-print-device-paths.patch create mode 100644 0020-Make-ARCH-overrideable-on-the-command-line.patch create mode 100644 0021-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch create mode 100644 0022-Nerf-Werror-pragma-away.patch create mode 100644 0023-Call-ar-in-deterministic-mode.patch create mode 100644 0024-Add-debug-helper-applications.patch create mode 100644 0025-Bump-revision-from-VERSION-3.0.7-to-VERSION-3.0.8.patch create mode 100644 0026-Use-EFI-canonical-names-everywhere-the-compiler-does.patch create mode 100644 gnu-efi-3.0.6.tar.bz2 create mode 100644 gnu-efi.spec diff --git a/0001-PATCH-Disable-AVX-instruction-set-on-IA32-and-x86_64.patch b/0001-PATCH-Disable-AVX-instruction-set-on-IA32-and-x86_64.patch new file mode 100644 index 0000000..6511d83 --- /dev/null +++ b/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/0002-Use-ARFLAGS-when-invoking-ar.patch b/0002-Use-ARFLAGS-when-invoking-ar.patch new file mode 100644 index 0000000..86f565f --- /dev/null +++ b/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/0003-Stripped-diff-for-makefile.patch b/0003-Stripped-diff-for-makefile.patch new file mode 100644 index 0000000..9b53f68 --- /dev/null +++ b/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/0004-Make-sure-stdint.h-is-always-used-with-MSVC-on-ARM-A.patch b/0004-Make-sure-stdint.h-is-always-used-with-MSVC-on-ARM-A.patch new file mode 100644 index 0000000..d9c242d --- /dev/null +++ b/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/0005-Add-EFI_DRIVER_ENTRY_POINT-support-for-MSVC-ARM64.patch b/0005-Add-EFI_DRIVER_ENTRY_POINT-support-for-MSVC-ARM64.patch new file mode 100644 index 0000000..ba6608e --- /dev/null +++ b/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/0006-Move-memcpy-memset-definition-to-global-init.c.patch b/0006-Move-memcpy-memset-definition-to-global-init.c.patch new file mode 100644 index 0000000..107ddc5 --- /dev/null +++ b/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/0007-Bump-revision-from-VERSION-3.0.6-to-VERSION-3.0.7.patch b/0007-Bump-revision-from-VERSION-3.0.6-to-VERSION-3.0.7.patch new file mode 100644 index 0000000..485dc13 --- /dev/null +++ b/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/0008-Currently-we-have-DivU64x32-on-ia32-but-it-tries-to-.patch b/0008-Currently-we-have-DivU64x32-on-ia32-but-it-tries-to-.patch new file mode 100644 index 0000000..0b7d2ef --- /dev/null +++ b/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/0009-gnuefi-preserve-.gnu.hash-sections-unbreaks-elilo-on.patch b/0009-gnuefi-preserve-.gnu.hash-sections-unbreaks-elilo-on.patch new file mode 100644 index 0000000..2b0ad6e --- /dev/null +++ b/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/0010-gnu-efi-fix-lib-ia64-setjmp.S-IA-64-build-failure.patch b/0010-gnu-efi-fix-lib-ia64-setjmp.S-IA-64-build-failure.patch new file mode 100644 index 0000000..16286a4 --- /dev/null +++ b/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/0011-Fix-some-types-gcc-doesn-t-like.patch b/0011-Fix-some-types-gcc-doesn-t-like.patch new file mode 100644 index 0000000..aa66e4e --- /dev/null +++ b/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/0012-Fix-arm-build-paths-in-the-makefile.patch b/0012-Fix-arm-build-paths-in-the-makefile.patch new file mode 100644 index 0000000..746989a --- /dev/null +++ b/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/0013-Work-around-Werror-maybe-uninitialized-not-being-ver.patch b/0013-Work-around-Werror-maybe-uninitialized-not-being-ver.patch new file mode 100644 index 0000000..fb6057f --- /dev/null +++ b/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/0014-Fix-a-sign-error-in-the-debughook-example-app.patch b/0014-Fix-a-sign-error-in-the-debughook-example-app.patch new file mode 100644 index 0000000..d78fad8 --- /dev/null +++ b/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/0015-Fix-typedef-of-EFI_PXE_BASE_CODE.patch b/0015-Fix-typedef-of-EFI_PXE_BASE_CODE.patch new file mode 100644 index 0000000..3f42514 --- /dev/null +++ b/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/0016-make-clang-not-complain-about-fno-merge-all-constant.patch b/0016-make-clang-not-complain-about-fno-merge-all-constant.patch new file mode 100644 index 0000000..30f8611 --- /dev/null +++ b/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/0017-Fix-another-place-clang-complains-about.patch b/0017-Fix-another-place-clang-complains-about.patch new file mode 100644 index 0000000..d66cb83 --- /dev/null +++ b/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/0018-gnu-efi-add-some-more-common-string-functions.patch b/0018-gnu-efi-add-some-more-common-string-functions.patch new file mode 100644 index 0000000..778e06d --- /dev/null +++ b/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/0019-Add-D-to-print-device-paths.patch b/0019-Add-D-to-print-device-paths.patch new file mode 100644 index 0000000..53bf24b --- /dev/null +++ b/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/0020-Make-ARCH-overrideable-on-the-command-line.patch b/0020-Make-ARCH-overrideable-on-the-command-line.patch new file mode 100644 index 0000000..ce84e13 --- /dev/null +++ b/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/0021-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch b/0021-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch new file mode 100644 index 0000000..880fae6 --- /dev/null +++ b/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/0022-Nerf-Werror-pragma-away.patch b/0022-Nerf-Werror-pragma-away.patch new file mode 100644 index 0000000..305cb2f --- /dev/null +++ b/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/0023-Call-ar-in-deterministic-mode.patch b/0023-Call-ar-in-deterministic-mode.patch new file mode 100644 index 0000000..1af9e80 --- /dev/null +++ b/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/0024-Add-debug-helper-applications.patch b/0024-Add-debug-helper-applications.patch new file mode 100644 index 0000000..c2b4aec --- /dev/null +++ b/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/0025-Bump-revision-from-VERSION-3.0.7-to-VERSION-3.0.8.patch b/0025-Bump-revision-from-VERSION-3.0.7-to-VERSION-3.0.8.patch new file mode 100644 index 0000000..06023e6 --- /dev/null +++ b/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/0026-Use-EFI-canonical-names-everywhere-the-compiler-does.patch b/0026-Use-EFI-canonical-names-everywhere-the-compiler-does.patch new file mode 100644 index 0000000..b1a8732 --- /dev/null +++ b/0026-Use-EFI-canonical-names-everywhere-the-compiler-does.patch @@ -0,0 +1,481 @@ +From a92a9ed2db67c415c7bad5a9b041aca4efc33cf2 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Tue, 1 May 2018 14:12:01 -0400 +Subject: [PATCH] Use EFI canonical names everywhere the compiler doesn't care. + +Always use x64/X64 and aa64/AA64 unless the toolchain cares about +"x86_64" or whatnot. + +Signed-off-by: Peter Jones +--- + gnuefi/{reloc_aarch64.c => reloc_aa64.c} | 2 +- + gnuefi/{reloc_x86_64.c => reloc_x64.c} | 2 +- + lib/{aarch64 => aa64}/initplat.c | 0 + lib/{aarch64 => aa64}/math.c | 0 + lib/{x86_64 => x64}/callwrap.c | 0 + lib/{x86_64 => x64}/initplat.c | 0 + lib/{x86_64 => x64}/math.c | 0 + inc/{aarch64 => aa64}/efibind.h | 4 ++- + inc/{aarch64 => aa64}/efilibplat.h | 0 + inc/{aarch64 => aa64}/efisetjmp_arch.h | 6 ++-- + inc/efiapi.h | 5 ++- + inc/efidebug.h | 2 +- + inc/{x86_64 => x64}/efibind.h | 4 +-- + inc/{x86_64 => x64}/efilibplat.h | 0 + inc/{x86_64 => x64}/efisetjmp_arch.h | 6 ++-- + inc/{x86_64 => x64}/pe.h | 0 + gnuefi/{crt0-efi-aarch64.S => crt0-efi-aa64.S} | 2 +- + gnuefi/{crt0-efi-x86_64.S => crt0-efi-x64.S} | 2 +- + lib/{aarch64 => aa64}/efi_stub.S | 0 + lib/{aarch64 => aa64}/setjmp.S | 0 + lib/{x86_64 => x64}/efi_stub.S | 0 + lib/{x86_64 => x64}/setjmp.S | 0 + Make.defaults | 39 +++++++++++++++------- + README.gnuefi | 6 ++-- + apps/Makefile | 2 +- + gnuefi/Makefile | 6 ++-- + gnuefi/{elf_aarch64_efi.lds => elf_aa64_efi.lds} | 0 + gnuefi/{elf_x86_64_efi.lds => elf_x64_efi.lds} | 2 +- + ...lf_x86_64_fbsd_efi.lds => elf_x64_fbsd_efi.lds} | 2 +- + lib/Makefile | 4 +-- + 30 files changed, 58 insertions(+), 38 deletions(-) + rename gnuefi/{reloc_aarch64.c => reloc_aa64.c} (97%) + rename gnuefi/{reloc_x86_64.c => reloc_x64.c} (97%) + rename lib/{aarch64 => aa64}/initplat.c (100%) + rename lib/{aarch64 => aa64}/math.c (100%) + rename lib/{x86_64 => x64}/callwrap.c (100%) + rename lib/{x86_64 => x64}/initplat.c (100%) + rename lib/{x86_64 => x64}/math.c (100%) + rename inc/{aarch64 => aa64}/efibind.h (98%) + rename inc/{aarch64 => aa64}/efilibplat.h (100%) + rename inc/{aarch64 => aa64}/efisetjmp_arch.h (78%) + rename inc/{x86_64 => x64}/efibind.h (99%) + rename inc/{x86_64 => x64}/efilibplat.h (100%) + rename inc/{x86_64 => x64}/efisetjmp_arch.h (71%) + rename inc/{x86_64 => x64}/pe.h (100%) + rename gnuefi/{crt0-efi-aarch64.S => crt0-efi-aa64.S} (98%) + rename gnuefi/{crt0-efi-x86_64.S => crt0-efi-x64.S} (97%) + rename lib/{aarch64 => aa64}/efi_stub.S (100%) + rename lib/{aarch64 => aa64}/setjmp.S (100%) + rename lib/{x86_64 => x64}/efi_stub.S (100%) + rename lib/{x86_64 => x64}/setjmp.S (100%) + rename gnuefi/{elf_aarch64_efi.lds => elf_aa64_efi.lds} (100%) + rename gnuefi/{elf_x86_64_efi.lds => elf_x64_efi.lds} (93%) + rename gnuefi/{elf_x86_64_fbsd_efi.lds => elf_x64_fbsd_efi.lds} (93%) + +diff --git a/gnuefi/reloc_aarch64.c b/gnuefi/reloc_aa64.c +similarity index 97% +rename from gnuefi/reloc_aarch64.c +rename to gnuefi/reloc_aa64.c +index 086727961c2..f2ac52b1269 100644 +--- a/gnuefi/reloc_aarch64.c ++++ b/gnuefi/reloc_aa64.c +@@ -1,4 +1,4 @@ +-/* reloc_aarch64.c - position independent x86 ELF shared object relocator ++/* reloc_aa64.c - position independent ARM Aarch64 ELF shared object relocator + Copyright (C) 2014 Linaro Ltd. + Copyright (C) 1999 Hewlett-Packard Co. + Contributed by David Mosberger . +diff --git a/gnuefi/reloc_x86_64.c b/gnuefi/reloc_x64.c +similarity index 97% +rename from gnuefi/reloc_x86_64.c +rename to gnuefi/reloc_x64.c +index 04b75b29fda..09493227a7b 100644 +--- a/gnuefi/reloc_x86_64.c ++++ b/gnuefi/reloc_x64.c +@@ -1,4 +1,4 @@ +-/* reloc_x86_64.c - position independent x86_64 ELF shared object relocator ++/* reloc_x64.c - position independent x86_64 ELF shared object relocator + Copyright (C) 1999 Hewlett-Packard Co. + Contributed by David Mosberger . + Copyright (C) 2005 Intel Co. +diff --git a/lib/aarch64/initplat.c b/lib/aa64/initplat.c +similarity index 100% +rename from lib/aarch64/initplat.c +rename to lib/aa64/initplat.c +diff --git a/lib/aarch64/math.c b/lib/aa64/math.c +similarity index 100% +rename from lib/aarch64/math.c +rename to lib/aa64/math.c +diff --git a/lib/x86_64/callwrap.c b/lib/x64/callwrap.c +similarity index 100% +rename from lib/x86_64/callwrap.c +rename to lib/x64/callwrap.c +diff --git a/lib/x86_64/initplat.c b/lib/x64/initplat.c +similarity index 100% +rename from lib/x86_64/initplat.c +rename to lib/x64/initplat.c +diff --git a/lib/x86_64/math.c b/lib/x64/math.c +similarity index 100% +rename from lib/x86_64/math.c +rename to lib/x64/math.c +diff --git a/inc/aarch64/efibind.h b/inc/aa64/efibind.h +similarity index 98% +rename from inc/aarch64/efibind.h +rename to inc/aa64/efibind.h +index bdaa5238e84..8a35a25e3a7 100644 +--- a/inc/aarch64/efibind.h ++++ b/inc/aa64/efibind.h +@@ -14,7 +14,8 @@ + * GNU General Public License as published by the Free Software Foundation; + * either version 2 of the License, or (at your option) any later version. + */ +- ++#ifndef GNU_EFI_AA64_EFI_BIND_H ++#define GNU_EFI_AA64_EFI_BIND_H + #if !defined(_MSC_VER) && (!defined(__STDC_VERSION__) || (__STDC_VERSION__ < 199901L )) + + // ANSI C 1999/2000 stdint.h integer width declarations +@@ -154,3 +155,4 @@ typedef uint64_t UINTN; + + #define uefi_call_wrapper(func, va_num, ...) func(__VA_ARGS__) + #define EFI_FUNCTION ++#endif /* GNU_EFI_AA64_EFI_BIND_H */ +diff --git a/inc/aarch64/efilibplat.h b/inc/aa64/efilibplat.h +similarity index 100% +rename from inc/aarch64/efilibplat.h +rename to inc/aa64/efilibplat.h +diff --git a/inc/aarch64/efisetjmp_arch.h b/inc/aa64/efisetjmp_arch.h +similarity index 78% +rename from inc/aarch64/efisetjmp_arch.h +rename to inc/aa64/efisetjmp_arch.h +index abd7a0e9ad9..d4c17578dd2 100644 +--- a/inc/aarch64/efisetjmp_arch.h ++++ b/inc/aa64/efisetjmp_arch.h +@@ -1,5 +1,5 @@ +-#ifndef GNU_EFI_AARCH64_SETJMP_H +-#define GNU_EFI_AARCH64_SETJMP_H ++#ifndef GNU_EFI_AA64_SETJMP_H ++#define GNU_EFI_AA64_SETJMP_H + + #define JMPBUF_ALIGN 8 + +@@ -30,4 +30,4 @@ typedef struct { + UINT64 D15; + } ALIGN(JMPBUF_ALIGN) jmp_buf; + +-#endif /* GNU_EFI_AARCH64_SETJMP_H */ ++#endif /* GNU_EFI_AA64_SETJMP_H */ +diff --git a/inc/efiapi.h b/inc/efiapi.h +index e7d2abd79de..6355a2ff899 100644 +--- a/inc/efiapi.h ++++ b/inc/efiapi.h +@@ -338,8 +338,11 @@ EFI_STATUS + #define EFI_IMAGE_MACHINE_ARMTHUMB_MIXED 0x01C2 + #endif + ++#if !defined(EFI_IMAGE_MACHINE_AA64) ++#define EFI_IMAGE_MACHINE_AA64 0xAA64 ++#endif + #if !defined(EFI_IMAGE_MACHINE_AARCH64) +-#define EFI_IMAGE_MACHINE_AARCH64 0xAA64 ++#define EFI_IMAGE_MACHINE_AARCH64 EFI_IMAGE_MACHINE_AA64 + #endif + + // Image Entry prototype +diff --git a/inc/efidebug.h b/inc/efidebug.h +index 8e54dcda842..3649edf26d1 100644 +--- a/inc/efidebug.h ++++ b/inc/efidebug.h +@@ -533,7 +533,7 @@ typedef enum { + IsaIpf = EFI_IMAGE_MACHINE_IA64, + IsaEbc = EFI_IMAGE_MACHINE_EBC, + IsaArm = EFI_IMAGE_MACHINE_ARMTHUMB_MIXED, +-// IsaArm64 = EFI_IMAGE_MACHINE_AARCH64 ++// IsaArm64 = EFI_IMAGE_MACHINE_AA64 + } EFI_INSTRUCTION_SET_ARCHITECTURE; + + // +diff --git a/inc/x86_64/efibind.h b/inc/x64/efibind.h +similarity index 99% +rename from inc/x86_64/efibind.h +rename to inc/x64/efibind.h +index 4309f9f0e17..75e0dde35b6 100644 +--- a/inc/x86_64/efibind.h ++++ b/inc/x64/efibind.h +@@ -16,8 +16,8 @@ Abstract: + Revision History + + --*/ +-#ifndef X86_64_EFI_BIND +-#define X86_64_EFI_BIND ++#ifndef X64_EFI_BIND ++#define X64_EFI_BIND + #ifndef __GNUC__ + #pragma pack() + #endif +diff --git a/inc/x86_64/efilibplat.h b/inc/x64/efilibplat.h +similarity index 100% +rename from inc/x86_64/efilibplat.h +rename to inc/x64/efilibplat.h +diff --git a/inc/x86_64/efisetjmp_arch.h b/inc/x64/efisetjmp_arch.h +similarity index 71% +rename from inc/x86_64/efisetjmp_arch.h +rename to inc/x64/efisetjmp_arch.h +index a489993c174..6f774f9cb33 100644 +--- a/inc/x86_64/efisetjmp_arch.h ++++ b/inc/x64/efisetjmp_arch.h +@@ -1,5 +1,5 @@ +-#ifndef GNU_EFI_X86_64_SETJMP_H +-#define GNU_EFI_X86_64_SETJMP_H ++#ifndef GNU_EFI_X64_SETJMP_H ++#define GNU_EFI_X64_SETJMP_H + + #define JMPBUF_ALIGN 8 + +@@ -19,4 +19,4 @@ typedef struct { + UINT8 XmmBuffer[160]; // XMM6 - XMM15 + } ALIGN(JMPBUF_ALIGN) jmp_buf; + +-#endif /* GNU_EFI_X86_64_SETJMP_H */ ++#endif /* GNU_EFI_X64_SETJMP_H */ +diff --git a/inc/x86_64/pe.h b/inc/x64/pe.h +similarity index 100% +rename from inc/x86_64/pe.h +rename to inc/x64/pe.h +diff --git a/gnuefi/crt0-efi-aarch64.S b/gnuefi/crt0-efi-aa64.S +similarity index 98% +rename from gnuefi/crt0-efi-aarch64.S +rename to gnuefi/crt0-efi-aa64.S +index c300d89bdfd..d6e610b8c79 100644 +--- a/gnuefi/crt0-efi-aarch64.S ++++ b/gnuefi/crt0-efi-aa64.S +@@ -1,5 +1,5 @@ + /* +- * crt0-efi-aarch64.S - PE/COFF header for AArch64 EFI applications ++ * crt0-efi-aa64.S - PE/COFF header for AArch64 EFI applications + * + * Copright (C) 2014 Linaro Ltd. + * +diff --git a/gnuefi/crt0-efi-x86_64.S b/gnuefi/crt0-efi-x64.S +similarity index 97% +rename from gnuefi/crt0-efi-x86_64.S +rename to gnuefi/crt0-efi-x64.S +index 6839150a72e..6533af7461f 100644 +--- a/gnuefi/crt0-efi-x86_64.S ++++ b/gnuefi/crt0-efi-x64.S +@@ -1,4 +1,4 @@ +-/* crt0-efi-x86_64.S - x86_64 EFI startup code. ++/* crt0-efi-x64.S - x86_64 EFI startup code. + Copyright (C) 1999 Hewlett-Packard Co. + Contributed by David Mosberger . + Copyright (C) 2005 Intel Co. +diff --git a/lib/aarch64/efi_stub.S b/lib/aa64/efi_stub.S +similarity index 100% +rename from lib/aarch64/efi_stub.S +rename to lib/aa64/efi_stub.S +diff --git a/lib/aarch64/setjmp.S b/lib/aa64/setjmp.S +similarity index 100% +rename from lib/aarch64/setjmp.S +rename to lib/aa64/setjmp.S +diff --git a/lib/x86_64/efi_stub.S b/lib/x64/efi_stub.S +similarity index 100% +rename from lib/x86_64/efi_stub.S +rename to lib/x64/efi_stub.S +diff --git a/lib/x86_64/setjmp.S b/lib/x64/setjmp.S +similarity index 100% +rename from lib/x86_64/setjmp.S +rename to lib/x64/setjmp.S +diff --git a/Make.defaults b/Make.defaults +index ba743f17893..7a8a95c5704 100755 +--- a/Make.defaults ++++ b/Make.defaults +@@ -62,17 +62,32 @@ 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 ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed -e s,i[3456789]86,ia32, -e 's,armv7.*,arm,' ) ++HOSTARCH ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed \ ++ -e s,i[3456789]86,ia32, \ ++ -e s,amd64,x64, -e s,x86_64,x64, \ ++ -e s,aarch64,aa64, \ ++ -e 's,armv7.*,arm,' \ ++ ) ++ARCH ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed \ ++ -e s,i[3456789]86,ia32, \ ++ -e s,amd64,x64, -e s,x86_64,x64, \ ++ -e s,aarch64,aa64, \ ++ -e 's,armv7.*,arm,' \ ++ ) ++BFD_ARCH ?= $(shell $(HOSTCC) -dumpmachine | cut -f1 -d- | sed \ ++ -e s,i[3456789]86,ia32, \ ++ -e s,amd64,x86_64, \ ++ -e 's,armv7.*,arm,' \ ++ ) + + # Get ARCH from the compiler if cross compiling + ifneq ($(CROSS_COMPILE),) +- 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 +-ifeq ($(ARCH),amd64) +- override ARCH := x86_64 ++ override ARCH := $(shell $(CC) -dumpmachine | cut -f1 -d- | sed \ ++ -e s,i[3456789]86,ia32, \ ++ -e s,amd64,x64, -e s,x86_64,x64, \ ++ -e s,aarch64,aa64, \ ++ -e 's,armv7.*,arm,' \ ++ ) + endif + + # +@@ -95,12 +110,12 @@ endif + + ifeq ($(ARCH),ia32) + CFLAGS += -mno-mmx -mno-sse +- ifeq ($(HOSTARCH),x86_64) ++ ifeq ($(HOSTARCH),x64) + ARCH3264 = -m32 + endif + endif + +-ifeq ($(ARCH),x86_64) ++ifeq ($(ARCH),x64) + GCCVERSION := $(shell $(CC) -dumpversion | cut -f1 -d.) + GCCMINOR := $(shell $(CC) -dumpversion | cut -f2 -d.) + USING_CLANG := $(shell $(CC) -v 2>&1 | grep -q 'clang version' && echo clang) +@@ -122,7 +137,7 @@ ifeq ($(ARCH),x86_64) + endif + endif + +-ifneq (,$(filter $(ARCH),ia32 x86_64)) ++ifneq (,$(filter $(ARCH),ia32 x64)) + # 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) +@@ -139,7 +154,7 @@ endif + # Set HAVE_EFI_OBJCOPY if objcopy understands --target efi-[app|bsdrv|rtdrv], + # otherwise we need to compose the PE/COFF header using the assembler + # +-ifneq ($(ARCH),aarch64) ++ifneq ($(ARCH),aa64) + ifneq ($(ARCH),arm) + ifneq ($(ARCH),mips64el) + export HAVE_EFI_OBJCOPY=y +diff --git a/README.gnuefi b/README.gnuefi +index 512698c28b4..ac3f0aa6b04 100644 +--- a/README.gnuefi ++++ b/README.gnuefi +@@ -100,7 +100,7 @@ the appropriate compiler, assembler, linker, ar, and ranlib binaries, + respectively. + + If you're working in a cross-development environment, be sure to set +-macro ARCH to the desired target architecture ("ia32" for x86, "x86_64" for ++macro ARCH to the desired target architecture ("ia32" for x86, "x64" for + x86_64 and "ia64" for IA-64). For convenience, this can also be done from + the make command line (e.g., "make ARCH=ia64"). + +@@ -225,7 +225,7 @@ environment addresses each of these issues. + In order to satisfy the COFF constraint of page-sized and page-aligned + sections, the GNU EFI build environment uses the special linker script + in gnuefi/elf_$(ARCH)_efi.lds where $(ARCH) is the target architecture +-("ia32" for x86, "x86_64" for x86_64 and "ia64" for IA-64). ++("ia32" for x86, "x64" for x86_64 and "ia64" for IA-64). + This script is set up to create only eight COFF section, each page aligned + 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. +@@ -319,7 +319,7 @@ environment is to: + + The self-relocator is of course architecture dependent. The x86 + version can be found in gnuefi/reloc_ia32.c, the x86_64 version +-can be found in gnuefi/reloc_x86_64.c and the IA-64 version can be ++can be found in gnuefi/reloc_x64.c and the IA-64 version can be + found in gnuefi/reloc_ia64.S. + + The self-relocator operates as follows: the startup code invokes it +diff --git a/apps/Makefile b/apps/Makefile +index 4e1b69a38c8..51b66a2a78f 100644 +--- a/apps/Makefile ++++ b/apps/Makefile +@@ -68,7 +68,7 @@ TARGET_RTDRIVERS = + + ifneq ($(HAVE_EFI_OBJCOPY),) + +-FORMAT := --target efi-app-$(ARCH) +-$(TARGET_BSDRIVERS): FORMAT=--target efi-bsdrv-$(ARCH) +-$(TARGET_RTDRIVERS): FORMAT=--target efi-rtdrv-$(ARCH) ++FORMAT := --target efi-app-$(BFD_ARCH) ++$(TARGET_BSDRIVERS): FORMAT=--target efi-bsdrv-$(BFD_ARCH) ++$(TARGET_RTDRIVERS): FORMAT=--target efi-rtdrv-$(BFD_ARCH) + +diff --git a/gnuefi/Makefile b/gnuefi/Makefile +index 2a61699ac25..2dc98d3ab3f 100644 +--- a/gnuefi/Makefile ++++ b/gnuefi/Makefile +@@ -47,8 +47,8 @@ FILES = reloc_$(ARCH) + + OBJS = $(FILES:%=%.o) + +-# on aarch64, avoid jump tables before all relocations have been processed +-reloc_aarch64.o: CFLAGS += -fno-jump-tables ++# on aa64, avoid jump tables before all relocations have been processed ++reloc_aa64.o: CFLAGS += -fno-jump-tables + + TARGETS = crt0-efi-$(ARCH).o libgnuefi.a + +@@ -63,7 +63,7 @@ install: + mkdir -p $(INSTALLROOT)$(LIBDIR) + $(INSTALL) -m 644 $(TARGETS) $(INSTALLROOT)$(LIBDIR) + ifneq (,$(findstring FreeBSD,$(OS))) +- ifeq ($(ARCH),x86_64) ++ ifeq ($(ARCH),x64) + $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_fbsd_efi.lds $(INSTALLROOT)$(LIBDIR) + else + $(INSTALL) -m 644 $(SRCDIR)/elf_$(ARCH)_efi.lds $(INSTALLROOT)$(LIBDIR) +diff --git a/gnuefi/elf_aarch64_efi.lds b/gnuefi/elf_aa64_efi.lds +similarity index 100% +rename from gnuefi/elf_aarch64_efi.lds +rename to gnuefi/elf_aa64_efi.lds +diff --git a/gnuefi/elf_x86_64_efi.lds b/gnuefi/elf_x64_efi.lds +similarity index 93% +rename from gnuefi/elf_x86_64_efi.lds +rename to gnuefi/elf_x64_efi.lds +index 7be59023510..c7a105898c8 100644 +--- a/gnuefi/elf_x86_64_efi.lds ++++ b/gnuefi/elf_x64_efi.lds +@@ -1,4 +1,4 @@ +-/* Same as elf_x86_64_fbsd_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */ ++/* Same as elf_x64_fbsd_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */ + OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") + OUTPUT_ARCH(i386:x86-64) + ENTRY(_start) +diff --git a/gnuefi/elf_x86_64_fbsd_efi.lds b/gnuefi/elf_x64_fbsd_efi.lds +similarity index 93% +rename from gnuefi/elf_x86_64_fbsd_efi.lds +rename to gnuefi/elf_x64_fbsd_efi.lds +index fe1f3342cae..705719bf68b 100644 +--- a/gnuefi/elf_x86_64_fbsd_efi.lds ++++ b/gnuefi/elf_x64_fbsd_efi.lds +@@ -1,4 +1,4 @@ +-/* Same as elf_x86_64_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */ ++/* Same as elf_x64_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */ + OUTPUT_FORMAT("elf64-x86-64-freebsd", "elf64-x86-64-freebsd", "elf64-x86-64-freebsd") + OUTPUT_ARCH(i386:x86-64) + ENTRY(_start) +diff --git a/lib/Makefile b/lib/Makefile +index 0e6410dac55..8bf94000e33 100644 +--- a/lib/Makefile ++++ b/lib/Makefile +@@ -53,7 +53,7 @@ ifeq ($(ARCH),ia64) + FILES += $(ARCH)/salpal $(ARCH)/palproc + endif + +-ifeq ($(ARCH),x86_64) ++ifeq ($(ARCH),x64) + FILES += $(ARCH)/callwrap $(ARCH)/efi_stub + endif + +@@ -64,7 +64,7 @@ endif + + OBJS = $(FILES:%=%.o) + +-SUBDIRS = ia32 x86_64 ia64 aarch64 arm mips64el runtime ++SUBDIRS = ia32 x64 ia64 aa64 arm mips64el runtime + + LIBDIRINSTALL = $(INSTALLROOT)$(LIBDIR) + +-- +2.14.3 + diff --git a/gnu-efi-3.0.6.tar.bz2 b/gnu-efi-3.0.6.tar.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..fdd2b42dcbfef473690fd24bee1631541d6923b4 GIT binary patch literal 152088 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

!&-AsO_dqabO;NZhJrXlAb?^k%!jss5|>gEm@ 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
(Pdj6EzDl{Ii~IR(3CG-b4JBn@%-jH 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 literal 0 HcmV?d00001 diff --git a/gnu-efi.spec b/gnu-efi.spec new file mode 100644 index 0000000..c286acb --- /dev/null +++ b/gnu-efi.spec @@ -0,0 +1,107 @@ +%define debug_package %{nil} +Name: gnu-efi +Version: 3.0.8 +Release: 3 +Summary: Development Libraries and headers for EFI +Epoch: 1 +License: BSD +URL: ftp://ftp.hpl.hp.com/pub/linux-ia64 +ExclusiveArch: x86_64 aarch64 +%ifarch x86_64 +BuildRequires: /usr/include/gnu/stubs-32.h +%endif +Source: http://superb-dca2.dl.sourceforge.net/project/gnu-efi/gnu-efi-3.0.6.tar.bz2 + + +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 + + +%global efidir %(eval echo $(grep ^ID= /etc/os-release | sed 's/^ID=//')) + +%ifarch x86_64 +%global efiarch x86_64 +%endif +%ifarch aarch64 +%global efiarch aarch64 +%endif + +Provides: %{name}-utils = %{epoch}:%{version}-%{release} +Obsoletes: %{name}-utils < %{epoch}:%{version}-%{release} + +%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 +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). + +%prep +%autosetup -n gnu-efi-3.0.6 -p1 + +%build +make +make apps +%ifarch x86_64 +setarch linux32 -B make ARCH=ia32 PREFIX=%{_prefix} LIBDIR=%{_prefix}/lib +setarch linux32 -B make ARCH=ia32 PREFIX=%{_prefix} LIBDIR=%{_prefix}/lib apps +%endif + +%install +install -d %{buildroot}/%{_libdir}/gnuefi +install -d %{buildroot}/boot/efi/EFI/%{efidir}/%{efiarch} +make PREFIX=%{_prefix} LIBDIR=%{_libdir} INSTALLROOT=%{buildroot} install +mv %{buildroot}/%{_libdir}/*.lds %{buildroot}/%{_libdir}/*.o %{buildroot}/%{_libdir}/gnuefi +mv %{efiarch}/apps/{route80h.efi,modelist.efi} %{buildroot}/boot/efi/EFI/%{efidir}/%{efiarch}/ + +%ifarch x86_64 +install -d %{buildroot}/%{_prefix}/lib/gnuefi +install -d %{buildroot}/boot/efi/EFI/%{efidir}/ia32 + +setarch linux32 -B make PREFIX=%{_prefix} LIBDIR=%{_prefix}/lib INSTALLROOT=%{buildroot} ARCH=ia32 install +mv %{buildroot}/%{_prefix}/lib/*.{lds,o} %{buildroot}/%{_prefix}/lib/gnuefi/ +mv ia32/apps/{route80h.efi,modelist.efi} %{buildroot}/boot/efi/EFI/%{efidir}/ia32/ +%endif + +%files +%{_prefix}/lib*/* +%dir %attr(0700,root,root) /boot/efi/EFI/%{efidir}/*/ +%attr(0700,root,root) /boot/efi/EFI/%{efidir}/*/*.efi + +%files devel +%defattr(-,root,root,-) +%doc README.* ChangeLog +%{_includedir}/efi + +%changelog +* Wed Nov 20 2019 yangjian - 3.0.8-3 +- Package init