mirror of
https://github.com/fail0verflow/switch-coreboot.git
synced 2025-05-04 01:39:18 -04:00
The offending part that made coreboot crash with some toolchains was that gcc emits SSE instructions but coreboot did not enable SSE at that point. Since the gain for coreboot using SSE instructions is not measurable, let's not use SSE instructions rather than enabling SSE early on. One rationale behind this is that other parts of coreboot, like the SMM handler would need fixing because the XMM registers are not saved on SMM entry. Thus keep it simple. Change-Id: I14f0942f300085767ece44cec570fb15c761e88d Signed-off-by: Stefan Reinauer <reinauer@google.com> Reviewed-on: http://review.coreboot.org/694 Reviewed-by: Ronald G. Minnich <rminnich@gmail.com> Tested-by: build bot (Jenkins) Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
120 lines
3.2 KiB
Bash
120 lines
3.2 KiB
Bash
#!/bin/sh
|
|
#
|
|
# This file is part of the coreboot project.
|
|
#
|
|
# Copyright (C) 2007-2010 coresystems GmbH
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; version 2 of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
#
|
|
|
|
testcc()
|
|
{
|
|
echo "_start(void) {}" > .$$$$.c
|
|
$1 -nostdlib -Werror $2 .$$$$.c -o .$$$$.tmp 2>/dev/null >/dev/null
|
|
ret=$?
|
|
rm -f .$$$$.c .$$$$.tmp
|
|
return $ret
|
|
}
|
|
|
|
for make in make gmake gnumake; do
|
|
if [ "`$make --version 2>/dev/null | grep -c GNU`" -gt 0 ]; then
|
|
MAKE=$make
|
|
break
|
|
fi
|
|
done
|
|
|
|
GCCPREFIX=invalid
|
|
XGCCPATH=${1:-"`pwd`/util/crossgcc/xgcc/bin/"}
|
|
echo '#XGCCPATH='${XGCCPATH}
|
|
TMPFILE=`mktemp /tmp/temp.XXXX 2>/dev/null || echo /tmp/temp.78gOIUGz`
|
|
touch $TMPFILE
|
|
|
|
# This should be a loop over all supported architectures
|
|
TARCH=i386
|
|
TWIDTH=32
|
|
for gccprefixes in ${XGCCPATH}${TARCH}-elf- ${TARCH}-elf- ""; do
|
|
if ! which ${gccprefixes}as 2>/dev/null >/dev/null; then
|
|
continue
|
|
fi
|
|
rm -f ${TMPFILE}.o
|
|
if ${gccprefixes}as -o ${TMPFILE}.o ${TMPFILE}; then
|
|
TYPE=`${gccprefixes}objdump -p ${TMPFILE}.o`
|
|
if [ ${TYPE##* } == "elf${TWIDTH}-${TARCH}" ]; then
|
|
GCCPREFIX=$gccprefixes
|
|
ASFLAGS=
|
|
CFLAGS=
|
|
LDFLAGS=
|
|
break
|
|
fi
|
|
fi
|
|
if ${gccprefixes}as --32 -o ${TMPFILE}.o ${TMPFILE}; then
|
|
TYPE=`${gccprefixes}objdump -p ${TMPFILE}.o`
|
|
if [ ${TYPE##* } == "elf${TWIDTH}-${TARCH}" ]; then
|
|
GCCPREFIX=$gccprefixes
|
|
ASFLAGS=--32
|
|
CFLAGS="-m32 "
|
|
LDFLAGS="-b elf32-i386"
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
rm -f $TMPFILE ${TMPFILE}.o
|
|
|
|
if [ "$GCCPREFIX" = "invalid" ]; then
|
|
echo '$(error no suitable gcc found)'
|
|
exit 1
|
|
fi
|
|
|
|
CC="${GCCPREFIX}gcc"
|
|
testcc "$CC" "$CFLAGS-Wa,--divide " && CFLAGS="$CFLAGS-Wa,--divide "
|
|
testcc "$CC" "$CFLAGS-fno-stack-protector " && CFLAGS="$CFLAGS-fno-stack-protector "
|
|
testcc "$CC" "$CFLAGS-Wl,--build-id=none " && CFLAGS="$CFLAGS-Wl,--build-id=none "
|
|
# GCC 4.6 is much more picky about unused variables. Turn off it's warnings for
|
|
# now:
|
|
testcc "$CC" "$CFLAGS-Wno-unused-but-set-variable " && \
|
|
CFLAGS="$CFLAGS-Wno-unused-but-set-variable "
|
|
# Use bfd linker instead of gold if available:
|
|
testcc "$CC" "$CFLAGS-fuse-ld=bfd " && CFLAGS="$CFLAGS-fuse-ld=bfd " && LINKER_SUFFIX='.bfd'
|
|
# Prevent SSE instructions sneaking in:
|
|
testcc "$CC" "$CFLAGS-mno-sse " && CFLAGS="$CFLAGS-mno-sse "
|
|
|
|
if which gcc 2>/dev/null >/dev/null; then
|
|
HOSTCC=gcc
|
|
else
|
|
HOSTCC=cc
|
|
fi
|
|
|
|
if [ "`${XGCCPATH}/iasl 2>/dev/null | grep -c ACPI`" -gt 0 ]; then
|
|
IASL=${XGCCPATH}iasl
|
|
else
|
|
IASL=iasl
|
|
fi
|
|
|
|
cat << EOF
|
|
# elf${TWIDTH}-${TARCH} toolchain
|
|
AS:=${GCCPREFIX}as ${ASFLAGS}
|
|
CC:=${GCCPREFIX}gcc ${CFLAGS}
|
|
AR:=${GCCPREFIX}ar
|
|
LD:=${GCCPREFIX}ld ${LDFLAGS}
|
|
STRIP:=${GCCPREFIX}strip
|
|
NM:=${GCCPREFIX}nm
|
|
OBJCOPY:=${GCCPREFIX}objcopy
|
|
OBJDUMP:=${GCCPREFIX}objdump
|
|
|
|
IASL:=${IASL}
|
|
|
|
# native toolchain
|
|
HOSTCC:=${HOSTCC}
|
|
EOF
|
|
|