Build a separate libsupc++ for the kernel with correct flags.
Kernel mode code on x86_64 needs to be built with -mno-red-zone as interrupts would corrupt the red zone if it were in use. However, the kernel is linked with libsupc++, which was not compiled with -mno-red-zone. If an interrupt occurred in libsupc++ code the red zone would get corrupted. This was causing random panics, particularly under heavy system load. Therefore, on x86_64 a separate build of libsupc++ with -mno-red-zone is now done for the kernel to use. Note: this commit will require a rerun of configure and rebuild of cross tools.
This commit is contained in:
@@ -1035,6 +1035,8 @@ if $(TARGET_PLATFORM) = haiku {
|
|||||||
TARGET_GCC_LIBGCC = $(HAIKU_GCC_LIBGCC) ;
|
TARGET_GCC_LIBGCC = $(HAIKU_GCC_LIBGCC) ;
|
||||||
TARGET_GCC_LIBGCC_OBJECTS = $(HAIKU_GCC_LIBGCC_OBJECTS) ;
|
TARGET_GCC_LIBGCC_OBJECTS = $(HAIKU_GCC_LIBGCC_OBJECTS) ;
|
||||||
|
|
||||||
|
TARGET_KERNEL_LIBGCC = $(HAIKU_KERNEL_LIBGCC) ;
|
||||||
|
TARGET_KERNEL_LIBSUPC++ = $(HAIKU_KERNEL_LIBSUPC++) ;
|
||||||
TARGET_BOOT_LIBGCC = $(HAIKU_BOOT_LIBGCC) ;
|
TARGET_BOOT_LIBGCC = $(HAIKU_BOOT_LIBGCC) ;
|
||||||
TARGET_BOOT_LIBSUPC++ = $(HAIKU_BOOT_LIBSUPC++) ;
|
TARGET_BOOT_LIBSUPC++ = $(HAIKU_BOOT_LIBSUPC++) ;
|
||||||
|
|
||||||
@@ -1054,6 +1056,8 @@ if $(TARGET_PLATFORM) = haiku {
|
|||||||
TARGET_GCC_LIBGCC = ;
|
TARGET_GCC_LIBGCC = ;
|
||||||
TARGET_GCC_LIBGCC_OBJECTS = ;
|
TARGET_GCC_LIBGCC_OBJECTS = ;
|
||||||
|
|
||||||
|
TARGET_KERNEL_LIBGCC = ;
|
||||||
|
TARGET_KERNEL_LIBSUPC++ = ;
|
||||||
TARGET_BOOT_LIBGCC = ;
|
TARGET_BOOT_LIBGCC = ;
|
||||||
TARGET_BOOT_LIBSUPC++ = ;
|
TARGET_BOOT_LIBSUPC++ = ;
|
||||||
|
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ rule KernelLd
|
|||||||
# libsupc++ is opt-out.
|
# libsupc++ is opt-out.
|
||||||
local libs ;
|
local libs ;
|
||||||
if ! [ on $(1) return HAIKU_NO_LIBSUPC++ ] {
|
if ! [ on $(1) return HAIKU_NO_LIBSUPC++ ] {
|
||||||
libs += $(TARGET_STATIC_LIBSUPC++) ;
|
libs += $(TARGET_KERNEL_LIBSUPC++) ;
|
||||||
}
|
}
|
||||||
LINKLIBS on $(1) = $(libs) $(TARGET_GCC_LIBGCC) ;
|
LINKLIBS on $(1) = $(libs) $(TARGET_KERNEL_LIBGCC) ;
|
||||||
|
|
||||||
# TODO: Do we really want to invoke SetupKernel here? The objects should
|
# TODO: Do we really want to invoke SetupKernel here? The objects should
|
||||||
# have been compiled with KernelObjects anyway, so we're doing that twice.
|
# have been compiled with KernelObjects anyway, so we're doing that twice.
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ x86_64-*)
|
|||||||
# failure
|
# failure
|
||||||
binutilsConfigureArgs=""
|
binutilsConfigureArgs=""
|
||||||
gccConfigureArgs=""
|
gccConfigureArgs=""
|
||||||
|
kernelSupcxxFlags="-mno-red-zone"
|
||||||
;;
|
;;
|
||||||
m68k-*)
|
m68k-*)
|
||||||
binutilsConfigureArgs="--enable-multilib"
|
binutilsConfigureArgs="--enable-multilib"
|
||||||
@@ -45,6 +46,7 @@ arm-*)
|
|||||||
*)
|
*)
|
||||||
binutilsConfigureArgs="--disable-multilib"
|
binutilsConfigureArgs="--disable-multilib"
|
||||||
gccConfigureArgs="--disable-multilib"
|
gccConfigureArgs="--disable-multilib"
|
||||||
|
kernelSupcxxFlags=
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@@ -101,13 +103,14 @@ installDir=$haikuOutputDir/cross-tools
|
|||||||
objDir=$haikuOutputDir/cross-tools-build
|
objDir=$haikuOutputDir/cross-tools-build
|
||||||
binutilsObjDir=$objDir/binutils
|
binutilsObjDir=$objDir/binutils
|
||||||
gccObjDir=$objDir/gcc
|
gccObjDir=$objDir/gcc
|
||||||
|
stdcxxObjDir=$objDir/stdcxx
|
||||||
tmpIncludeDir=$objDir/sysincludes
|
tmpIncludeDir=$objDir/sysincludes
|
||||||
tmpLibDir=$objDir/syslibs
|
tmpLibDir=$objDir/syslibs
|
||||||
|
|
||||||
rm -rf $installDir $objDir
|
rm -rf $installDir $objDir
|
||||||
|
|
||||||
mkdir -p $installDir $objDir $binutilsObjDir $gccObjDir $tmpIncludeDir \
|
mkdir -p $installDir $objDir $binutilsObjDir $gccObjDir $stdcxxObjDir \
|
||||||
$tmpLibDir || exit 1
|
$tmpIncludeDir $tmpLibDir || exit 1
|
||||||
mkdir -p $installDir/lib/gcc/$haikuMachine/$gccVersion
|
mkdir -p $installDir/lib/gcc/$haikuMachine/$gccVersion
|
||||||
|
|
||||||
|
|
||||||
@@ -163,6 +166,20 @@ $MAKE $additionalMakeArgs install || {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# build libsupc++ for the kernel if the target arch requires it
|
||||||
|
if [ -n "$kernelSupcxxFlags" ]; then
|
||||||
|
cd $stdcxxObjDir
|
||||||
|
CFLAGS="-O2 $kernelSupcxxFlags" CXXFLAGS="-O2 $kernelSupcxxFlags" \
|
||||||
|
$gccSourceDir/libstdc++-v3/configure --prefix=$installDir \
|
||||||
|
--target=$haikuMachine --host=$haikuMachine --disable-shared \
|
||||||
|
--disable-multilib || exit 1
|
||||||
|
$MAKE $additionalMakeArgs -C libsupc++ || {
|
||||||
|
echo "Error: Building kernel libsupc++ failed." >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
cp libsupc++/.libs/libsupc++.a $installDir/$haikuMachine/lib/libsupc++-kernel.a
|
||||||
|
fi
|
||||||
|
|
||||||
# cleanup
|
# cleanup
|
||||||
|
|
||||||
# remove the system headers from the installation dir
|
# remove the system headers from the installation dir
|
||||||
|
|||||||
@@ -244,9 +244,19 @@ standard_gcc_settings()
|
|||||||
esac
|
esac
|
||||||
|
|
||||||
if [ "$targetArch" = "x86_64" ]; then
|
if [ "$targetArch" = "x86_64" ]; then
|
||||||
|
# Kernel doesn't need libgcc, and has a special version of libsupc++
|
||||||
|
# built with the correct flags. Note: Should libgcc ever be needed for
|
||||||
|
# the x86_64 kernel, a separate build of it will be needed with
|
||||||
|
# -mno-red-zone, like for libsupc++.
|
||||||
|
HAIKU_KERNEL_LIBGCC=
|
||||||
|
HAIKU_KERNEL_LIBSUPCXX=`$HAIKU_CC -print-file-name=libsupc++-kernel.a`
|
||||||
|
|
||||||
|
# Boot loader is 32-bit, need the 32-bit libs.
|
||||||
HAIKU_BOOT_LIBGCC=`$HAIKU_CC -m32 -print-libgcc-file-name`
|
HAIKU_BOOT_LIBGCC=`$HAIKU_CC -m32 -print-libgcc-file-name`
|
||||||
HAIKU_BOOT_LIBSUPCXX=`$HAIKU_CC -m32 -print-file-name=libsupc++.a`
|
HAIKU_BOOT_LIBSUPCXX=`$HAIKU_CC -m32 -print-file-name=libsupc++.a`
|
||||||
else
|
else
|
||||||
|
HAIKU_KERNEL_LIBGCC=$HAIKU_GCC_LIBGCC
|
||||||
|
HAIKU_KERNEL_LIBSUPCXX=$HAIKU_STATIC_LIBSUPCXX
|
||||||
HAIKU_BOOT_LIBGCC=$HAIKU_GCC_LIBGCC
|
HAIKU_BOOT_LIBGCC=$HAIKU_GCC_LIBGCC
|
||||||
HAIKU_BOOT_LIBSUPCXX=$HAIKU_STATIC_LIBSUPCXX
|
HAIKU_BOOT_LIBSUPCXX=$HAIKU_STATIC_LIBSUPCXX
|
||||||
fi
|
fi
|
||||||
@@ -570,6 +580,8 @@ HAIKU_STATIC_LIBSUPC++ ?= ${HAIKU_STATIC_LIBSUPCXX} ;
|
|||||||
HAIKU_SHARED_LIBSUPC++ ?= ${HAIKU_SHARED_LIBSUPCXX} ;
|
HAIKU_SHARED_LIBSUPC++ ?= ${HAIKU_SHARED_LIBSUPCXX} ;
|
||||||
HAIKU_C++_HEADERS_DIR ?= ${HAIKU_CXX_HEADERS_DIR} ;
|
HAIKU_C++_HEADERS_DIR ?= ${HAIKU_CXX_HEADERS_DIR} ;
|
||||||
|
|
||||||
|
HAIKU_KERNEL_LIBGCC ?= ${HAIKU_KERNEL_LIBGCC} ;
|
||||||
|
HAIKU_KERNEL_LIBSUPC++ ?= ${HAIKU_KERNEL_LIBSUPCXX} ;
|
||||||
HAIKU_BOOT_LIBGCC ?= ${HAIKU_BOOT_LIBGCC} ;
|
HAIKU_BOOT_LIBGCC ?= ${HAIKU_BOOT_LIBGCC} ;
|
||||||
HAIKU_BOOT_LIBSUPC++ ?= ${HAIKU_BOOT_LIBSUPCXX} ;
|
HAIKU_BOOT_LIBSUPC++ ?= ${HAIKU_BOOT_LIBSUPCXX} ;
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ HAIKU_BIND_FS_SOURCES =
|
|||||||
KernelAddon bindfs
|
KernelAddon bindfs
|
||||||
:
|
:
|
||||||
$(HAIKU_BIND_FS_SOURCES)
|
$(HAIKU_BIND_FS_SOURCES)
|
||||||
: $(HAIKU_STATIC_LIBSUPC++)
|
: $(HAIKU_KERNEL_LIBSUPC++)
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ KernelAddon packagefs
|
|||||||
$(HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES)
|
$(HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES)
|
||||||
$(libSharedSources)
|
$(libSharedSources)
|
||||||
|
|
||||||
: $(HAIKU_STATIC_LIBSUPC++) libz.a
|
: $(HAIKU_KERNEL_LIBSUPC++) libz.a
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,5 +45,5 @@ KernelAddon ramfs
|
|||||||
SymLink.cpp
|
SymLink.cpp
|
||||||
Volume.cpp
|
Volume.cpp
|
||||||
|
|
||||||
: $(HAIKU_LIBSUPC++)
|
: $(HAIKU_KERNEL_LIBSUPC++)
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -28,5 +28,5 @@ KernelAddon reiserfs
|
|||||||
VNode.cpp
|
VNode.cpp
|
||||||
Volume.cpp
|
Volume.cpp
|
||||||
|
|
||||||
: $(HAIKU_STATIC_LIBSUPC++)
|
: $(HAIKU_KERNEL_LIBSUPC++)
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -41,5 +41,5 @@ KernelAddon userlandfs
|
|||||||
UserlandFS.cpp
|
UserlandFS.cpp
|
||||||
Volume.cpp
|
Volume.cpp
|
||||||
|
|
||||||
: $(HAIKU_STATIC_LIBSUPC++)
|
: $(HAIKU_KERNEL_LIBSUPC++)
|
||||||
;
|
;
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ KernelLd kernel_$(TARGET_ARCH) :
|
|||||||
kernel_lib_posix_arch_$(TARGET_ARCH).o
|
kernel_lib_posix_arch_$(TARGET_ARCH).o
|
||||||
kernel_misc.o
|
kernel_misc.o
|
||||||
|
|
||||||
$(HAIKU_STATIC_LIBSUPC++)
|
$(HAIKU_KERNEL_LIBSUPC++)
|
||||||
|
|
||||||
: $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld
|
: $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld
|
||||||
: -Bdynamic -export-dynamic -dynamic-linker /foo/bar
|
: -Bdynamic -export-dynamic -dynamic-linker /foo/bar
|
||||||
@@ -168,7 +168,7 @@ if $(HAIKU_ARCH) = x86_64 {
|
|||||||
kernel_lib_posix_arch_$(TARGET_ARCH).o
|
kernel_lib_posix_arch_$(TARGET_ARCH).o
|
||||||
kernel_misc.o
|
kernel_misc.o
|
||||||
|
|
||||||
$(HAIKU_STATIC_LIBSUPC++)
|
$(HAIKU_KERNEL_LIBSUPC++)
|
||||||
|
|
||||||
: $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld
|
: $(HAIKU_TOP)/src/system/ldscripts/$(TARGET_ARCH)/kernel.ld
|
||||||
: -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar
|
: -Bdynamic -shared -export-dynamic -dynamic-linker /foo/bar
|
||||||
|
|||||||
Reference in New Issue
Block a user