Index: sys/amd64/amd64/machdep.c =================================================================== --- sys/amd64/amd64/machdep.c +++ sys/amd64/amd64/machdep.c @@ -2741,17 +2741,27 @@ void *memcpy_erms(void * _Nonnull dst, const void * _Nonnull src, size_t len); -#ifdef KCSAN /* * These fail to build as ifuncs when used with KCSAN. + * AUTO_VAR_INIT calls memset before the ifunc resolver is called. */ +#if defined(KCSAN) || defined(AUTO_VAR_INIT) void * memset(void *buf, int c, size_t len) { return (memset_std(buf, c, len)); } +#else +DEFINE_IFUNC(, void *, memset, (void *, int, size_t)) +{ + + return ((cpu_stdext_feature & CPUID_STDEXT_ERMS) != 0 ? + memset_erms : memset_std); +} +#endif +#if defined(KCSAN) void * memmove(void * _Nonnull dst, const void * _Nonnull src, size_t len) { @@ -2766,13 +2776,6 @@ return (memcpy_std(dst, src, len)); } #else -DEFINE_IFUNC(, void *, memset, (void *, int, size_t)) -{ - - return ((cpu_stdext_feature & CPUID_STDEXT_ERMS) != 0 ? - memset_erms : memset_std); -} - DEFINE_IFUNC(, void *, memmove, (void * _Nonnull, const void * _Nonnull, size_t)) { Index: sys/amd64/conf/GENERIC =================================================================== --- sys/amd64/conf/GENERIC +++ sys/amd64/conf/GENERIC @@ -84,6 +84,7 @@ options RACCT # Resource accounting framework options RACCT_DEFAULT_TO_DISABLED # Set kern.racct.enable=0 by default options RCTL # Resource limits +#options AUTO_VAR_INIT # Init the stack on function entry # Debugging support. Always need this: options KDB # Enable kernel debugger support. Index: sys/arm64/conf/GENERIC =================================================================== --- sys/arm64/conf/GENERIC +++ sys/arm64/conf/GENERIC @@ -81,6 +81,7 @@ options RCTL # Resource limits options SMP options INTRNG +options AUTO_VAR_INIT # Init the stack on function entry # Debugging support. Always need this: options KDB # Enable kernel debugger support. Index: sys/conf/kern.pre.mk =================================================================== --- sys/conf/kern.pre.mk +++ sys/conf/kern.pre.mk @@ -146,6 +146,17 @@ .endif .endif +AUTO_VAR_INIT_ENABLED!= grep AUTO_VAR_INIT opt_global.h || true ; echo +.if !empty(AUTO_VAR_INIT_ENABLED) +.if ${COMPILER_TYPE} == "clang" +CFLAGS+= -ftrivial-auto-var-init=pattern +MOD_CFLAGS+= -ftrivial-auto-var-init=pattern +.else +.warning AUTO_VAR_INIT enabled, but no compiler support +CFLAGS+= -DAUTO_VAR_INIT_MISSING +.endif +.endif + CFLAGS+= ${GCOV_CFLAGS} # Put configuration-specific C flags last (except for ${PROF}) so that they Index: sys/conf/kmod.mk =================================================================== --- sys/conf/kmod.mk +++ sys/conf/kmod.mk @@ -392,6 +392,9 @@ # Add the gcov flags CFLAGS+= ${GCOV_CFLAGS} +# Add flags based on config options +CFLAGS+= ${MOD_CFLAGS} + # Respect configuration-specific C flags. CFLAGS+= ${ARCH_FLAGS} ${CONF_CFLAGS} Index: sys/conf/options =================================================================== --- sys/conf/options +++ sys/conf/options @@ -74,6 +74,7 @@ ALTERA_SDCARD_FAST_SIM opt_altera_sdcard.h ATSE_CFI_HACK opt_cfi.h AUDIT opt_global.h +AUTO_VAR_INIT opt_global.h BOOTHOWTO opt_global.h BOOTVERBOSE opt_global.h CALLOUT_PROFILING Index: sys/kern/init_main.c =================================================================== --- sys/kern/init_main.c +++ sys/kern/init_main.c @@ -387,6 +387,15 @@ print_caddr_t, diag_warn); #endif +#ifdef AUTO_VAR_INIT_MISSING +static char auto_var_warn[] = + "WARNING: AUTO_VAR_INIT option enable but no compiler support.\n"; +SYSINIT(sudo_var_warn, SI_SUB_COPYRIGHT, SI_ORDER_THIRD + 3, + print_caddr_t, auto_var_warn); +SYSINIT(auto_var_warn2, SI_SUB_LAST, SI_ORDER_THIRD + 3, + print_caddr_t, auto_var_warn); +#endif + static int null_fetch_syscall_args(struct thread *td __unused) {