2001-11-02 21:34:20 +00:00
|
|
|
# $FreeBSD$
|
2003-11-05 12:20:16 +00:00
|
|
|
|
|
|
|
# Part of a unified Makefile for building kernels. This part contains all
|
|
|
|
# of the definitions that need to be before %BEFORE_DEPEND.
|
2001-11-02 21:34:20 +00:00
|
|
|
|
2014-05-17 20:31:34 +00:00
|
|
|
# Allow user to configure things that only effect src tree builds.
|
|
|
|
# Note: This is duplicated from src.sys.mk to ensure that we include
|
|
|
|
# /etc/src.conf when building the kernel. Kernels can be built without
|
|
|
|
# the rest of /usr/src, but they still always process SRCCONF even though
|
|
|
|
# the normal mechanisms to prevent that (compiling out of tree) won't
|
|
|
|
# work. To ensure they do work, we have to duplicate thee few lines here.
|
|
|
|
SRCCONF?= /etc/src.conf
|
|
|
|
.if (exists(${SRCCONF}) || ${SRCCONF} != "/etc/src.conf") && !target(_srcconf_included_)
|
|
|
|
.include "${SRCCONF}"
|
|
|
|
_srcconf_included_:
|
|
|
|
.endif
|
|
|
|
|
|
|
|
.include <bsd.own.mk>
|
2012-09-13 16:00:46 +00:00
|
|
|
.include <bsd.compiler.mk>
|
2014-05-09 21:11:27 +00:00
|
|
|
.include "kern.opts.mk"
|
2006-07-17 18:43:16 +00:00
|
|
|
|
2016-05-26 23:20:01 +00:00
|
|
|
# The kernel build always occurs in the object directory which is .CURDIR.
|
|
|
|
.if ${.MAKE.MODE:Unormal:Mmeta}
|
|
|
|
.MAKE.MODE+= curdirOk=yes
|
|
|
|
.endif
|
|
|
|
|
2017-11-09 02:37:49 +00:00
|
|
|
# The kernel build always expects .OBJDIR=.CURDIR.
|
|
|
|
.OBJDIR: ${.CURDIR}
|
|
|
|
|
2017-11-03 23:22:03 +00:00
|
|
|
.if defined(NO_OBJWALK) || ${MK_AUTO_OBJ} == "yes"
|
|
|
|
NO_OBJWALK= t
|
2017-05-09 20:21:38 +00:00
|
|
|
NO_MODULES_OBJ= t
|
|
|
|
.endif
|
2017-11-03 23:22:03 +00:00
|
|
|
.if !defined(NO_OBJWALK)
|
2017-05-09 20:21:38 +00:00
|
|
|
_obj= obj
|
|
|
|
.endif
|
|
|
|
|
2001-11-02 21:34:20 +00:00
|
|
|
# Can be overridden by makeoptions or /etc/make.conf
|
|
|
|
KERNEL_KO?= kernel
|
|
|
|
KERNEL?= kernel
|
|
|
|
KODIR?= /boot/${KERNEL}
|
2008-02-02 07:52:24 +00:00
|
|
|
LDSCRIPT_NAME?= ldscript.$M
|
|
|
|
LDSCRIPT?= $S/conf/${LDSCRIPT_NAME}
|
2001-11-02 21:34:20 +00:00
|
|
|
|
2015-04-16 22:34:10 +00:00
|
|
|
M= ${MACHINE}
|
2001-11-02 21:34:20 +00:00
|
|
|
|
2002-03-01 01:21:29 +00:00
|
|
|
AWK?= awk
|
2012-09-13 09:01:52 +00:00
|
|
|
CP?= cp
|
2001-11-02 21:34:20 +00:00
|
|
|
NM?= nm
|
|
|
|
OBJCOPY?= objcopy
|
|
|
|
SIZE?= size
|
|
|
|
|
2011-04-19 18:09:21 +00:00
|
|
|
.if defined(DEBUG)
|
2005-01-22 00:58:34 +00:00
|
|
|
_MINUS_O= -O
|
2009-01-12 16:54:41 +00:00
|
|
|
CTFFLAGS+= -g
|
2011-04-19 18:09:21 +00:00
|
|
|
.else
|
2011-08-15 13:33:14 +00:00
|
|
|
.if ${MACHINE_CPUARCH} == "powerpc"
|
|
|
|
_MINUS_O= -O # gcc miscompiles some code at -O2
|
|
|
|
.else
|
2005-01-22 00:58:34 +00:00
|
|
|
_MINUS_O= -O2
|
2011-04-19 18:09:21 +00:00
|
|
|
.endif
|
2011-08-15 13:33:14 +00:00
|
|
|
.endif
|
2011-04-19 18:09:21 +00:00
|
|
|
.if ${MACHINE_CPUARCH} == "amd64"
|
2014-05-10 16:38:09 +00:00
|
|
|
.if ${COMPILER_TYPE} == "clang"
|
2011-12-24 19:01:31 +00:00
|
|
|
COPTFLAGS?=-O2 -pipe
|
2014-05-10 16:38:09 +00:00
|
|
|
.else
|
|
|
|
COPTFLAGS?=-O2 -frename-registers -pipe
|
2011-12-24 19:01:31 +00:00
|
|
|
.endif
|
|
|
|
.else
|
2005-01-22 00:58:34 +00:00
|
|
|
COPTFLAGS?=${_MINUS_O} -pipe
|
2011-04-19 18:09:21 +00:00
|
|
|
.endif
|
|
|
|
.if !empty(COPTFLAGS:M-O[23s]) && empty(COPTFLAGS:M-fno-strict-aliasing)
|
2004-01-22 10:01:47 +00:00
|
|
|
COPTFLAGS+= -fno-strict-aliasing
|
|
|
|
.endif
|
2001-11-02 21:34:20 +00:00
|
|
|
.if !defined(NO_CPU_COPTFLAGS)
|
|
|
|
COPTFLAGS+= ${_CPUCFLAGS}
|
This are the build infrastructure changes to allow to use the
Intel C/C++ compiler (lang/icc) to build the kernel.
The icc CPUTYPE CFLAGS use icc v7 syntax, icc v8 moans about them, but
doesn't abort. They also produce CPU specific code (new instructions
of the CPU, not only CPU specific scheduling), so if you get coredumps
with signal 4 (SIGILL, illegal instruction) you've used the wrong
CPUTYPE.
Incarnations of this patch survive gcc compiles and my make universe.
I use it on my desktop.
To use it update share/mk, add
/usr/local/intel/compiler70/ia32/bin (icc v7, works)
or
/usr/local/intel_cc_80/bin (icc v8, doesn't work)
to your PATH, make sure you have a new kernel compile directory
(e.g. MYKERNEL_icc) and run
CFLAGS="-O2 -ip" CC=icc make depend
CFLAGS="-O2 -ip" CC=icc make
in it.
Don't compile with -ipo, the build infrastructure uses ld directly to
link the kernel and the modules, but -ipo needs the link step to be
performed with Intel's linker.
Problems with icc v8:
- panic: npx0 cannot be emulated on an SMP system
- UP: first start of /bin/sh results in a FP exception
Parts of this commit contains suggestions or submissions from
Marius Strobl <marius@alchemy.franken.de>.
Reviewed by: silence on -arch
Submitted by: netchild
2004-03-12 21:36:12 +00:00
|
|
|
.endif
|
|
|
|
NOSTDINC= -nostdinc
|
|
|
|
|
2018-05-10 17:55:24 +00:00
|
|
|
INCLUDES= ${NOSTDINC} ${INCLMAGIC} -I. -I$S -I$S/contrib/ck/include
|
2001-11-02 21:34:20 +00:00
|
|
|
|
2015-04-28 23:54:55 +00:00
|
|
|
CFLAGS= ${COPTFLAGS} ${DEBUG}
|
2005-10-05 10:05:55 +00:00
|
|
|
CFLAGS+= ${INCLUDES} -D_KERNEL -DHAVE_KERNEL_OPTION_HEADERS -include opt_global.h
|
2013-11-06 05:26:15 +00:00
|
|
|
CFLAGS_PARAM_INLINE_UNIT_GROWTH?=100
|
|
|
|
CFLAGS_PARAM_LARGE_FUNCTION_GROWTH?=1000
|
|
|
|
.if ${MACHINE_CPUARCH} == "mips"
|
2016-12-30 00:34:52 +00:00
|
|
|
CFLAGS_ARCH_PARAMS?=--param max-inline-insns-single=1000 -DMACHINE_ARCH='"${MACHINE_ARCH}"'
|
2013-11-06 05:26:15 +00:00
|
|
|
.endif
|
2015-02-17 19:27:14 +00:00
|
|
|
CFLAGS.gcc+= -fno-common -fms-extensions -finline-limit=${INLINE_LIMIT}
|
2014-05-10 16:38:09 +00:00
|
|
|
CFLAGS.gcc+= --param inline-unit-growth=${CFLAGS_PARAM_INLINE_UNIT_GROWTH}
|
|
|
|
CFLAGS.gcc+= --param large-function-growth=${CFLAGS_PARAM_LARGE_FUNCTION_GROWTH}
|
2018-08-21 03:45:09 +00:00
|
|
|
CFLAGS.gcc+= -fms-extensions
|
2013-11-06 05:26:15 +00:00
|
|
|
.if defined(CFLAGS_ARCH_PARAMS)
|
2014-05-10 16:38:09 +00:00
|
|
|
CFLAGS.gcc+=${CFLAGS_ARCH_PARAMS}
|
2010-07-22 21:31:35 +00:00
|
|
|
.endif
|
2019-08-23 16:42:04 +00:00
|
|
|
.if ${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} < 50000
|
|
|
|
WERROR?= -Wno-error
|
|
|
|
.else
|
|
|
|
WERROR?= -Werror
|
|
|
|
.endif
|
2001-11-02 21:34:20 +00:00
|
|
|
|
|
|
|
# XXX LOCORE means "don't declare C stuff" not "for locore.s".
|
2015-01-06 23:08:47 +00:00
|
|
|
ASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${CFLAGS} ${ASM_CFLAGS.${.IMPSRC:T}}
|
2012-02-28 18:30:18 +00:00
|
|
|
|
2002-07-13 19:36:14 +00:00
|
|
|
.if defined(PROFLEVEL) && ${PROFLEVEL} >= 1
|
2012-11-07 22:15:28 +00:00
|
|
|
CFLAGS+= -DGPROF
|
2014-05-10 16:38:09 +00:00
|
|
|
CFLAGS.gcc+= -falign-functions=16
|
2001-11-02 21:34:20 +00:00
|
|
|
.if ${PROFLEVEL} >= 2
|
2002-07-13 22:28:34 +00:00
|
|
|
CFLAGS+= -DGPROF4 -DGUPROF
|
2012-11-07 22:45:34 +00:00
|
|
|
PROF= -pg
|
2014-05-10 16:38:09 +00:00
|
|
|
.if ${COMPILER_TYPE} == "gcc"
|
2012-11-07 22:45:34 +00:00
|
|
|
PROF+= -mprofiler-epilogue
|
|
|
|
.endif
|
2002-07-13 22:28:34 +00:00
|
|
|
.else
|
2012-11-07 22:45:34 +00:00
|
|
|
PROF= -pg
|
2001-11-02 21:34:20 +00:00
|
|
|
.endif
|
|
|
|
.endif
|
2002-07-13 22:28:34 +00:00
|
|
|
DEFINED_PROF= ${PROF}
|
2002-02-20 23:35:56 +00:00
|
|
|
|
2019-11-21 11:22:08 +00:00
|
|
|
KCSAN_ENABLED!= grep KCSAN opt_global.h || true ; echo
|
|
|
|
.if !empty(KCSAN_ENABLED)
|
|
|
|
SAN_CFLAGS+= -fsanitize=thread
|
|
|
|
.endif
|
|
|
|
|
2018-11-06 17:32:07 +00:00
|
|
|
KUBSAN_ENABLED!= grep KUBSAN opt_global.h || true ; echo
|
|
|
|
.if !empty(KUBSAN_ENABLED)
|
|
|
|
SAN_CFLAGS+= -fsanitize=undefined
|
|
|
|
.endif
|
Add support for the Clang Coverage Sanitizer in the kernel (KCOV).
When building with KCOV enabled the compiler will insert function calls
to probes allowing us to trace the execution of the kernel from userspace.
These probes are on function entry (trace-pc) and on comparison operations
(trace-cmp).
Userspace can enable the use of these probes on a single kernel thread with
an ioctl interface. It can allocate space for the probe with KIOSETBUFSIZE,
then mmap the allocated buffer and enable tracing with KIOENABLE, with the
trace mode being passed in as the int argument. When complete KIODISABLE
is used to disable tracing.
The first item in the buffer is the number of trace event that have
happened. Userspace can write 0 to this to reset the tracing, and is
expected to do so on first use.
The format of the buffer depends on the trace mode. When in PC tracing just
the return address of the probe is stored. Under comparison tracing the
comparison type, the two arguments, and the return address are traced. The
former method uses on entry per trace event, while the later uses 4. As
such they are incompatible so only a single mode may be enabled.
KCOV is expected to help fuzzing the kernel, and while in development has
already found a number of issues. It is required for the syzkaller system
call fuzzer [1]. Other kernel fuzzers could also make use of it, either
with the current interface, or by extending it with new modes.
A man page is currently being worked on and is expected to be committed
soon, however having the code in the kernel now is useful for other
developers to use.
[1] https://github.com/google/syzkaller
Submitted by: Mitchell Horne <mhorne063@gmail.com> (Earlier version)
Reviewed by: kib
Testing by: tuexen
Sponsored by: DARPA, AFRL
Sponsored by: The FreeBSD Foundation (Mitchell Horne)
Differential Revision: https://reviews.freebsd.org/D14599
2019-01-12 11:21:28 +00:00
|
|
|
|
2019-01-29 11:04:17 +00:00
|
|
|
COVERAGE_ENABLED!= grep COVERAGE opt_global.h || true ; echo
|
|
|
|
.if !empty(COVERAGE_ENABLED)
|
2019-02-04 16:55:24 +00:00
|
|
|
.if ${COMPILER_TYPE} == "clang" || \
|
|
|
|
(${COMPILER_TYPE} == "gcc" && ${COMPILER_VERSION} >= 80100)
|
Add support for the Clang Coverage Sanitizer in the kernel (KCOV).
When building with KCOV enabled the compiler will insert function calls
to probes allowing us to trace the execution of the kernel from userspace.
These probes are on function entry (trace-pc) and on comparison operations
(trace-cmp).
Userspace can enable the use of these probes on a single kernel thread with
an ioctl interface. It can allocate space for the probe with KIOSETBUFSIZE,
then mmap the allocated buffer and enable tracing with KIOENABLE, with the
trace mode being passed in as the int argument. When complete KIODISABLE
is used to disable tracing.
The first item in the buffer is the number of trace event that have
happened. Userspace can write 0 to this to reset the tracing, and is
expected to do so on first use.
The format of the buffer depends on the trace mode. When in PC tracing just
the return address of the probe is stored. Under comparison tracing the
comparison type, the two arguments, and the return address are traced. The
former method uses on entry per trace event, while the later uses 4. As
such they are incompatible so only a single mode may be enabled.
KCOV is expected to help fuzzing the kernel, and while in development has
already found a number of issues. It is required for the syzkaller system
call fuzzer [1]. Other kernel fuzzers could also make use of it, either
with the current interface, or by extending it with new modes.
A man page is currently being worked on and is expected to be committed
soon, however having the code in the kernel now is useful for other
developers to use.
[1] https://github.com/google/syzkaller
Submitted by: Mitchell Horne <mhorne063@gmail.com> (Earlier version)
Reviewed by: kib
Testing by: tuexen
Sponsored by: DARPA, AFRL
Sponsored by: The FreeBSD Foundation (Mitchell Horne)
Differential Revision: https://reviews.freebsd.org/D14599
2019-01-12 11:21:28 +00:00
|
|
|
SAN_CFLAGS+= -fsanitize-coverage=trace-pc,trace-cmp
|
2019-02-04 16:55:24 +00:00
|
|
|
.else
|
|
|
|
SAN_CFLAGS+= -fsanitize-coverage=trace-pc
|
|
|
|
.endif
|
Add support for the Clang Coverage Sanitizer in the kernel (KCOV).
When building with KCOV enabled the compiler will insert function calls
to probes allowing us to trace the execution of the kernel from userspace.
These probes are on function entry (trace-pc) and on comparison operations
(trace-cmp).
Userspace can enable the use of these probes on a single kernel thread with
an ioctl interface. It can allocate space for the probe with KIOSETBUFSIZE,
then mmap the allocated buffer and enable tracing with KIOENABLE, with the
trace mode being passed in as the int argument. When complete KIODISABLE
is used to disable tracing.
The first item in the buffer is the number of trace event that have
happened. Userspace can write 0 to this to reset the tracing, and is
expected to do so on first use.
The format of the buffer depends on the trace mode. When in PC tracing just
the return address of the probe is stored. Under comparison tracing the
comparison type, the two arguments, and the return address are traced. The
former method uses on entry per trace event, while the later uses 4. As
such they are incompatible so only a single mode may be enabled.
KCOV is expected to help fuzzing the kernel, and while in development has
already found a number of issues. It is required for the syzkaller system
call fuzzer [1]. Other kernel fuzzers could also make use of it, either
with the current interface, or by extending it with new modes.
A man page is currently being worked on and is expected to be committed
soon, however having the code in the kernel now is useful for other
developers to use.
[1] https://github.com/google/syzkaller
Submitted by: Mitchell Horne <mhorne063@gmail.com> (Earlier version)
Reviewed by: kib
Testing by: tuexen
Sponsored by: DARPA, AFRL
Sponsored by: The FreeBSD Foundation (Mitchell Horne)
Differential Revision: https://reviews.freebsd.org/D14599
2019-01-12 11:21:28 +00:00
|
|
|
.endif
|
|
|
|
|
2018-11-06 17:32:07 +00:00
|
|
|
CFLAGS+= ${SAN_CFLAGS}
|
|
|
|
|
2019-02-23 21:14:00 +00:00
|
|
|
GCOV_ENABLED!= grep GCOV opt_global.h || true ; echo
|
|
|
|
.if !empty(GCOV_ENABLED)
|
|
|
|
.if ${COMPILER_TYPE} == "gcc"
|
|
|
|
GCOV_CFLAGS+= -fprofile-arcs -ftest-coverage
|
|
|
|
.endif
|
|
|
|
.endif
|
|
|
|
|
|
|
|
CFLAGS+= ${GCOV_CFLAGS}
|
|
|
|
|
2001-11-02 21:34:20 +00:00
|
|
|
# Put configuration-specific C flags last (except for ${PROF}) so that they
|
|
|
|
# can override the others.
|
|
|
|
CFLAGS+= ${CONF_CFLAGS}
|
|
|
|
|
2017-07-05 19:43:16 +00:00
|
|
|
.if defined(LINKER_FEATURES) && ${LINKER_FEATURES:Mbuild-id}
|
2019-05-14 18:10:32 +00:00
|
|
|
LDFLAGS+= --build-id=sha1
|
2017-06-23 15:57:58 +00:00
|
|
|
.endif
|
|
|
|
|
2018-10-01 18:51:08 +00:00
|
|
|
.if (${MACHINE_CPUARCH} == "aarch64" || ${MACHINE_CPUARCH} == "amd64" || \
|
|
|
|
${MACHINE_CPUARCH} == "i386") && \
|
2018-09-18 15:01:21 +00:00
|
|
|
defined(LINKER_FEATURES) && ${LINKER_FEATURES:Mifunc} == ""
|
2018-10-01 18:51:08 +00:00
|
|
|
.error amd64/arm64/i386 kernel requires linker ifunc support
|
2018-05-10 20:10:02 +00:00
|
|
|
.endif
|
2018-09-18 15:01:21 +00:00
|
|
|
.if ${MACHINE_CPUARCH} == "amd64"
|
2019-05-14 18:10:32 +00:00
|
|
|
LDFLAGS+= -z max-page-size=2097152
|
2018-08-04 16:56:39 +00:00
|
|
|
.if ${LINKER_TYPE} != "lld"
|
2019-05-14 18:10:32 +00:00
|
|
|
LDFLAGS+= -z common-page-size=4096
|
2018-08-24 18:09:23 +00:00
|
|
|
.else
|
2019-05-14 18:26:39 +00:00
|
|
|
LDFLAGS+= -z notext -z ifunc-noplt
|
2018-08-04 16:56:39 +00:00
|
|
|
.endif
|
2018-03-06 14:18:45 +00:00
|
|
|
.endif
|
|
|
|
|
2020-01-07 23:18:31 +00:00
|
|
|
.if ${MACHINE_CPUARCH} == "riscv"
|
|
|
|
# Hack: Work around undefined weak symbols being out of range when linking with
|
|
|
|
# LLD (address is a PC-relative calculation, and BFD works around this by
|
|
|
|
# rewriting the instructions to generate an absolute address of 0); -fPIE
|
|
|
|
# avoids this since it uses the GOT for all extern symbols, which is overly
|
|
|
|
# inefficient for us. Drop once undefined weak symbols work with medany.
|
|
|
|
.if ${LINKER_TYPE} == "lld"
|
|
|
|
CFLAGS+= -fPIE
|
|
|
|
.endif
|
|
|
|
.endif
|
|
|
|
|
2002-02-20 23:35:56 +00:00
|
|
|
NORMAL_C= ${CC} -c ${CFLAGS} ${WERROR} ${PROF} ${.IMPSRC}
|
Add built-in ccache build support via WITH_CCACHE_BUILD option.
ccache is mostly beneficial for frequent builds where -DNO_CLEAN is not
used to achieve a safe pseudo-incremental build. This is explained in
more detail upstream [1] [2]. It incurs about a 20%-28% hit to populate the
cache, but with a full cache saves 30-50% in build times. When combined with
the WITH_FAST_DEPEND feature it saves up to 65% since ccache does cache the
resulting dependency file, which it does not do when using mkdep(1)/'CC
-E'. Stats are provided at the end of this message.
This removes the need to modify /etc/make.conf with the CC:= and CXX:=
lines which conflicted with external compiler support [3] (causing the
bootstrap compiler to not be built which lead to obscure failures [4]),
incorrectly invoked ccache in various stages, required CCACHE_CPP2 to avoid
Clang errors with parenthesis, and did not work with META_MODE.
The option name was picked to match the existing option in ports. This
feature is available for both in-src and out-of-src builds that use
/usr/share/mk.
Linking, assembly compiles, and pre-processing avoid using ccache since it is
only overhead. ccache does nothing special in these modes, although there is
no harm in calling it for them.
CCACHE_COMPILERCHECK is set to 'content' when using the in-tree bootstrap
compiler to hash the content of the compiler binary to determine if it
should be a cache miss. For external compilers the 'mtime' option is used
as it is more efficient and likely to be correct. Future work may optimize the
'content' check using the same checks as whether a bootstrap compiler is needed
to be built.
The CCACHE_CPP2 pessimization is currently default in our devel/ccache
port due to Clang requiring it. Clang's -Wparentheses-equality,
-Wtautological-compare, and -Wself-assign warnings do not mix well with
compiling already-pre-processed code that may have expanded macros that
trigger the warnings. GCC has so far not had this issue so it is allowed to
disable the CCACHE_CPP2 default in our port.
Sharing a cache between multiple checkouts, or systems, is explained in
the ccache manual. Sharing a cache over NFS would likely not be worth
it, but syncing cache directories between systems may be useful for an
organization. There is also a memcached backend available [5]. Due to using
an object directory outside of the source directory though you will need to
ensure that both are in the same prefix and all users use the same layout. A
possible working layout is as follows:
Source: /some/prefix/src1
Source: /some/prefix/src2
Source: /some/prefix/src3
Objdir: /some/prefix/obj
Environment: CCACHE_BASEDIR='${SRCTOP:H}' MAKEOBJDIRPREFIX='${SRCTOP:H}/obj'
This will use src*/../obj as the MAKEOBJDIRPREFIX and tells ccache to replace
all absolute paths to be relative. Using something like this is required due
to -I and -o flags containing both SRC and OBJDIR absolute paths that ccache
adds into its hash for the object without CCACHE_BASEDIR.
distcc can be hooked into by setting CCACHE_PREFIX=/usr/local/bin/distcc.
I have not personally tested this and assume it will not mix well with
using the bootstrap compiler.
The cache from buildworld can be reused in a subdir by first running
'make buildenv' (from r290424).
Note that the cache is currently different depending on whether -j is
used or not due to ccache enabling -fdiagnostics-color automatically if
stderr is a TTY, which bmake only does if not using -j.
The system I used for testing was:
WITNESS
Build options: -j20 WITH_LLDB=yes WITH_DEBUG_FILES=yes WITH_CCACHE_BUILD=yes
DISK: ZFS 3-way mirror with very slow disks using SSD l2arc/log.
The arc was fully populated with src tree files and ccache objects.
RAM: 76GiB
CPU: Intel(R) Xeon(R) CPU L5520 @2.27GHz
2 package(s) x 4 core(s) x 2 SMT threads = hw.ncpu=16
The WITH_FAST_DEPEND feature was used for comparison here as well to show
the dramatic time savings with a full cache.
buildworld:
x buildworld-before
+ buildworld-ccache-empty
* buildworld-ccache-full
% buildworld-ccache-full-fastdep
# buildworld-fastdep
+-------------------------------------------------------------------------------+
|% * # +|
|% * # +|
|% * # xxx +|
| |A |
| A|
| A |
|A |
| A |
+-------------------------------------------------------------------------------+
N Min Max Median Avg Stddev
x 3 3744.13 3794.31 3752.25 3763.5633 26.935139
+ 3 4519 4525.04 4520.73 4521.59 3.1104823
Difference at 95.0% confidence
758.027 +/- 43.4565
20.1412% +/- 1.15466%
(Student's t, pooled s = 19.1726)
* 3 1823.08 1827.2 1825.62 1825.3 2.0785572
Difference at 95.0% confidence
-1938.26 +/- 43.298
-51.5007% +/- 1.15045%
(Student's t, pooled s = 19.1026)
% 3 1266.96 1279.37 1270.47 1272.2667 6.3971113
Difference at 95.0% confidence
-2491.3 +/- 44.3704
-66.1952% +/- 1.17895%
(Student's t, pooled s = 19.5758)
# 3 3153.34 3155.16 3154.2 3154.2333 0.91045776
Difference at 95.0% confidence
-609.33 +/- 43.1943
-16.1902% +/- 1.1477%
(Student's t, pooled s = 19.0569)
buildkernel:
x buildkernel-before
+ buildkernel-ccache-empty
* buildkernel-ccache-empty-fastdep
% buildkernel-ccache-full
# buildkernel-ccache-full-fastdep
@ buildkernel-fastdep
+-------------------------------------------------------------------------------+
|# @ % * |
|# @ % * x + |
|# @ % * xx ++|
| MA |
| MA|
| A |
| A |
|A |
| A |
+-------------------------------------------------------------------------------+
N Min Max Median Avg Stddev
x 3 571.57 573.94 571.79 572.43333 1.3094401
+ 3 727.97 731.91 728.06 729.31333 2.2492295
Difference at 95.0% confidence
156.88 +/- 4.17129
27.4058% +/- 0.728695%
(Student's t, pooled s = 1.84034)
* 3 527.1 528.29 528.08 527.82333 0.63516402
Difference at 95.0% confidence
-44.61 +/- 2.33254
-7.79305% +/- 0.407478%
(Student's t, pooled s = 1.02909)
% 3 400.4 401.05 400.62 400.69 0.3306055
Difference at 95.0% confidence
-171.743 +/- 2.16453
-30.0023% +/- 0.378128%
(Student's t, pooled s = 0.954969)
# 3 201.94 203.34 202.28 202.52 0.73020545
Difference at 95.0% confidence
-369.913 +/- 2.40293
-64.6212% +/- 0.419774%
(Student's t, pooled s = 1.06015)
@ 3 369.12 370.57 369.3 369.66333 0.79033748
Difference at 95.0% confidence
-202.77 +/- 2.45131
-35.4225% +/- 0.428227%
(Student's t, pooled s = 1.0815)
[1] https://ccache.samba.org/performance.html
[2] http://www.mail-archive.com/ccache@lists.samba.org/msg00576.html
[3] https://reviews.freebsd.org/D3484
[5] https://github.com/jrosdahl/ccache/pull/30
PR: 182944 [4]
MFC after: 3 weeks
Sponsored by: EMC / Isilon Storage Division
Relnotes: yes
2015-11-08 00:50:18 +00:00
|
|
|
NORMAL_S= ${CC:N${CCACHE_BIN}} -c ${ASM_CFLAGS} ${WERROR} ${.IMPSRC}
|
2002-02-20 23:35:56 +00:00
|
|
|
PROFILE_C= ${CC} -c ${CFLAGS} ${WERROR} ${.IMPSRC}
|
2002-10-19 22:24:43 +00:00
|
|
|
NORMAL_C_NOWERROR= ${CC} -c ${CFLAGS} ${PROF} ${.IMPSRC}
|
2001-11-02 21:34:20 +00:00
|
|
|
|
2002-10-19 16:47:13 +00:00
|
|
|
NORMAL_M= ${AWK} -f $S/tools/makeobjops.awk ${.IMPSRC} -c ; \
|
|
|
|
${CC} -c ${CFLAGS} ${WERROR} ${PROF} ${.PREFIX}.c
|
2001-11-02 21:34:20 +00:00
|
|
|
|
2012-08-31 21:10:38 +00:00
|
|
|
NORMAL_FW= uudecode -o ${.TARGET} ${.ALLSRC}
|
2012-08-31 21:27:23 +00:00
|
|
|
NORMAL_FWO= ${LD} -b binary --no-warn-mismatch -d -warn-common -r \
|
2016-09-20 17:07:14 +00:00
|
|
|
-m ${LD_EMULATION} -o ${.TARGET} ${.ALLSRC:M*.fw}
|
2012-08-31 20:54:30 +00:00
|
|
|
|
2018-01-08 20:14:16 +00:00
|
|
|
# for ZSTD in the kernel (include zstd/lib/freebsd before other CFLAGS)
|
2018-01-09 20:53:30 +00:00
|
|
|
ZSTD_C= ${CC} -c -DZSTD_HEAPMODE=1 -I$S/contrib/zstd/lib/freebsd ${CFLAGS} -I$S/contrib/zstd/lib -I$S/contrib/zstd/lib/common ${WERROR} -Wno-inline -Wno-missing-prototypes ${PROF} -U__BMI__ ${.IMPSRC}
|
2019-08-08 16:54:22 +00:00
|
|
|
# https://github.com/facebook/zstd/commit/812e8f2a [zstd 1.4.1]
|
|
|
|
# "Note that [GCC] autovectorization still does not do a good job on the
|
|
|
|
# optimized version, so it's turned off via attribute and flag. I found
|
|
|
|
# that neither attribute nor command-line flag were entirely successful in
|
|
|
|
# turning off vectorization, which is why there were both."
|
|
|
|
.if ${COMPILER_TYPE} == "gcc"
|
|
|
|
ZSTD_DECOMPRESS_BLOCK_FLAGS= -fno-tree-vectorize
|
|
|
|
.endif
|
2018-01-08 20:14:16 +00:00
|
|
|
|
2015-06-10 15:53:39 +00:00
|
|
|
# Common for dtrace / zfs
|
|
|
|
CDDL_CFLAGS= -DFREEBSD_NAMECACHE -nostdinc -I$S/cddl/compat/opensolaris -I$S/cddl/contrib/opensolaris/uts/common -I$S -I$S/cddl/contrib/opensolaris/common ${CFLAGS} -Wno-unknown-pragmas -Wno-missing-prototypes -Wno-undef -Wno-strict-prototypes -Wno-cast-qual -Wno-parentheses -Wno-redundant-decls -Wno-missing-braces -Wno-uninitialized -Wno-unused -Wno-inline -Wno-switch -Wno-pointer-arith -Wno-unknown-pragmas
|
|
|
|
CDDL_CFLAGS+= -include $S/cddl/compat/opensolaris/sys/debug_compat.h
|
|
|
|
CDDL_C= ${CC} -c ${CDDL_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC}
|
|
|
|
|
2012-03-27 21:23:56 +00:00
|
|
|
# Special flags for managing the compat compiles for ZFS
|
MFV r323530,r323533,r323534: 7431 ZFS Channel Programs, and followups
7431 ZFS Channel Programs
illumos/illumos-gate@dfc115332c94a2f62058ac7f2bce7631fbd20b3d
https://github.com/illumos/illumos-gate/commit/dfc115332c94a2f62058ac7f2bce7631fbd20b3d
https://www.illumos.org/issues/7431
ZFS channel programs (ZCP) adds support for performing compound ZFS
administrative actions via Lua scripts in a sandboxed environment (with time
and memory limits).
This initial commit includes both base support for running ZCP scripts, and a
small initial library of API calls which support getting properties and
listing, destroying, and promoting datasets.
Testing: in addition to the included unit tests, channel programs have been in
use at Delphix for several months for batch destroying filesystems. The
dsl_destroy_snaps_nvl() call has also been replaced with
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: John Kennedy <john.kennedy@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Approved by: Garrett D'Amore <garrett@damore.org>
Author: Chris Williamson <chris.williamson@delphix.com>
8552 ZFS LUA code uses floating point math
illumos/illumos-gate@916c8d881190bd2c3ca20d9fca919aecff504435
https://github.com/illumos/illumos-gate/commit/916c8d881190bd2c3ca20d9fca919aecff504435
https://www.illumos.org/issues/8552
In the LUA interpreter used by "zfs program", the lua format() function
accidentally includes support for '%f' and friends, which can cause compilation
problems when building on platforms that don't support floating-point math in
the kernel (e.g. sparc). Support for '%f' friends (%f %e %E %g %G) should be
removed, since there's no way to supply a floating-point value anyway (all
numbers in ZFS LUA are int64_t's).
Reviewed by: Yuri Pankov <yuripv@gmx.com>
Reviewed by: Igor Kozhukhov <igor@dilos.org>
Approved by: Dan McDonald <danmcd@joyent.com>
Author: Matthew Ahrens <mahrens@delphix.com>
8590 memory leak in dsl_destroy_snapshots_nvl()
illumos/illumos-gate@e6ab4525d156c82445c116ecf6b2b874d5e9009d
https://github.com/illumos/illumos-gate/commit/e6ab4525d156c82445c116ecf6b2b874d5e9009d
https://www.illumos.org/issues/8590
In dsl_destroy_snapshots_nvl(), "snaps_normalized" is not freed after it is
added to "arg".
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Steve Gonczi <steve.gonczi@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Dan McDonald <danmcd@joyent.com>
Author: Matthew Ahrens <mahrens@delphix.com>
FreeBSD notes:
- zfs-program.8 manual page is taken almost as is from the vendor repository,
no FreeBSD-ification done
- fixed multiple instances of NULL being used where an integer is expected
- replaced ETIME and ECHRNG with ETIMEDOUT and EDOM respectively
This commit adds a modified version of Lua 5.2.4 under
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lua, mirroring the
upstream. See README.zfs in that directory for the description of Lua
customizations.
See zfs-program.8 on how to use the new feature.
MFC after: 5 weeks
Relnotes: yes
Differential Revision: https://reviews.freebsd.org/D12528
2017-10-01 16:11:07 +00:00
|
|
|
ZFS_CFLAGS= -DBUILDING_ZFS -I$S/cddl/contrib/opensolaris/uts/common/fs/zfs
|
|
|
|
ZFS_CFLAGS+= -I$S/cddl/contrib/opensolaris/uts/common/fs/zfs/lua
|
|
|
|
ZFS_CFLAGS+= -I$S/cddl/contrib/opensolaris/uts/common/zmod
|
2019-11-02 20:46:45 +00:00
|
|
|
ZFS_CFLAGS+= -I$S/cddl/contrib/opensolaris/common/lz4
|
MFV r323530,r323533,r323534: 7431 ZFS Channel Programs, and followups
7431 ZFS Channel Programs
illumos/illumos-gate@dfc115332c94a2f62058ac7f2bce7631fbd20b3d
https://github.com/illumos/illumos-gate/commit/dfc115332c94a2f62058ac7f2bce7631fbd20b3d
https://www.illumos.org/issues/7431
ZFS channel programs (ZCP) adds support for performing compound ZFS
administrative actions via Lua scripts in a sandboxed environment (with time
and memory limits).
This initial commit includes both base support for running ZCP scripts, and a
small initial library of API calls which support getting properties and
listing, destroying, and promoting datasets.
Testing: in addition to the included unit tests, channel programs have been in
use at Delphix for several months for batch destroying filesystems. The
dsl_destroy_snaps_nvl() call has also been replaced with
Reviewed by: Matthew Ahrens <mahrens@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: John Kennedy <john.kennedy@delphix.com>
Reviewed by: Dan Kimmel <dan.kimmel@delphix.com>
Approved by: Garrett D'Amore <garrett@damore.org>
Author: Chris Williamson <chris.williamson@delphix.com>
8552 ZFS LUA code uses floating point math
illumos/illumos-gate@916c8d881190bd2c3ca20d9fca919aecff504435
https://github.com/illumos/illumos-gate/commit/916c8d881190bd2c3ca20d9fca919aecff504435
https://www.illumos.org/issues/8552
In the LUA interpreter used by "zfs program", the lua format() function
accidentally includes support for '%f' and friends, which can cause compilation
problems when building on platforms that don't support floating-point math in
the kernel (e.g. sparc). Support for '%f' friends (%f %e %E %g %G) should be
removed, since there's no way to supply a floating-point value anyway (all
numbers in ZFS LUA are int64_t's).
Reviewed by: Yuri Pankov <yuripv@gmx.com>
Reviewed by: Igor Kozhukhov <igor@dilos.org>
Approved by: Dan McDonald <danmcd@joyent.com>
Author: Matthew Ahrens <mahrens@delphix.com>
8590 memory leak in dsl_destroy_snapshots_nvl()
illumos/illumos-gate@e6ab4525d156c82445c116ecf6b2b874d5e9009d
https://github.com/illumos/illumos-gate/commit/e6ab4525d156c82445c116ecf6b2b874d5e9009d
https://www.illumos.org/issues/8590
In dsl_destroy_snapshots_nvl(), "snaps_normalized" is not freed after it is
added to "arg".
Reviewed by: Pavel Zakharov <pavel.zakharov@delphix.com>
Reviewed by: Steve Gonczi <steve.gonczi@delphix.com>
Reviewed by: George Wilson <george.wilson@delphix.com>
Approved by: Dan McDonald <danmcd@joyent.com>
Author: Matthew Ahrens <mahrens@delphix.com>
FreeBSD notes:
- zfs-program.8 manual page is taken almost as is from the vendor repository,
no FreeBSD-ification done
- fixed multiple instances of NULL being used where an integer is expected
- replaced ETIME and ECHRNG with ETIMEDOUT and EDOM respectively
This commit adds a modified version of Lua 5.2.4 under
sys/cddl/contrib/opensolaris/uts/common/fs/zfs/lua, mirroring the
upstream. See README.zfs in that directory for the description of Lua
customizations.
See zfs-program.8 on how to use the new feature.
MFC after: 5 weeks
Relnotes: yes
Differential Revision: https://reviews.freebsd.org/D12528
2017-10-01 16:11:07 +00:00
|
|
|
ZFS_CFLAGS+= -I$S/cddl/contrib/opensolaris/common/zfs
|
|
|
|
ZFS_CFLAGS+= ${CDDL_CFLAGS}
|
2012-03-27 21:23:56 +00:00
|
|
|
ZFS_ASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${ZFS_CFLAGS}
|
|
|
|
ZFS_C= ${CC} -c ${ZFS_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC}
|
|
|
|
ZFS_S= ${CC} -c ${ZFS_ASM_CFLAGS} ${WERROR} ${.IMPSRC}
|
|
|
|
|
2015-06-10 15:53:39 +00:00
|
|
|
# Special flags for managing the compat compiles for DTrace
|
|
|
|
DTRACE_CFLAGS= -DBUILDING_DTRACE ${CDDL_CFLAGS} -I$S/cddl/dev/dtrace -I$S/cddl/dev/dtrace/${MACHINE_CPUARCH}
|
|
|
|
.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
|
|
|
|
DTRACE_CFLAGS+= -I$S/cddl/contrib/opensolaris/uts/intel -I$S/cddl/dev/dtrace/x86
|
|
|
|
.endif
|
|
|
|
DTRACE_CFLAGS+= -I$S/cddl/contrib/opensolaris/common/util -I$S -DDIS_MEM -DSMP
|
|
|
|
DTRACE_ASM_CFLAGS= -x assembler-with-cpp -DLOCORE ${DTRACE_CFLAGS}
|
2015-11-16 22:37:28 +00:00
|
|
|
DTRACE_C= ${CC} -c ${DTRACE_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC}
|
|
|
|
DTRACE_S= ${CC} -c ${DTRACE_ASM_CFLAGS} ${WERROR} ${.IMPSRC}
|
2015-06-10 15:53:39 +00:00
|
|
|
|
|
|
|
# Special flags for managing the compat compiles for DTrace/FBT
|
|
|
|
FBT_CFLAGS= -DBUILDING_DTRACE -nostdinc -I$S/cddl/dev/fbt/${MACHINE_CPUARCH} -I$S/cddl/dev/fbt -I$S/cddl/compat/opensolaris -I$S/cddl/contrib/opensolaris/uts/common -I$S ${CDDL_CFLAGS}
|
|
|
|
.if ${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386"
|
|
|
|
FBT_CFLAGS+= -I$S/cddl/dev/fbt/x86
|
|
|
|
.endif
|
2015-11-16 22:37:28 +00:00
|
|
|
FBT_C= ${CC} -c ${FBT_CFLAGS} ${WERROR} ${PROF} ${.IMPSRC}
|
2015-06-10 15:53:39 +00:00
|
|
|
|
2011-11-30 18:11:49 +00:00
|
|
|
.if ${MK_CTF} != "no"
|
2011-11-29 18:52:02 +00:00
|
|
|
NORMAL_CTFCONVERT= ${CTFCONVERT} ${CTFFLAGS} ${.TARGET}
|
2011-11-30 18:11:49 +00:00
|
|
|
.elif ${MAKE_VERSION} >= 5201111300
|
|
|
|
NORMAL_CTFCONVERT=
|
2011-11-29 08:38:47 +00:00
|
|
|
.else
|
2011-11-30 18:11:49 +00:00
|
|
|
NORMAL_CTFCONVERT= @:
|
2011-11-29 08:38:47 +00:00
|
|
|
.endif
|
2008-05-23 03:53:49 +00:00
|
|
|
|
2015-10-29 08:28:39 +00:00
|
|
|
# Linux Kernel Programming Interface C-flags
|
|
|
|
LINUXKPI_INCLUDES= -I$S/compat/linuxkpi/common/include
|
|
|
|
LINUXKPI_C= ${NORMAL_C} ${LINUXKPI_INCLUDES}
|
|
|
|
|
2011-03-21 09:40:01 +00:00
|
|
|
# Infiniband C flags. Correct include paths and omit errors that linux
|
|
|
|
# does not honor.
|
2017-09-16 16:17:08 +00:00
|
|
|
OFEDINCLUDES= -I$S/ofed/include -I$S/ofed/include/uapi ${LINUXKPI_INCLUDES}
|
2015-02-17 19:27:14 +00:00
|
|
|
OFEDNOERR= -Wno-cast-qual -Wno-pointer-arith
|
2017-09-16 16:17:08 +00:00
|
|
|
OFEDCFLAGS= ${CFLAGS:N-I*} -DCONFIG_INFINIBAND_USER_MEM \
|
|
|
|
${OFEDINCLUDES} ${CFLAGS:M-I*} ${OFEDNOERR}
|
2011-03-21 09:40:01 +00:00
|
|
|
OFED_C_NOIMP= ${CC} -c -o ${.TARGET} ${OFEDCFLAGS} ${WERROR} ${PROF}
|
|
|
|
OFED_C= ${OFED_C_NOIMP} ${.IMPSRC}
|
|
|
|
|
2019-05-08 10:49:05 +00:00
|
|
|
# mlxfw C flags.
|
|
|
|
MLXFW_C= ${OFED_C_NOIMP} \
|
|
|
|
-I${SRCTOP}/sys/contrib/xz-embedded/freebsd \
|
|
|
|
-I${SRCTOP}/sys/contrib/xz-embedded/linux/lib/xz \
|
|
|
|
${.IMPSRC}
|
|
|
|
|
2018-07-03 21:02:21 +00:00
|
|
|
GEN_CFILES= $S/$M/$M/genassym.c ${MFILES:T:S/.m$/.c/}
|
2005-03-29 11:23:25 +00:00
|
|
|
SYSTEM_CFILES= config.c env.c hints.c vnode_if.c
|
2001-11-02 21:34:20 +00:00
|
|
|
SYSTEM_DEP= Makefile ${SYSTEM_OBJS}
|
2003-02-28 21:59:14 +00:00
|
|
|
SYSTEM_OBJS= locore.o ${MDOBJS} ${OBJS}
|
|
|
|
SYSTEM_OBJS+= ${SYSTEM_CFILES:.c=.o}
|
2016-09-24 15:11:27 +00:00
|
|
|
SYSTEM_OBJS+= hack.pico
|
Fix MFS builds when both MD_ROOT_SIZE and MFS_IMAGE are specified
MD_ROOT_SIZE and embed_mfs.sh were basically retired as part of
https://reviews.freebsd.org/D2903 .
However, when building a kernel with 'options MD_ROOT_SIZE' specified, this
results in a non-working MFS, as within sys/dev/md/md.c we fall within the
wrong # ifdef.
This patch implements the following:
* Allow kernels to be built without the MD_ROOT_SIZE option, which results
in a kernel built as per D2903.
* Allow kernels to be built with the MD_ROOT_SIZE option, which results
in a kernel built similarly to the pre-D2903 way, with the following
differences:
* The MFS is now put in a separate section within the kernel (oldmfs,
so it differs from the mfs section introduced by D2903).
* embed_mfs.sh is changed, so it looks up the oldmfs section within the
kernel, gets its size and offset, sees if the MFS will fit within the
allocated oldmfs section and only if all is well does a dd of the MFS
image into the kernel.
Submitted by: Stanislav Galabov <sgalabov@gmail.com>
Reviewed by: brooks, imp
Differential Revision: https://reviews.freebsd.org/D5093
2016-02-02 07:02:51 +00:00
|
|
|
|
|
|
|
MD_ROOT_SIZE_CONFIGURED!= grep MD_ROOT_SIZE opt_md.h || true ; echo
|
2015-08-13 15:16:34 +00:00
|
|
|
.if ${MFS_IMAGE:Uno} != "no"
|
Fix MFS builds when both MD_ROOT_SIZE and MFS_IMAGE are specified
MD_ROOT_SIZE and embed_mfs.sh were basically retired as part of
https://reviews.freebsd.org/D2903 .
However, when building a kernel with 'options MD_ROOT_SIZE' specified, this
results in a non-working MFS, as within sys/dev/md/md.c we fall within the
wrong # ifdef.
This patch implements the following:
* Allow kernels to be built without the MD_ROOT_SIZE option, which results
in a kernel built as per D2903.
* Allow kernels to be built with the MD_ROOT_SIZE option, which results
in a kernel built similarly to the pre-D2903 way, with the following
differences:
* The MFS is now put in a separate section within the kernel (oldmfs,
so it differs from the mfs section introduced by D2903).
* embed_mfs.sh is changed, so it looks up the oldmfs section within the
kernel, gets its size and offset, sees if the MFS will fit within the
allocated oldmfs section and only if all is well does a dd of the MFS
image into the kernel.
Submitted by: Stanislav Galabov <sgalabov@gmail.com>
Reviewed by: brooks, imp
Differential Revision: https://reviews.freebsd.org/D5093
2016-02-02 07:02:51 +00:00
|
|
|
.if empty(MD_ROOT_SIZE_CONFIGURED)
|
2015-08-13 15:16:34 +00:00
|
|
|
SYSTEM_OBJS+= embedfs_${MFS_IMAGE:T:R}.o
|
|
|
|
.endif
|
Fix MFS builds when both MD_ROOT_SIZE and MFS_IMAGE are specified
MD_ROOT_SIZE and embed_mfs.sh were basically retired as part of
https://reviews.freebsd.org/D2903 .
However, when building a kernel with 'options MD_ROOT_SIZE' specified, this
results in a non-working MFS, as within sys/dev/md/md.c we fall within the
wrong # ifdef.
This patch implements the following:
* Allow kernels to be built without the MD_ROOT_SIZE option, which results
in a kernel built as per D2903.
* Allow kernels to be built with the MD_ROOT_SIZE option, which results
in a kernel built similarly to the pre-D2903 way, with the following
differences:
* The MFS is now put in a separate section within the kernel (oldmfs,
so it differs from the mfs section introduced by D2903).
* embed_mfs.sh is changed, so it looks up the oldmfs section within the
kernel, gets its size and offset, sees if the MFS will fit within the
allocated oldmfs section and only if all is well does a dd of the MFS
image into the kernel.
Submitted by: Stanislav Galabov <sgalabov@gmail.com>
Reviewed by: brooks, imp
Differential Revision: https://reviews.freebsd.org/D5093
2016-02-02 07:02:51 +00:00
|
|
|
.endif
|
2019-12-25 22:33:47 +00:00
|
|
|
SYSTEM_LD_BASECMD= \
|
|
|
|
${LD} -m ${LD_EMULATION} -Bdynamic -T ${LDSCRIPT} ${_LDFLAGS} \
|
2017-04-05 03:05:04 +00:00
|
|
|
--no-warn-mismatch --warn-common --export-dynamic \
|
2019-12-25 22:33:47 +00:00
|
|
|
--dynamic-linker /red/herring -X
|
|
|
|
SYSTEM_LD= @${SYSTEM_LD_BASECMD} -o ${.TARGET} ${SYSTEM_OBJS} vers.o
|
2001-11-02 21:34:20 +00:00
|
|
|
SYSTEM_LD_TAIL= @${OBJCOPY} --strip-symbol gcc2_compiled. ${.TARGET} ; \
|
2003-12-29 11:34:33 +00:00
|
|
|
${SIZE} ${.TARGET} ; chmod 755 ${.TARGET}
|
2008-02-02 07:52:24 +00:00
|
|
|
SYSTEM_DEP+= ${LDSCRIPT}
|
2001-11-02 21:34:20 +00:00
|
|
|
|
2015-07-04 05:43:45 +00:00
|
|
|
# Calculate path for .m files early, if needed.
|
2018-03-10 02:09:36 +00:00
|
|
|
.if !defined(NO_MODULES) && !defined(__MPATH) && !make(install) && \
|
|
|
|
(empty(.MAKEFLAGS:M-V) || defined(NO_SKIP_MPATH))
|
2015-07-04 05:43:45 +00:00
|
|
|
__MPATH!=find ${S:tA}/ -name \*_if.m
|
|
|
|
.endif
|
|
|
|
|
2002-01-05 06:21:06 +00:00
|
|
|
# MKMODULESENV is set here so that port makefiles can augment
|
|
|
|
# them.
|
|
|
|
|
2011-04-30 17:51:39 +00:00
|
|
|
MKMODULESENV+= MAKEOBJDIRPREFIX=${.OBJDIR}/modules KMODDIR=${KODIR}
|
2010-07-15 23:32:53 +00:00
|
|
|
MKMODULESENV+= MACHINE_CPUARCH=${MACHINE_CPUARCH}
|
2014-02-04 05:35:04 +00:00
|
|
|
MKMODULESENV+= MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH}
|
2015-02-10 15:15:08 +00:00
|
|
|
MKMODULESENV+= MODULES_EXTRA="${MODULES_EXTRA}" WITHOUT_MODULES="${WITHOUT_MODULES}"
|
2017-07-19 22:06:35 +00:00
|
|
|
MKMODULESENV+= ARCH_FLAGS="${ARCH_FLAGS}"
|
2002-02-17 21:00:20 +00:00
|
|
|
.if (${KERN_IDENT} == LINT)
|
|
|
|
MKMODULESENV+= ALL_MODULES=LINT
|
|
|
|
.endif
|
2002-01-05 06:21:06 +00:00
|
|
|
.if defined(MODULES_OVERRIDE)
|
|
|
|
MKMODULESENV+= MODULES_OVERRIDE="${MODULES_OVERRIDE}"
|
|
|
|
.endif
|
|
|
|
.if defined(DEBUG)
|
2004-02-13 10:40:54 +00:00
|
|
|
MKMODULESENV+= DEBUG_FLAGS="${DEBUG}"
|
2002-01-05 06:21:06 +00:00
|
|
|
.endif
|
2016-07-22 17:31:14 +00:00
|
|
|
.if !defined(NO_MODULES)
|
2015-12-01 21:19:16 +00:00
|
|
|
MKMODULESENV+= __MPATH="${__MPATH}"
|
2016-07-22 17:31:14 +00:00
|
|
|
.endif
|
2012-09-12 14:19:40 +00:00
|
|
|
|
2018-06-15 16:32:18 +00:00
|
|
|
# Architecture and output format arguments for objcopy to convert image to
|
2015-08-13 15:16:34 +00:00
|
|
|
# object file
|
|
|
|
|
Fix MFS builds when both MD_ROOT_SIZE and MFS_IMAGE are specified
MD_ROOT_SIZE and embed_mfs.sh were basically retired as part of
https://reviews.freebsd.org/D2903 .
However, when building a kernel with 'options MD_ROOT_SIZE' specified, this
results in a non-working MFS, as within sys/dev/md/md.c we fall within the
wrong # ifdef.
This patch implements the following:
* Allow kernels to be built without the MD_ROOT_SIZE option, which results
in a kernel built as per D2903.
* Allow kernels to be built with the MD_ROOT_SIZE option, which results
in a kernel built similarly to the pre-D2903 way, with the following
differences:
* The MFS is now put in a separate section within the kernel (oldmfs,
so it differs from the mfs section introduced by D2903).
* embed_mfs.sh is changed, so it looks up the oldmfs section within the
kernel, gets its size and offset, sees if the MFS will fit within the
allocated oldmfs section and only if all is well does a dd of the MFS
image into the kernel.
Submitted by: Stanislav Galabov <sgalabov@gmail.com>
Reviewed by: brooks, imp
Differential Revision: https://reviews.freebsd.org/D5093
2016-02-02 07:02:51 +00:00
|
|
|
.if ${MFS_IMAGE:Uno} != "no"
|
|
|
|
.if empty(MD_ROOT_SIZE_CONFIGURED)
|
2015-08-13 15:16:34 +00:00
|
|
|
.if !defined(EMBEDFS_FORMAT.${MACHINE_ARCH})
|
|
|
|
EMBEDFS_FORMAT.${MACHINE_ARCH}!= awk -F'"' '/OUTPUT_FORMAT/ {print $$2}' ${LDSCRIPT}
|
|
|
|
.if empty(EMBEDFS_FORMAT.${MACHINE_ARCH})
|
|
|
|
.undef EMBEDFS_FORMAT.${MACHINE_ARCH}
|
|
|
|
.endif
|
|
|
|
.endif
|
|
|
|
|
|
|
|
.if !defined(EMBEDFS_ARCH.${MACHINE_ARCH})
|
|
|
|
EMBEDFS_ARCH.${MACHINE_ARCH}!= sed -n '/OUTPUT_ARCH/s/.*(\(.*\)).*/\1/p' ${LDSCRIPT}
|
|
|
|
.if empty(EMBEDFS_ARCH.${MACHINE_ARCH})
|
|
|
|
.undef EMBEDFS_ARCH.${MACHINE_ARCH}
|
|
|
|
.endif
|
|
|
|
.endif
|
|
|
|
|
|
|
|
EMBEDFS_FORMAT.arm?= elf32-littlearm
|
|
|
|
EMBEDFS_FORMAT.armv6?= elf32-littlearm
|
2017-10-05 23:01:33 +00:00
|
|
|
EMBEDFS_FORMAT.armv7?= elf32-littlearm
|
2017-07-20 18:22:49 +00:00
|
|
|
EMBEDFS_FORMAT.aarch64?= elf64-littleaarch64
|
2015-08-13 15:16:34 +00:00
|
|
|
EMBEDFS_FORMAT.mips?= elf32-tradbigmips
|
|
|
|
EMBEDFS_FORMAT.mipsel?= elf32-tradlittlemips
|
|
|
|
EMBEDFS_FORMAT.mips64?= elf64-tradbigmips
|
|
|
|
EMBEDFS_FORMAT.mips64el?= elf64-tradlittlemips
|
2019-10-02 21:49:39 +00:00
|
|
|
EMBEDFS_FORMAT.riscv64?= elf64-littleriscv
|
2015-08-13 15:16:34 +00:00
|
|
|
.endif
|
Fix MFS builds when both MD_ROOT_SIZE and MFS_IMAGE are specified
MD_ROOT_SIZE and embed_mfs.sh were basically retired as part of
https://reviews.freebsd.org/D2903 .
However, when building a kernel with 'options MD_ROOT_SIZE' specified, this
results in a non-working MFS, as within sys/dev/md/md.c we fall within the
wrong # ifdef.
This patch implements the following:
* Allow kernels to be built without the MD_ROOT_SIZE option, which results
in a kernel built as per D2903.
* Allow kernels to be built with the MD_ROOT_SIZE option, which results
in a kernel built similarly to the pre-D2903 way, with the following
differences:
* The MFS is now put in a separate section within the kernel (oldmfs,
so it differs from the mfs section introduced by D2903).
* embed_mfs.sh is changed, so it looks up the oldmfs section within the
kernel, gets its size and offset, sees if the MFS will fit within the
allocated oldmfs section and only if all is well does a dd of the MFS
image into the kernel.
Submitted by: Stanislav Galabov <sgalabov@gmail.com>
Reviewed by: brooks, imp
Differential Revision: https://reviews.freebsd.org/D5093
2016-02-02 07:02:51 +00:00
|
|
|
.endif
|
2015-08-13 15:16:34 +00:00
|
|
|
|
2013-11-29 20:19:00 +00:00
|
|
|
# Detect kernel config options that force stack frames to be turned on.
|
2012-09-12 14:19:40 +00:00
|
|
|
DDB_ENABLED!= grep DDB opt_ddb.h || true ; echo
|
|
|
|
DTR_ENABLED!= grep KDTRACE_FRAME opt_kdtrace.h || true ; echo
|
|
|
|
HWPMC_ENABLED!= grep HWPMC opt_hwpmc_hooks.h || true ; echo
|