summaryrefslogtreecommitdiffstats
path: root/sys/boot
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2015-04-09 19:36:06 +0000
committerjhb <jhb@FreeBSD.org>2015-04-09 19:36:06 +0000
commit107a51b87f516e0a578d0a40ce21399c4d612e9d (patch)
tree8c06a1ac00f83852efeab556cd073920fd1a6687 /sys/boot
parentde91cfb1641ad37c56d8cc6360dd818198dd58e6 (diff)
downloadFreeBSD-src-107a51b87f516e0a578d0a40ce21399c4d612e9d.zip
FreeBSD-src-107a51b87f516e0a578d0a40ce21399c4d612e9d.tar.gz
MFC 279949:
The System V ABI for amd64 allows functions to use space in a 128 byte redzone below the stack pointer for scratch space and requires interrupt and signal frames to avoid overwriting it. However, EFI uses the Windows ABI which does not support this. As a result, interrupt handlers in EFI push their interrupt frames directly on top of the stack pointer. If the compiler used the red zone in a function in the EFI loader, then a device interrupt that occurred while that function was running could trash its local variables. In practice this happens fairly reliable when using gzipfs as an interrupt during decompression can trash the local variables in the inflate_table() function resulting in corrupted output or hangs. Fix this by disabling the redzone for amd64 EFI binaries. This requires building not only the loader but any libraries used by the loader without redzone support. Thanks to Jilles for pointing me at the redzone once I found the stack corruption.
Diffstat (limited to 'sys/boot')
-rw-r--r--sys/boot/amd64/Makefile.inc2
-rw-r--r--sys/boot/efi/libefi/Makefile2
-rw-r--r--sys/boot/ficl/Makefile3
3 files changed, 5 insertions, 2 deletions
diff --git a/sys/boot/amd64/Makefile.inc b/sys/boot/amd64/Makefile.inc
index ee96a42..7b10385 100644
--- a/sys/boot/amd64/Makefile.inc
+++ b/sys/boot/amd64/Makefile.inc
@@ -5,7 +5,7 @@
BINDIR?= /boot
# See conf/kern.mk for the correct set of these
-CFLAGS+= -ffreestanding
+CFLAGS+= -ffreestanding -mno-red-zone
CFLAGS+= -mno-mmx -mno-sse -mno-aes -mno-avx -msoft-float
LDFLAGS+= -nostdlib
diff --git a/sys/boot/efi/libefi/Makefile b/sys/boot/efi/libefi/Makefile
index 3edeb22..bd753cf 100644
--- a/sys/boot/efi/libefi/Makefile
+++ b/sys/boot/efi/libefi/Makefile
@@ -9,7 +9,7 @@ SRCS= delay.c efi_console.c efinet.c efipart.c errno.c handles.c \
SRCS+= nullconsole.c comconsole.c
.if ${MACHINE_ARCH} == "amd64"
-CFLAGS+= -fPIC
+CFLAGS+= -fPIC -mno-red-zone
.endif
CFLAGS+= -I${.CURDIR}/../include
CFLAGS+= -I${.CURDIR}/../include/${MACHINE_CPUARCH}
diff --git a/sys/boot/ficl/Makefile b/sys/boot/ficl/Makefile
index 6fad54f..dffdab0 100644
--- a/sys/boot/ficl/Makefile
+++ b/sys/boot/ficl/Makefile
@@ -19,6 +19,9 @@ CFLAGS+= -ffreestanding
CFLAGS+= -march=i386
CFLAGS.gcc+= -mpreferred-stack-boundary=2
.endif
+.if ${MACHINE_CPUARCH} == "amd64"
+CFLAGS+= -mno-red-zone
+.endif
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
CFLAGS+= -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float
.endif
OpenPOWER on IntegriCloud