1680854946
Right now, userspace (fast) gettimeofday(2) on x86 only works for RDTSC. For older machines, like Core2, where RDTSC is not C2/C3 invariant, and which fall to HPET hardware, this means that the call has both the penalty of the syscall and of the uncached hw behind the QPI or PCIe connection to the sought bridge. Nothing can me done against the access latency, but the syscall overhead can be removed. System already provides mappable /dev/hpetX devices, which gives straight access to the HPET registers page. Add yet another algorithm to the x86 'vdso' timehands. Libc is updated to handle both RDTSC and HPET. For HPET, the index of the hpet device to mmap is passed from kernel to userspace, index might be changed and libc invalidates its mapping as needed. Remove cpu_fill_vdso_timehands() KPI, instead require that timecounters which can be used from userspace, to provide tc_fill_vdso_timehands{,32}() methods. Merge i386 and amd64 libc/<arch>/sys/__vdso_gettc.c into one source file in the new libc/x86/sys location. __vdso_gettc() internal interface is changed to move timecounter algorithm detection into the MD code. Measurements show that RDTSC even with the syscall overhead is faster than userspace HPET access. But still, userspace HPET is three-four times faster than syscall HPET on several Core2 and SandyBridge machines. Tested by: Howard Su <howard0su@gmail.com> Sponsored by: The FreeBSD Foundation MFC after: 1 month Differential revision: https://reviews.freebsd.org/D7473
205 lines
6.2 KiB
Makefile
205 lines
6.2 KiB
Makefile
# @(#)Makefile 8.2 (Berkeley) 2/3/94
|
|
# $FreeBSD$
|
|
|
|
PACKAGE= clibs
|
|
SHLIBDIR?= /lib
|
|
|
|
.include <src.opts.mk>
|
|
|
|
# Force building of libc_pic.a
|
|
MK_TOOLCHAIN= yes
|
|
|
|
LIBC_SRCTOP?= ${.CURDIR}
|
|
|
|
# Pick the current architecture directory for libc. In general, this is
|
|
# named MACHINE_CPUARCH, but some ABIs are different enough to require
|
|
# their own libc, so allow a directory named MACHINE_ARCH to override this.
|
|
|
|
.if exists(${LIBC_SRCTOP}/${MACHINE_ARCH})
|
|
LIBC_ARCH=${MACHINE_ARCH}
|
|
.else
|
|
LIBC_ARCH=${MACHINE_CPUARCH}
|
|
.endif
|
|
|
|
# All library objects contain FreeBSD revision strings by default; they may be
|
|
# excluded as a space-saving measure. To produce a library that does
|
|
# not contain these strings, add -DSTRIP_FBSDID (see <sys/cdefs.h>) to CFLAGS
|
|
# below. Note: there are no IDs for syscall stubs whose sources are generated.
|
|
# To include legacy CSRG sccsid strings, add -DLIBC_SCCS and -DSYSLIBC_SCCS
|
|
# to CFLAGS below. -DSYSLIBC_SCCS affects just the system call stubs.
|
|
LIB=c
|
|
SHLIB_MAJOR= 7
|
|
SHLIB_LDSCRIPT=libc.ldscript
|
|
SHLIB_LDSCRIPT_LINKS=libxnet.so
|
|
WARNS?= 2
|
|
CFLAGS+=-I${LIBC_SRCTOP}/include -I${LIBC_SRCTOP}/../../include
|
|
CFLAGS+=-I${LIBC_SRCTOP}/${LIBC_ARCH}
|
|
.if ${MK_NLS} != "no"
|
|
CFLAGS+=-DNLS
|
|
.endif
|
|
CLEANFILES+=tags
|
|
INSTALL_PIC_ARCHIVE=
|
|
PRECIOUSLIB=
|
|
|
|
.ifndef NO_THREAD_STACK_UNWIND
|
|
CANCELPOINTS_CFLAGS=-fexceptions
|
|
CFLAGS+=${CANCELPOINTS_CFLAGS}
|
|
.endif
|
|
|
|
#
|
|
# Link with static libcompiler_rt.a.
|
|
#
|
|
LDFLAGS+= -nodefaultlibs
|
|
LIBADD+= compiler_rt
|
|
|
|
.if ${MK_SSP} != "no"
|
|
LIBADD+= ssp_nonshared
|
|
.endif
|
|
|
|
# Extras that live in either libc.a or libc_nonshared.a
|
|
LIBC_NONSHARED_SRCS=
|
|
|
|
# Define (empty) variables so that make doesn't give substitution
|
|
# errors if the included makefiles don't change these:
|
|
MDSRCS=
|
|
MISRCS=
|
|
MDASM=
|
|
MIASM=
|
|
NOASM=
|
|
|
|
.include "${LIBC_SRCTOP}/${LIBC_ARCH}/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/db/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/compat-43/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/gdtoa/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/gen/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/gmon/Makefile.inc"
|
|
.if ${MK_ICONV} != "no"
|
|
.include "${LIBC_SRCTOP}/iconv/Makefile.inc"
|
|
.endif
|
|
.include "${LIBC_SRCTOP}/inet/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/isc/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/locale/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/md/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/nameser/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/net/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/nls/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/posix1e/Makefile.inc"
|
|
.if ${LIBC_ARCH} != "aarch64" && \
|
|
${LIBC_ARCH} != "amd64" && \
|
|
${LIBC_ARCH} != "powerpc64" && \
|
|
${LIBC_ARCH} != "riscv" && \
|
|
${LIBC_ARCH} != "sparc64" && \
|
|
${MACHINE_ARCH:Mmipsn32*} == "" && \
|
|
${MACHINE_ARCH:Mmips64*} == ""
|
|
.include "${LIBC_SRCTOP}/quad/Makefile.inc"
|
|
.endif
|
|
.include "${LIBC_SRCTOP}/regex/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/resolv/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/stdio/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/stdlib/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/stdlib/jemalloc/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/stdtime/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/string/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/sys/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/secure/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/rpc/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/uuid/Makefile.inc"
|
|
.include "${LIBC_SRCTOP}/xdr/Makefile.inc"
|
|
.if (${LIBC_ARCH} == "arm" && \
|
|
(${MACHINE_ARCH:Marmv6*} == "" || (defined(CPUTYPE) && ${CPUTYPE:M*soft*}))) || \
|
|
${LIBC_ARCH} == "mips"
|
|
.include "${LIBC_SRCTOP}/softfloat/Makefile.inc"
|
|
.endif
|
|
.if ${LIBC_ARCH} == "i386" || ${LIBC_ARCH} == "amd64"
|
|
.include "${LIBC_SRCTOP}/x86/sys/Makefile.inc"
|
|
.endif
|
|
.if ${MK_NIS} != "no"
|
|
CFLAGS+= -DYP
|
|
.include "${LIBC_SRCTOP}/yp/Makefile.inc"
|
|
.endif
|
|
.include "${LIBC_SRCTOP}/capability/Makefile.inc"
|
|
.if ${MK_HESIOD} != "no"
|
|
CFLAGS+= -DHESIOD
|
|
.endif
|
|
.if ${MK_FP_LIBC} == "no"
|
|
CFLAGS+= -DNO_FLOATING_POINT
|
|
.endif
|
|
.if ${MK_NS_CACHING} != "no"
|
|
CFLAGS+= -DNS_CACHING
|
|
.endif
|
|
.if defined(_FREEFALL_CONFIG)
|
|
CFLAGS+=-D_FREEFALL_CONFIG
|
|
.endif
|
|
|
|
STATICOBJS+=${LIBC_NONSHARED_SRCS:S/.c$/.o/}
|
|
|
|
VERSION_DEF=${LIBC_SRCTOP}/Versions.def
|
|
SYMBOL_MAPS=${SYM_MAPS}
|
|
CFLAGS+= -DSYMBOL_VERSIONING
|
|
|
|
# If there are no machine dependent sources, append all the
|
|
# machine-independent sources:
|
|
.if empty(MDSRCS)
|
|
SRCS+= ${MISRCS}
|
|
.else
|
|
# Append machine-dependent sources, then append machine-independent sources
|
|
# for which there is no machine-dependent variant.
|
|
SRCS+= ${MDSRCS}
|
|
.for _src in ${MISRCS}
|
|
.if ${MDSRCS:R:M${_src:R}} == ""
|
|
SRCS+= ${_src}
|
|
.endif
|
|
.endfor
|
|
.endif
|
|
|
|
KQSRCS= adddi3.c anddi3.c ashldi3.c ashrdi3.c cmpdi2.c divdi3.c iordi3.c \
|
|
lshldi3.c lshrdi3.c moddi3.c muldi3.c negdi2.c notdi2.c qdivrem.c \
|
|
subdi3.c ucmpdi2.c udivdi3.c umoddi3.c xordi3.c
|
|
KSRCS= bcmp.c ffs.c ffsl.c fls.c flsl.c mcount.c strcat.c strchr.c \
|
|
strcmp.c strcpy.c strlen.c strncpy.c strrchr.c
|
|
|
|
libkern: libkern.gen libkern.${LIBC_ARCH}
|
|
|
|
libkern.gen: ${KQSRCS} ${KSRCS}
|
|
${CP} ${LIBC_SRCTOP}/quad/quad.h ${.ALLSRC} ${DESTDIR}/sys/libkern
|
|
|
|
libkern.${LIBC_ARCH}:: ${KMSRCS}
|
|
.if defined(KMSRCS) && !empty(KMSRCS)
|
|
${CP} ${.ALLSRC} ${DESTDIR}/sys/libkern/${LIBC_ARCH}
|
|
.endif
|
|
|
|
.if ${MK_TESTS} != "no"
|
|
SUBDIR+= tests
|
|
.endif
|
|
|
|
.include <bsd.lib.mk>
|
|
|
|
.if !defined(_SKIP_BUILD)
|
|
# We need libutil.h, get it directly to avoid
|
|
# recording a build dependency
|
|
CFLAGS+= -I${SRCTOP}/lib/libutil
|
|
# Same issue with libm
|
|
MSUN_ARCH_SUBDIR != ${MAKE} -B -C ${SRCTOP}/lib/msun -V ARCH_SUBDIR
|
|
# unfortunately msun/src contains both private and public headers
|
|
CFLAGS+= -I${SRCTOP}/lib/msun/${MSUN_ARCH_SUBDIR}
|
|
.if ${MACHINE_CPUARCH} == "i386" || ${MACHINE_CPUARCH} == "amd64"
|
|
CFLAGS+= -I${SRCTOP}/lib/msun/x86
|
|
.endif
|
|
CFLAGS+= -I${SRCTOP}/lib/msun/src
|
|
# and we do not want to record a dependency on msun
|
|
.if ${.MAKE.LEVEL} > 0
|
|
GENDIRDEPS_FILTER+= N${RELDIR:H}/msun
|
|
.endif
|
|
.endif
|
|
|
|
# Disable warnings in contributed sources.
|
|
CWARNFLAGS:= ${.IMPSRC:Ngdtoa_*.c:C/^.+$/${CWARNFLAGS}/:C/^$/-w/}
|
|
# XXX For now, we don't allow libc to be compiled with
|
|
# -fstack-protector-all because it breaks rtld. We may want to make a librtld
|
|
# in the future to circumvent this.
|
|
SSP_CFLAGS:= ${SSP_CFLAGS:S/^-fstack-protector-all$/-fstack-protector/}
|
|
# Disable stack protection for SSP symbols.
|
|
SSP_CFLAGS:= ${.IMPSRC:N*/stack_protector.c:C/^.+$/${SSP_CFLAGS}/}
|
|
# Generate stack unwinding tables for cancellation points
|
|
CANCELPOINTS_CFLAGS:= ${.IMPSRC:Mcancelpoints_*:C/^.+$/${CANCELPOINTS_CFLAGS}/:C/^$//}
|