Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F157497579
D37952.id114774.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
6 KB
Referenced Files
None
Subscribers
None
D37952.id114774.diff
View Options
diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk
--- a/share/mk/src.opts.mk
+++ b/share/mk/src.opts.mk
@@ -132,6 +132,7 @@
LLVM_ASSERTIONS \
LLVM_COV \
LLVM_CXXFILT \
+ LOADER_BACKTRACE \
LOADER_GELI \
LOADER_KBOOT \
LOADER_LUA \
@@ -318,6 +319,12 @@
.if ${__T:Mpowerpc*}
BROKEN_OPTIONS+=LOADER_GELI LOADER_LUA
.endif
+# Backtrace doesn't work on powerpc, alas
+.if ${__T:Mpowerpc*}
+BROKEN_OPTIONS+=LOADER_BACKTRACE
+.endif
+
+
# Kernel TLS is enabled by default on amd64 and aarch64
.if ${__T} == "aarch64" || ${__T} == "amd64"
diff --git a/stand/Makefile b/stand/Makefile
--- a/stand/Makefile
+++ b/stand/Makefile
@@ -24,6 +24,7 @@
S.${MK_FORTH}+= forth
S.${MK_LOADER_LUA}+= liblua
S.${MK_LOADER_LUA}+= lua
+S.${MK_LOADER_BACKTRACE}+=libbacktrace
S.yes+= defaults
S.yes+= fonts
S.yes+= images
diff --git a/stand/defs.mk b/stand/defs.mk
--- a/stand/defs.mk
+++ b/stand/defs.mk
@@ -71,6 +71,14 @@
LIBSA32= ${BOOTOBJ}/libsa32/libsa32.a
.endif
+# Backtrace doesn't work everywhere, so allow it to be disabled.
+.if ${MK_LOADER_BACKTRACE} == "yes"
+LIBBACKTRACE= ${BOOTOBJ}/libbacktrace/libbacktrace.a # Nothing when not configured
+CFLAGS+= -DLOADER_BACKTRACE
+LIBEXECINFO= ${SRCTOP}/contrib/libexecinfo
+CFLAGS+= -I${LIBEXECINFO}
+.endif
+
# Standard options:
CFLAGS+= -nostdinc
# Allow CFLAGS_EARLY.file/target so that code that needs specific stack
diff --git a/stand/libbacktrace/Makefile b/stand/libbacktrace/Makefile
new file mode 100644
--- /dev/null
+++ b/stand/libbacktrace/Makefile
@@ -0,0 +1,87 @@
+# $FreeBSD$
+
+# Note: This pulls together libgcc_eh (basically libunwind) and libexecinfo, or
+# at least the bits that are needed to work in the reduced-space of libstand
+# programs
+
+#LOADER_NO_SPIKE=t
+
+.include <src.opts.mk>
+
+LIB= backtrace
+NO_PIC=
+MK_SSP= no
+WARNS?= 2
+
+## From libgcc_eh (Makefile and Makefile.inc merged with tweaks for loader env)
+
+COMPILERRTDIR= ${SRCTOP}/contrib/llvm-project/compiler-rt
+UNWINDINCDIR= ${SRCTOP}/contrib/llvm-project/libunwind/include
+UNWINDSRCDIR= ${SRCTOP}/contrib/llvm-project/libunwind/src
+
+SRCS_EXC+= int_util.c
+
+STATIC_CFLAGS+=${PICFLAG} -fvisibility=hidden -DVISIBILITY_HIDDEN
+STATIC_CXXFLAGS+= -fvisibility=hidden -fPIC
+
+.PATH: ${COMPILERRTDIR}/lib/builtins
+.PATH: ${UNWINDSRCDIR}
+SRCS_EXC+= gcc_personality_v0.c
+SRCS_EXC+= Unwind-EHABI.cpp
+SRCS_EXC+= Unwind-sjlj.c
+SRCS_EXC+= UnwindLevel1-gcc-ext.c
+SRCS_EXC+= UnwindLevel1.c
+SRCS_EXC+= UnwindRegistersRestore.S
+SRCS_EXC+= UnwindRegistersSave.S
+SRCS_EXC+= libunwind.cpp
+
+SRCS+= ${SRCS_EXC}
+
+FLAGS_EXC= -include ${.CURDIR}/unwind-hacks.h \
+ -fno-exceptions \
+ -funwind-tables \
+ -I${UNWINDINCDIR}
+
+.for file in ${SRCS_EXC:M*.c}
+CFLAGS.${file}+= ${FLAGS_EXC}
+. if ${MK_ASAN} != "no"
+# False-positives during stack unwinding
+CFLAGS.${file}+= -fno-sanitize=address
+. endif
+.endfor
+
+.for file in ${SRCS_EXC:M*.cpp}
+CXXFLAGS.${file}+= ${FLAGS_EXC}
+CXXFLAGS.${file}+= -fno-rtti
+. if ${MK_ASAN} != "no"
+# False-positives during stack unwinding
+CXXFLAGS.${file}+= -fno-sanitize=address
+. endif
+.endfor
+CXXSTD?= c++11
+
+# We do ugly things to make floats and doubles look like ints, this works except
+# for a format that's hard to fix w/o hacking the format. Since the arg is
+# really a float, and is the same size as a float for all our ABIs, just
+# suppress the warning: Things will work at intended.
+CXXFLAGS.libunwind.cpp+= -Wno-format
+
+# Probably need to just move this earlier or use CXXFLAGS
+# XXX likely want to hoist it up into defs.mk -- if it's even needed
+.if ${MK_DIRDEPS_BUILD} == "yes"
+# Avoid dependency on lib/libc++
+CFLAGS+= -isystem ${SRCTOP}/contrib/llvm-project/libcxx/include -nostdinc++
+.endif
+
+## From libexecinfo for backtrace, et al
+
+LIBEXECINFO= ${SRCTOP}/contrib/libexecinfo
+.PATH: ${LIBEXECINFO}
+SRCS_EI= unwind.c
+# XXX these need libelf SRCS_EI+= backtrace.c symtab.c
+.for file in ${SRCS_EI}
+CFLAGS.${file}+= -I${UNWINDINCDIR}
+.endfor
+SRCS+=${SRCS_EI}
+
+.include <bsd.lib.mk>
diff --git a/stand/libbacktrace/Makefile.depend b/stand/libbacktrace/Makefile.depend
new file mode 100644
--- /dev/null
+++ b/stand/libbacktrace/Makefile.depend
@@ -0,0 +1,13 @@
+# $FreeBSD$
+# Autogenerated - do NOT edit!
+
+DIRDEPS = \
+ include \
+ include/xlocale \
+
+
+.include <dirdeps.mk>
+
+.if ${DEP_RELDIR} == ${_DEP_RELDIR}
+# local dependencies - needed for -jN in clean tree
+.endif
diff --git a/stand/libbacktrace/unwind-hacks.h b/stand/libbacktrace/unwind-hacks.h
new file mode 100644
--- /dev/null
+++ b/stand/libbacktrace/unwind-hacks.h
@@ -0,0 +1,34 @@
+/* Hacks for libunwind */
+#if !defined(__ASSEMBLER__)
+#define fprintf(f, fmt...) printf(fmt)
+#define fflush(x) (0)
+
+/*
+ * Note: Although we RUN on Linux when we're inside of loader.kboot, we compile on
+ * FreeBSD, and the #ifdefs that are in libunwind and and compiler-rt are all compile-time
+ * not runtime.
+ *
+ * libexecinfo's backtrace, however, does need a __linux__ #define, but that's
+ * makefile magic. Except we don't actually use it, so this concern is theoretical
+ * and wouldn't be present for EFI or other boot environments.
+ */
+
+/*
+ * Limit subset of features that are appropriate for boot loader.
+ */
+#define _LIBUNWIND_IS_NATIVE_ONLY
+#define _LIBUNWIND_USE_FRAME_HEADER_CACHE
+#define _LIBUNWIND_IS_BAREMETAL
+#define _LIBUNWIND_HAS_NO_THREADS
+
+/*
+ * libunwind uses alloca by default, so rediret it to the builtin one.
+ */
+#define alloca __builtin_alloca
+
+#undef double
+#undef float
+#define double uint64_t
+#define float uint32_t
+
+#endif
diff --git a/tools/build/options/WITHOUT_LOADER_BACKTRACE b/tools/build/options/WITHOUT_LOADER_BACKTRACE
new file mode 100644
--- /dev/null
+++ b/tools/build/options/WITHOUT_LOADER_BACKTRACE
@@ -0,0 +1,2 @@
+Do not build backtrace support for the bootloader.
+
diff --git a/tools/build/options/WITH_LOADER_BACKTRACE b/tools/build/options/WITH_LOADER_BACKTRACE
new file mode 100644
--- /dev/null
+++ b/tools/build/options/WITH_LOADER_BACKTRACE
@@ -0,0 +1,2 @@
+Build backtrace support for the bootloader.
+This option does does not work on all powerpc platforms, though, and cannot be enabled.
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, May 23, 1:57 AM (20 h, 59 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33439240
Default Alt Text
D37952.id114774.diff (6 KB)
Attached To
Mode
D37952: stand: Add libbacktrace to toolbox of boot loader
Attached
Detach File
Event Timeline
Log In to Comment