From f458757d86f9bddd5797a5dfed5edf778b0479b2 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Tue, 13 Mar 2018 12:01:52 -0400 Subject: [PATCH] Update to 3.0.7 (from git) and add some pending patches we need. Signed-off-by: Peter Jones --- ...t-fall-through-so-Wextra-will-work-i.patch | 33 -- ...X-instruction-set-on-IA32-and-x86_64.patch | 44 ++ ...emove-pointless-dummy-.reloc-section.patch | 76 --- 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 + ...0008-Fix-some-types-gcc-doesn-t-like.patch | 16 +- ...-Fix-arm-build-paths-in-the-makefile.patch | 8 +- 0009-route80h-remove-some-dead-code.patch | 33 -- ...omplain-about-the-debughook-s-optimi.patch | 57 --- ...or-maybe-uninitialized-not-being-ver.patch | 10 +- ...n-error-in-the-debughook-example-app.patch | 12 +- ...012-Fix-typedef-of-EFI_PXE_BASE_CODE.patch | 10 +- ...omplain-about-fno-merge-all-constant.patch | 16 +- ...-another-place-clang-complains-about.patch | 10 +- ...dd-some-more-common-string-functions.patch | 344 ++++++++++++++ 0016-Add-D-to-print-device-paths.patch | 44 ++ ...RCH-overrideable-on-the-command-line.patch | 28 ++ ...-and-lfbgrid-and-add-error-checks-to.patch | 446 ++++++++++++++++++ ...atch => 0019-Nerf-Werror-pragma-away.patch | 8 +- ...use-our-own-div-asm-on-gnu-C-as-well.patch | 8 +- ...> 0021-Call-ar-in-deterministic-mode.patch | 14 +- 0022-Add-debug-helper-applications.patch | 115 +++++ gnu-efi.spec | 53 ++- sources | 2 +- 28 files changed, 1552 insertions(+), 275 deletions(-) delete mode 100644 0001-Mark-our-explicit-fall-through-so-Wextra-will-work-i.patch create mode 100644 0001-PATCH-Disable-AVX-instruction-set-on-IA32-and-x86_64.patch delete mode 100644 0001-arm64-efi-remove-pointless-dummy-.reloc-section.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 rename 0002-Fix-some-types-gcc-doesn-t-like.patch => 0008-Fix-some-types-gcc-doesn-t-like.patch (84%) rename 0003-Fix-arm-build-paths-in-the-makefile.patch => 0009-Fix-arm-build-paths-in-the-makefile.patch (88%) delete mode 100644 0009-route80h-remove-some-dead-code.patch delete mode 100644 0010-Make-clang-not-complain-about-the-debughook-s-optimi.patch rename 0004-Work-around-Werror-maybe-uninitialized-not-being-ver.patch => 0010-Work-around-Werror-maybe-uninitialized-not-being-ver.patch (73%) rename 0005-Fix-a-sign-error-in-the-debughook-example-app.patch => 0011-Fix-a-sign-error-in-the-debughook-example-app.patch (79%) rename 0006-Fix-typedef-of-EFI_PXE_BASE_CODE.patch => 0012-Fix-typedef-of-EFI_PXE_BASE_CODE.patch (87%) rename 0007-make-clang-not-complain-about-fno-merge-constants.patch => 0013-make-clang-not-complain-about-fno-merge-all-constant.patch (50%) rename 0008-Fix-another-place-clang-complains-about.patch => 0014-Fix-another-place-clang-complains-about.patch (71%) create mode 100644 0015-gnu-efi-add-some-more-common-string-functions.patch create mode 100644 0016-Add-D-to-print-device-paths.patch create mode 100644 0017-Make-ARCH-overrideable-on-the-command-line.patch create mode 100644 0018-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch rename 0011-Nerf-Werror-pragma-away.patch => 0019-Nerf-Werror-pragma-away.patch (73%) rename 0012-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch => 0020-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch (81%) rename 0013-Call-ar-in-deterministic-mode.patch => 0021-Call-ar-in-deterministic-mode.patch (87%) create mode 100644 0022-Add-debug-helper-applications.patch diff --git a/0001-Mark-our-explicit-fall-through-so-Wextra-will-work-i.patch b/0001-Mark-our-explicit-fall-through-so-Wextra-will-work-i.patch deleted file mode 100644 index 7e18ea7..0000000 --- a/0001-Mark-our-explicit-fall-through-so-Wextra-will-work-i.patch +++ /dev/null @@ -1,33 +0,0 @@ -From f3d3ef07eb69072b8bd2b0c5d4e6243ea38ecec9 Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Thu, 2 Feb 2017 13:51:27 -0500 -Subject: [PATCH 01/10] Mark our explicit fall through so -Wextra will work in - gcc 7 - -gcc 7 introduces detection of fall-through behavior in switch/case -statements, and will warn if -Wimplicit-fallthrough is present and there -is no comment stating that the fall-through is intentional. This is -also triggered by -Wextra, as it enables -Wimplicit-fallthrough=1. - -This patch adds the comment in the one place we use fall-through. - -Signed-off-by: Peter Jones ---- - lib/print.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/lib/print.c b/lib/print.c -index b8a9d38..cb732f0 100644 ---- a/lib/print.c -+++ b/lib/print.c -@@ -1131,6 +1131,7 @@ Returns: - case 'X': - Item.Width = Item.Long ? 16 : 8; - Item.Pad = '0'; -+ /* falls through */ - case 'x': - ValueToHex ( - Item.Scratch, --- -2.9.3 - 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..6aaef6a --- /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/22] [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.14.3 + diff --git a/0001-arm64-efi-remove-pointless-dummy-.reloc-section.patch b/0001-arm64-efi-remove-pointless-dummy-.reloc-section.patch deleted file mode 100644 index 204497f..0000000 --- a/0001-arm64-efi-remove-pointless-dummy-.reloc-section.patch +++ /dev/null @@ -1,76 +0,0 @@ -From 6e32a714438f3938e1fb64cb380e7fa8b0c8789a Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Thu, 24 Aug 2017 16:54:18 -0400 -Subject: [PATCH] arm64: efi: remove pointless dummy .reloc section - -The kernel's EFI PE/COFF header contains a dummy .reloc section, and -an explanatory comment that claims that this is required for the EFI -application loader to accept the Image as a relocatable image (i.e., -one that can be loaded at any offset and fixed up in place) - -This was inherited from the x86 implementation, which has elaborate host -tooling to mangle the PE/COFF header post-link time, and which populates -the .reloc section with a single dummy base relocation. On ARM, no such -tooling exists, and the .reloc section remains empty, and is never even -exposed via the BaseRelocationTable directory entry, which is where the -PE/COFF loader looks for it. - -The PE/COFF spec is unclear about relocatable images that do not require -any fixups, but the EDK2 implementation, which is the de facto reference -for PE/COFF in the UEFI space, clearly does not care, and explicitly -mentions (in a comment) that relocatable images with no base relocations -are perfectly fine, as long as they don't have the RELOCS_STRIPPED -attribute set (which is not the case for our PE/COFF image) - -So simply remove the .reloc section altogether. - -Signed-off-by: Ard Biesheuvel -Acked-by: Mark Rutland -Acked-by: Peter Jones ---- - gnuefi/crt0-efi-aarch64.S | 22 +--------------------- - 1 file changed, 1 insertion(+), 21 deletions(-) - -diff --git a/gnuefi/crt0-efi-aarch64.S b/gnuefi/crt0-efi-aarch64.S -index 7a9e5c2..fef997b 100644 ---- a/gnuefi/crt0-efi-aarch64.S -+++ b/gnuefi/crt0-efi-aarch64.S -@@ -31,7 +31,7 @@ pe_header: - .short 0 - coff_header: - .short 0xaa64 // AArch64 -- .short 2 // nr_sections -+ .short 1 // nr_sections - .long 0 // TimeDateStamp - .long 0 // PointerToSymbolTable - .long 1 // NumberOfSymbols -@@ -85,26 +85,6 @@ extra_header_fields: - - // Section table - section_table: -- -- /* -- * The EFI application loader requires a relocation section -- * because EFI applications must be relocatable. This is a -- * dummy section as far as we are concerned. -- */ -- .ascii ".reloc" -- .byte 0 -- .byte 0 // end of 0 padding of section name -- .long 0 -- .long 0 -- .long 0 // SizeOfRawData -- .long 0 // PointerToRawData -- .long 0 // PointerToRelocations -- .long 0 // PointerToLineNumbers -- .short 0 // NumberOfRelocations -- .short 0 // NumberOfLineNumbers -- .long 0x42100040 // Characteristics (section flags) -- -- - .ascii ".text" - .byte 0 - .byte 0 --- -2.13.5 - diff --git a/0002-Use-ARFLAGS-when-invoking-ar.patch b/0002-Use-ARFLAGS-when-invoking-ar.patch new file mode 100644 index 0000000..b8c6dd3 --- /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/22] 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.14.3 + diff --git a/0003-Stripped-diff-for-makefile.patch b/0003-Stripped-diff-for-makefile.patch new file mode 100644 index 0000000..f1056c7 --- /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/22] 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.14.3 + 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..acdc758 --- /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/22] 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.14.3 + 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..b509afb --- /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/22] 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.14.3 + 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..8ec7a2d --- /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/22] 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.14.3 + 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..84ee032 --- /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/22] 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.14.3 + diff --git a/0002-Fix-some-types-gcc-doesn-t-like.patch b/0008-Fix-some-types-gcc-doesn-t-like.patch similarity index 84% rename from 0002-Fix-some-types-gcc-doesn-t-like.patch rename to 0008-Fix-some-types-gcc-doesn-t-like.patch index 060eb50..7471d8d 100644 --- a/0002-Fix-some-types-gcc-doesn-t-like.patch +++ b/0008-Fix-some-types-gcc-doesn-t-like.patch @@ -1,7 +1,7 @@ -From bbd65152010e04275825736f203a4bf929927a7f Mon Sep 17 00:00:00 2001 +From 3fa80d0d7b103975b765fa936c24d05544985805 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Thu, 2 Feb 2017 14:00:59 -0500 -Subject: [PATCH 02/10] Fix some types gcc doesn't like +Subject: [PATCH 08/22] 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 @@ -16,7 +16,7 @@ Signed-off-by: Peter Jones 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/AllocPages.c b/apps/AllocPages.c -index 77a082e..bb81849 100644 +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) @@ -29,7 +29,7 @@ index 77a082e..bb81849 100644 InitializeLib(image, systab); diff --git a/apps/FreePages.c b/apps/FreePages.c -index bbf2f52..247c75d 100644 +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) @@ -42,10 +42,10 @@ index bbf2f52..247c75d 100644 InitializeLib(image, systab); diff --git a/apps/route80h.c b/apps/route80h.c -index b0b142f..723dd85 100644 +index 8df860c1232..e1f62f06824 100644 --- a/apps/route80h.c +++ b/apps/route80h.c -@@ -138,7 +138,7 @@ efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) +@@ -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); @@ -55,7 +55,7 @@ index b0b142f..723dd85 100644 return EFI_SUCCESS; diff --git a/inc/efilink.h b/inc/efilink.h -index b2ff4fa..cc5aa2d 100644 +index b2ff4fa2f87..cc5aa2dc57b 100644 --- a/inc/efilink.h +++ b/inc/efilink.h @@ -142,7 +142,7 @@ typedef struct _LIST_ENTRY { @@ -68,5 +68,5 @@ index b2ff4fa..cc5aa2d 100644 // // CONTAINING_RECORD - returns a pointer to the structure -- -2.9.3 +2.14.3 diff --git a/0003-Fix-arm-build-paths-in-the-makefile.patch b/0009-Fix-arm-build-paths-in-the-makefile.patch similarity index 88% rename from 0003-Fix-arm-build-paths-in-the-makefile.patch rename to 0009-Fix-arm-build-paths-in-the-makefile.patch index fd147a6..e7ed590 100644 --- a/0003-Fix-arm-build-paths-in-the-makefile.patch +++ b/0009-Fix-arm-build-paths-in-the-makefile.patch @@ -1,7 +1,7 @@ -From fa85eb1b6ac4ceff1672c7152b6f842c2f2ff728 Mon Sep 17 00:00:00 2001 +From 6082de48568bb85b4878fe7934ede76821114d34 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Thu, 2 Feb 2017 14:31:25 -0500 -Subject: [PATCH 03/10] Fix arm build paths in the makefile +Subject: [PATCH 09/22] 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 @@ -14,7 +14,7 @@ Signed-off-by: Peter Jones 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Make.defaults b/Make.defaults -index 51bd7d8..e4d2ac1 100755 +index 446e676dc14..6d300fb0f24 100755 --- a/Make.defaults +++ b/Make.defaults @@ -62,12 +62,12 @@ OBJCOPY := $(prefix)$(CROSS_COMPILE)objcopy @@ -33,5 +33,5 @@ index 51bd7d8..e4d2ac1 100755 # FreeBSD (and possibly others) reports amd64 instead of x86_64 -- -2.9.3 +2.14.3 diff --git a/0009-route80h-remove-some-dead-code.patch b/0009-route80h-remove-some-dead-code.patch deleted file mode 100644 index f5c723e..0000000 --- a/0009-route80h-remove-some-dead-code.patch +++ /dev/null @@ -1,33 +0,0 @@ -From ba05cb606c6c3a4ec9f60c588abef52e355e5c1a Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Fri, 10 Feb 2017 16:14:55 -0500 -Subject: [PATCH 09/10] route80h: remove some dead code - -Signed-off-by: Peter Jones ---- - apps/route80h.c | 9 --------- - 1 file changed, 9 deletions(-) - -diff --git a/apps/route80h.c b/apps/route80h.c -index bf550a1..5272dd3 100644 ---- a/apps/route80h.c -+++ b/apps/route80h.c -@@ -40,15 +40,6 @@ static inline void set_bit(volatile uint32_t *flag, int bit, int value) - Print(L"new value is 0x%2x\n", val); - } - --static inline int configspace_matches_ids(void *config, uint32_t vendor_id, -- uint32_t device_id) --{ -- uint32_t *cfg = config; -- if (cfg[0] == vendor_id && cfg[1] == device_id) -- return 1; -- return 0; --} -- - static int is_device(EFI_PCI_IO *pciio, uint16_t vendor_id, uint16_t device_id) - { - lpcif_t lpcif; --- -2.9.3 - diff --git a/0010-Make-clang-not-complain-about-the-debughook-s-optimi.patch b/0010-Make-clang-not-complain-about-the-debughook-s-optimi.patch deleted file mode 100644 index 312443f..0000000 --- a/0010-Make-clang-not-complain-about-the-debughook-s-optimi.patch +++ /dev/null @@ -1,57 +0,0 @@ -From a94906bd487c1a2e6d7827f31d7eb46bc09f3b43 Mon Sep 17 00:00:00 2001 -From: Peter Jones -Date: Fri, 10 Feb 2017 16:18:14 -0500 -Subject: [PATCH 10/10] Make clang not complain about the debughook's - optimization settings - -... still won't work, of course, because nobody at clang takes compiler -compatibility seriously while they keep implying that you can pretend -it's gcc. - -Signed-off-by: Peter Jones ---- - Make.defaults | 3 ++- - apps/debughook.c | 5 +++-- - 2 files changed, 5 insertions(+), 3 deletions(-) - -diff --git a/Make.defaults b/Make.defaults -index cc52195..a7778a7 100755 ---- a/Make.defaults -+++ b/Make.defaults -@@ -161,7 +161,8 @@ CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \ - -fshort-wchar -fno-strict-aliasing \ - -ffreestanding -fno-stack-protector \ - -fno-stack-check \ -- $(if $(findstring gcc,$(CC)),-fno-merge-constants,) -+ $(if $(findstring gcc,$(CC)),-fno-merge-constants,) \ -+ $(if $(findstring clang,$(CC)),-Wno-unknown-pragmas,) - endif - - ARFLAGS += -U -diff --git a/apps/debughook.c b/apps/debughook.c -index e1d1c50..fa36f62 100644 ---- a/apps/debughook.c -+++ b/apps/debughook.c -@@ -37,8 +37,9 @@ GetVariable(CHAR16 *var, UINT8 **data, UINTN *len, EFI_GUID owner) - EFI_GUID DUMMY_GUID = - {0x55aad538, 0x8f82, 0x4e2a, {0xa4,0xf0,0xbe, 0x59, 0x13, 0xb6, 0x5f, 0x1e}}; - -+#pragma GCC push_options -+#pragma GCC optimize ("0") - static void --__attribute__((__optimize__("0"))) - DebugHook(void) - { - EFI_GUID guid = DUMMY_GUID; -@@ -81,7 +82,7 @@ DebugHook(void) - } - x = 1; - } -- -+#pragma GCC pop_options - - EFI_STATUS - efi_main (EFI_HANDLE image, EFI_SYSTEM_TABLE *systab) --- -2.9.3 - diff --git a/0004-Work-around-Werror-maybe-uninitialized-not-being-ver.patch b/0010-Work-around-Werror-maybe-uninitialized-not-being-ver.patch similarity index 73% rename from 0004-Work-around-Werror-maybe-uninitialized-not-being-ver.patch rename to 0010-Work-around-Werror-maybe-uninitialized-not-being-ver.patch index a8c8b5f..c4bd4a2 100644 --- a/0004-Work-around-Werror-maybe-uninitialized-not-being-ver.patch +++ b/0010-Work-around-Werror-maybe-uninitialized-not-being-ver.patch @@ -1,7 +1,7 @@ -From 6f5781e191cca6c20a75b82cc467c2256cbb5901 Mon Sep 17 00:00:00 2001 +From d7e380f0ebf2292ddcd534c407483450b74a9f12 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Thu, 2 Feb 2017 15:23:55 -0500 -Subject: [PATCH 04/10] Work around -Werror=maybe-uninitialized not being very +Subject: [PATCH 10/22] Work around -Werror=maybe-uninitialized not being very bright. The compiler doesn't believe the loop always executes at least once, @@ -14,10 +14,10 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/route80h.c b/apps/route80h.c -index 723dd85..bf550a1 100644 +index e1f62f06824..5272dd3cd44 100644 --- a/apps/route80h.c +++ b/apps/route80h.c -@@ -102,7 +102,7 @@ efi_main (EFI_HANDLE image_handle, EFI_SYSTEM_TABLE *systab) +@@ -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; @@ -27,5 +27,5 @@ index 723dd85..bf550a1 100644 uint16_t vendor; uint16_t device; -- -2.9.3 +2.14.3 diff --git a/0005-Fix-a-sign-error-in-the-debughook-example-app.patch b/0011-Fix-a-sign-error-in-the-debughook-example-app.patch similarity index 79% rename from 0005-Fix-a-sign-error-in-the-debughook-example-app.patch rename to 0011-Fix-a-sign-error-in-the-debughook-example-app.patch index 63dfabb..3d4e846 100644 --- a/0005-Fix-a-sign-error-in-the-debughook-example-app.patch +++ b/0011-Fix-a-sign-error-in-the-debughook-example-app.patch @@ -1,7 +1,7 @@ -From 397b06ff74f7fd8fc71f5991bdfbfa6ef6da98fd Mon Sep 17 00:00:00 2001 +From 2e07ce1876051106659a5a0d742ee26437806da9 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Thu, 2 Feb 2017 15:25:48 -0500 -Subject: [PATCH 05/10] Fix a sign error in the debughook example app +Subject: [PATCH 11/22] 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 @@ -13,10 +13,10 @@ Signed-off-by: Peter Jones 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/debughook.c b/apps/debughook.c -index fb6cdad..e1d1c50 100644 +index 93cd0cf7eb0..78e4a767b1d 100644 --- a/apps/debughook.c +++ b/apps/debughook.c -@@ -45,7 +45,7 @@ DebugHook(void) +@@ -50,7 +50,7 @@ DebugHook(void) UINT8 *data = NULL; UINTN dataSize = 0; EFI_STATUS efi_status; @@ -25,7 +25,7 @@ index fb6cdad..e1d1c50 100644 extern char _text, _data; if (x) -@@ -66,7 +66,7 @@ DebugHook(void) +@@ -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__) @@ -35,5 +35,5 @@ index fb6cdad..e1d1c50 100644 __asm__ __volatile__("pause"); #elif defined(__aarch64__) -- -2.9.3 +2.14.3 diff --git a/0006-Fix-typedef-of-EFI_PXE_BASE_CODE.patch b/0012-Fix-typedef-of-EFI_PXE_BASE_CODE.patch similarity index 87% rename from 0006-Fix-typedef-of-EFI_PXE_BASE_CODE.patch rename to 0012-Fix-typedef-of-EFI_PXE_BASE_CODE.patch index 0c40957..884f172 100644 --- a/0006-Fix-typedef-of-EFI_PXE_BASE_CODE.patch +++ b/0012-Fix-typedef-of-EFI_PXE_BASE_CODE.patch @@ -1,7 +1,7 @@ -From e4ca94374c7ece8ec0100075710af8638e42c203 Mon Sep 17 00:00:00 2001 +From 44c9ce3c94d26ab4b8f778827bcaded30dc1fa22 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Wed, 8 Feb 2017 15:28:18 -0500 -Subject: [PATCH 06/10] Fix typedef of EFI_PXE_BASE_CODE +Subject: [PATCH 12/22] 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 @@ -32,18 +32,18 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/inc/efipxebc.h b/inc/efipxebc.h -index 580a6ef..3760c7c 100644 +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 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.9.3 +2.14.3 diff --git a/0007-make-clang-not-complain-about-fno-merge-constants.patch b/0013-make-clang-not-complain-about-fno-merge-all-constant.patch similarity index 50% rename from 0007-make-clang-not-complain-about-fno-merge-constants.patch rename to 0013-make-clang-not-complain-about-fno-merge-all-constant.patch index 311fe7b..e951608 100644 --- a/0007-make-clang-not-complain-about-fno-merge-constants.patch +++ b/0013-make-clang-not-complain-about-fno-merge-all-constant.patch @@ -1,28 +1,28 @@ -From a01463c5035d2bacefc1ef7673b6ba2cc9815920 Mon Sep 17 00:00:00 2001 +From 34365c8c021a32150935d0af3087195e3e99eef9 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Fri, 10 Feb 2017 15:16:42 -0500 -Subject: [PATCH 07/10] make clang not complain about -fno-merge-constants +Subject: [PATCH 13/22] make clang not complain about -fno-merge-all-constants --- Make.defaults | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Make.defaults b/Make.defaults -index e4d2ac1..cc52195 100755 +index 6d300fb0f24..a457190aa3a 100755 --- a/Make.defaults +++ b/Make.defaults -@@ -159,8 +159,9 @@ CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \ +@@ -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-constants -ffreestanding -fno-stack-protector \ +- -fno-merge-all-constants -ffreestanding -fno-stack-protector \ - -fno-stack-check -+ -ffreestanding -fno-stack-protector \ ++ -ffreestanding -fno-stack-protector -fno-stack-check \ + -fno-stack-check \ -+ $(if $(findstring gcc,$(CC)),-fno-merge-constants,) ++ $(if $(findstring gcc,$(CC)),-fno-merge-all-constants,) endif ARFLAGS += -U -- -2.9.3 +2.14.3 diff --git a/0008-Fix-another-place-clang-complains-about.patch b/0014-Fix-another-place-clang-complains-about.patch similarity index 71% rename from 0008-Fix-another-place-clang-complains-about.patch rename to 0014-Fix-another-place-clang-complains-about.patch index c1d85a4..8d5819e 100644 --- a/0008-Fix-another-place-clang-complains-about.patch +++ b/0014-Fix-another-place-clang-complains-about.patch @@ -1,7 +1,7 @@ -From 0281df3c77fc4d8c67c0d23c656b4debed862989 Mon Sep 17 00:00:00 2001 +From cc5794a36021be063f069529d99f63ecd8e66a18 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Fri, 10 Feb 2017 16:14:12 -0500 -Subject: [PATCH 08/10] Fix another place clang complains about +Subject: [PATCH 14/22] Fix another place clang complains about Signed-off-by: Peter Jones --- @@ -9,18 +9,18 @@ Signed-off-by: Peter Jones 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/guid.c b/lib/guid.c -index bd1f1a5..6498e90 100644 +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 } + { NULL, L"" } }; // -- -2.9.3 +2.14.3 diff --git a/0015-gnu-efi-add-some-more-common-string-functions.patch b/0015-gnu-efi-add-some-more-common-string-functions.patch new file mode 100644 index 0000000..2ab825f --- /dev/null +++ b/0015-gnu-efi-add-some-more-common-string-functions.patch @@ -0,0 +1,344 @@ +From 4e69cb7426ae7bd9e8e27e4195d41e64b722da95 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 31 Jul 2017 15:01:02 -0400 +Subject: [PATCH 15/22] 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 +--- + 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.14.3 + diff --git a/0016-Add-D-to-print-device-paths.patch b/0016-Add-D-to-print-device-paths.patch new file mode 100644 index 0000000..f501f08 --- /dev/null +++ b/0016-Add-D-to-print-device-paths.patch @@ -0,0 +1,44 @@ +From ea1bc0d8cdb3005cdf1718083eb49075b60c8b97 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 31 Jul 2017 15:03:26 -0400 +Subject: [PATCH 16/22] Add %D to print device paths + +Signed-off-by: Peter Jones +--- + 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.14.3 + diff --git a/0017-Make-ARCH-overrideable-on-the-command-line.patch b/0017-Make-ARCH-overrideable-on-the-command-line.patch new file mode 100644 index 0000000..5772166 --- /dev/null +++ b/0017-Make-ARCH-overrideable-on-the-command-line.patch @@ -0,0 +1,28 @@ +From 290e12e22869d3041816f8938b97a4fa849cdc3c Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 22 Sep 2017 12:57:23 -0400 +Subject: [PATCH 17/22] Make ARCH overrideable on the command line + +Signed-off-by: Peter Jones +--- + 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.14.3 + diff --git a/0018-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch b/0018-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch new file mode 100644 index 0000000..d3f7970 --- /dev/null +++ b/0018-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch @@ -0,0 +1,446 @@ +From f0a9b5d76db9842206faaf7e3d19b13c7e969f6c Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Fri, 22 Sep 2017 15:26:05 -0400 +Subject: [PATCH 18/22] 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 +--- + 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.14.3 + diff --git a/0011-Nerf-Werror-pragma-away.patch b/0019-Nerf-Werror-pragma-away.patch similarity index 73% rename from 0011-Nerf-Werror-pragma-away.patch rename to 0019-Nerf-Werror-pragma-away.patch index e976b57..47eacea 100644 --- a/0011-Nerf-Werror-pragma-away.patch +++ b/0019-Nerf-Werror-pragma-away.patch @@ -1,14 +1,14 @@ -From 6671a712db5c4dfecd4e7026057a99d9b1c4fe5e Mon Sep 17 00:00:00 2001 +From caef829abc431a694d6e231705eb013366658865 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Tue, 7 Mar 2017 10:11:19 -0500 -Subject: [PATCH] Nerf -Werror=pragma away +Subject: [PATCH 19/22] Nerf -Werror=pragma away --- Make.defaults | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Make.defaults b/Make.defaults -index a7778a7..8882701 100755 +index 4aa57ac5f7c..ed4b60c2423 100755 --- a/Make.defaults +++ b/Make.defaults @@ -87,6 +87,8 @@ OBJDIR := $(TOPDIR)/$(ARCH) @@ -21,5 +21,5 @@ index a7778a7..8882701 100755 CFLAGS += -mfixed-range=f32-f127 endif -- -2.9.3 +2.14.3 diff --git a/0012-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch b/0020-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch similarity index 81% rename from 0012-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch rename to 0020-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch index beac84c..6a8e513 100644 --- a/0012-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch +++ b/0020-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch @@ -1,14 +1,14 @@ -From bbd1ee0379327a58e042d288e371f314b7df2d55 Mon Sep 17 00:00:00 2001 +From 31fc2f9972aca147948a32ed6beba0d20e1e76e8 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Wed, 15 Mar 2017 17:33:39 -0400 -Subject: [PATCH] Make ia32 use our own div asm on gnu C as well. +Subject: [PATCH 20/22] Make ia32 use our own div asm on gnu C as well. --- 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 81f51bf..fce7a8d 100644 +index 81f51bf45e4..fce7a8d4875 100644 --- a/lib/ia32/math.c +++ b/lib/ia32/math.c @@ -140,7 +140,7 @@ DivU64x32 ( @@ -30,5 +30,5 @@ index 81f51bf..fce7a8d 100644 "shll $1, %0\n\t" "rcll $1, 4%0\n\t" -- -2.12.0 +2.14.3 diff --git a/0013-Call-ar-in-deterministic-mode.patch b/0021-Call-ar-in-deterministic-mode.patch similarity index 87% rename from 0013-Call-ar-in-deterministic-mode.patch rename to 0021-Call-ar-in-deterministic-mode.patch index 5aadbd4..45e6116 100644 --- a/0013-Call-ar-in-deterministic-mode.patch +++ b/0021-Call-ar-in-deterministic-mode.patch @@ -1,7 +1,7 @@ -From 0e95c51225b01f0ca79dafd607ae6a3e404db6be Mon Sep 17 00:00:00 2001 +From 5cbaa179424c239263cf460db1cd5e19db856df2 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Tue, 28 Mar 2017 17:59:55 -0400 -Subject: [PATCH 13/13] Call ar in deterministic mode. +Subject: [PATCH 21/22] 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 @@ -51,14 +51,14 @@ Related: rhbz#1310782 Signed-off-by: Peter Jones --- Make.defaults | 2 +- - 1 files changed, 1 insertions(+), 1 deletion(-) + 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Make.defaults b/Make.defaults -index aa15c73..8f36365 100755 +index ed4b60c2423..ba743f17893 100755 --- a/Make.defaults +++ b/Make.defaults -@@ -167,7 +167,7 @@ CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \ - $(if $(findstring clang,$(CC)),-Wno-unknown-pragmas,) +@@ -177,7 +177,7 @@ CFLAGS += $(ARCH3264) -g -O2 -Wall -Wextra -Werror \ + $(if $(findstring gcc,$(CC)),-fno-merge-all-constants,) endif -ARFLAGS += -U @@ -67,5 +67,5 @@ index aa15c73..8f36365 100755 LDFLAGS += -nostdlib --warn-common --no-undefined --fatal-warnings \ --build-id=sha1 -- -2.9.3 +2.14.3 diff --git a/0022-Add-debug-helper-applications.patch b/0022-Add-debug-helper-applications.patch new file mode 100644 index 0000000..8d25bea --- /dev/null +++ b/0022-Add-debug-helper-applications.patch @@ -0,0 +1,115 @@ +From 1d249b810b22c601c4b9e3a684443be841cd1b56 Mon Sep 17 00:00:00 2001 +From: Peter Jones +Date: Mon, 8 Jan 2018 16:50:34 -0500 +Subject: [PATCH 22/22] Add debug helper applications + +--- + 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.14.3 + diff --git a/gnu-efi.spec b/gnu-efi.spec index ebf3eb2..37114e0 100644 --- a/gnu-efi.spec +++ b/gnu-efi.spec @@ -1,7 +1,8 @@ Summary: Development Libraries and headers for EFI Name: gnu-efi -Version: 3.0.5 -Release: 12%{?dist}%{?buildid} +Version: 3.0.7 +%global tarball_version 3.0.6 +Release: 1%{?dist}%{?buildid} Epoch: 1 Group: Development/System License: BSD @@ -9,28 +10,39 @@ URL: ftp://ftp.hpl.hp.com/pub/linux-ia64 ExclusiveArch: x86_64 aarch64 %{arm} %{ix86} BuildRequires: git %ifarch x86_64 -BuildRequires: glibc32 +# So... in some build environments, glibc32 provides some headers. In +# others, glibc-devel.i686 does. They have no non-file provides in common. +#BuildRequires: glibc32 #BuildRequires: glibc-devel(x86-32) +BuildRequires: /usr/include/gnu/stubs-32.h %endif -Source: http://superb-dca2.dl.sourceforge.net/project/gnu-efi/gnu-efi-%{version}.tar.bz2 +Source: http://superb-dca2.dl.sourceforge.net/project/gnu-efi/gnu-efi-%{tarball_version}.tar.bz2 # dammit, rpmlint, shut up. %define lib %{nil}lib%{nil} -Patch0001: 0001-Mark-our-explicit-fall-through-so-Wextra-will-work-i.patch -Patch0002: 0002-Fix-some-types-gcc-doesn-t-like.patch -Patch0003: 0003-Fix-arm-build-paths-in-the-makefile.patch -Patch0004: 0004-Work-around-Werror-maybe-uninitialized-not-being-ver.patch -Patch0005: 0005-Fix-a-sign-error-in-the-debughook-example-app.patch -Patch0006: 0006-Fix-typedef-of-EFI_PXE_BASE_CODE.patch -Patch0007: 0007-make-clang-not-complain-about-fno-merge-constants.patch -Patch0008: 0008-Fix-another-place-clang-complains-about.patch -Patch0009: 0009-route80h-remove-some-dead-code.patch -Patch0010: 0010-Make-clang-not-complain-about-the-debughook-s-optimi.patch -Patch0011: 0011-Nerf-Werror-pragma-away.patch -Patch0012: 0012-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch -Patch0013: 0013-Call-ar-in-deterministic-mode.patch -Patch0014: 0001-arm64-efi-remove-pointless-dummy-.reloc-section.patch +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-Fix-some-types-gcc-doesn-t-like.patch +Patch0009: 0009-Fix-arm-build-paths-in-the-makefile.patch +Patch0010: 0010-Work-around-Werror-maybe-uninitialized-not-being-ver.patch +Patch0011: 0011-Fix-a-sign-error-in-the-debughook-example-app.patch +Patch0012: 0012-Fix-typedef-of-EFI_PXE_BASE_CODE.patch +Patch0013: 0013-make-clang-not-complain-about-fno-merge-all-constant.patch +Patch0014: 0014-Fix-another-place-clang-complains-about.patch +Patch0015: 0015-gnu-efi-add-some-more-common-string-functions.patch +Patch0016: 0016-Add-D-to-print-device-paths.patch +Patch0017: 0017-Make-ARCH-overrideable-on-the-command-line.patch +Patch0018: 0018-apps-Add-bltgrid-and-lfbgrid-and-add-error-checks-to.patch +Patch0019: 0019-Nerf-Werror-pragma-away.patch +Patch0020: 0020-Make-ia32-use-our-own-div-asm-on-gnu-C-as-well.patch +Patch0021: 0021-Call-ar-in-deterministic-mode.patch +Patch0022: 0022-Add-debug-helper-applications.patch %define debug_package %{nil} @@ -86,7 +98,7 @@ Group: Applications/System This package contains utilties for debugging and developing EFI systems. %prep -%setup -q -n gnu-efi-%{version} +%setup -q -n gnu-efi-%{tarball_version} git init git config user.email "gnu-efi-owner@fedoraproject.org" git config user.name "Fedora Ninjas" @@ -137,6 +149,9 @@ mv ia32/apps/{route80h.efi,modelist.efi} %{buildroot}/boot/efi/EFI/%{efidir}/ia3 %attr(0644,root,root) /boot/efi/EFI/%{efidir}/*/*.efi %changelog +* Tue Mar 13 2018 Peter Jones - 3.0.7-1 +- Update to 3.0.7 (from git) and add some pending patches we need. + * Wed Feb 07 2018 Fedora Release Engineering - 1:3.0.5-12 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild diff --git a/sources b/sources index 9b5b3b8..dd84958 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (gnu-efi-3.0.5.tar.bz2) = 848ea9b0a9b900a237d04c2fe95fbaaa08d786c8abe4cbfdca9b666a5cd955ad1097668561aa90899b654a606ff822509fb23b6aeafce69bc4407e5b4547fdcf +SHA512 (gnu-efi-3.0.6.tar.bz2) = f1b17766d8ae000c0177ea2126d87883f254ab01ac020e4bfaa9ad2d3d60a66d07b6237d9842e5989c4da3fd23152b5c592ef863fdc9806901f43c43582a2258