svn commit: r279949 - in head: lib/libstand sys/boot/amd64 sys/boot/efi/libefi sys/boot/ficl
John Baldwin
jhb at FreeBSD.org
Fri Mar 13 09:38:18 UTC 2015
Author: jhb
Date: Fri Mar 13 09:38:16 2015
New Revision: 279949
URL: https://svnweb.freebsd.org/changeset/base/279949
Log:
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.
Differential Revision: https://reviews.freebsd.org/D2054
Reviewed by: imp
MFC after: 2 weeks
Sponsored by: Cisco Systems, Inc.
Modified:
head/lib/libstand/Makefile
head/sys/boot/amd64/Makefile.inc
head/sys/boot/efi/libefi/Makefile
head/sys/boot/ficl/Makefile
Modified: head/lib/libstand/Makefile
==============================================================================
--- head/lib/libstand/Makefile Fri Mar 13 09:03:25 2015 (r279948)
+++ head/lib/libstand/Makefile Fri Mar 13 09:38:16 2015 (r279949)
@@ -28,7 +28,7 @@ CFLAGS+= -mno-mmx -mno-3dnow -mno-sse -m
CFLAGS.gcc+= -mpreferred-stack-boundary=2
.endif
.if ${MACHINE_CPUARCH} == "amd64"
-CFLAGS+= -fPIC
+CFLAGS+= -fPIC -mno-red-zone
.endif
.if ${MACHINE} == "pc98"
CFLAGS+= -Os
Modified: head/sys/boot/amd64/Makefile.inc
==============================================================================
--- head/sys/boot/amd64/Makefile.inc Fri Mar 13 09:03:25 2015 (r279948)
+++ head/sys/boot/amd64/Makefile.inc Fri Mar 13 09:38:16 2015 (r279949)
@@ -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
Modified: head/sys/boot/efi/libefi/Makefile
==============================================================================
--- head/sys/boot/efi/libefi/Makefile Fri Mar 13 09:03:25 2015 (r279948)
+++ head/sys/boot/efi/libefi/Makefile Fri Mar 13 09:38:16 2015 (r279949)
@@ -9,7 +9,7 @@ SRCS= delay.c efi_console.c efinet.c efi
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}
Modified: head/sys/boot/ficl/Makefile
==============================================================================
--- head/sys/boot/ficl/Makefile Fri Mar 13 09:03:25 2015 (r279948)
+++ head/sys/boot/ficl/Makefile Fri Mar 13 09:38:16 2015 (r279949)
@@ -21,6 +21,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
More information about the svn-src-all
mailing list