Date: Tue, 26 May 2020 19:34:05 +0000 (UTC) From: Kyle Evans <kevans@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org Subject: svn commit: r361538 - in stable: 11/stand/common 12/stand/common Message-ID: <202005261934.04QJY5Oh013260@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: kevans Date: Tue May 26 19:34:05 2020 New Revision: 361538 URL: https://svnweb.freebsd.org/changeset/base/361538 Log: loader: fix userboot's ability to detect a guest's interpreter Some time after r338418, I believe with -Os/-Oz -ffunction-sections -fdata-sections, the bootprog_interp variable that held our "$Interpreter:" marker started getting strip from all loaders, with exception to userboot since it used bootprog_interp to determine what flavor of userboot it was. At some point, it had been brought to my attention that this was no longer working and I had worked up some potential solutions to use the variable that involved printing it out. My vague recollection is that this was rejected, and I forgot to explore the alternatives; I cannot find records of this discussion anymore. Fast forward to present day, Andrew reported that it was non-functional and offered (effectively) this patch (sans comment) to stop the compiler from optimizing it out by assigning it to a volatile variable. This removes concerns about user-facing change while retaining the interpreter marker. Furthermore, it could certainly be uglier. Modified: stable/12/stand/common/interp.c Directory Properties: stable/12/ (props changed) Changes in other areas also in this revision: Modified: stable/11/stand/common/interp.c Directory Properties: stable/11/ (props changed) Modified: stable/12/stand/common/interp.c ============================================================================== --- stable/12/stand/common/interp.c Tue May 26 19:22:46 2020 (r361537) +++ stable/12/stand/common/interp.c Tue May 26 19:34:05 2020 (r361538) @@ -45,8 +45,17 @@ __FBSDID("$FreeBSD$"); void interact(void) { - static char input[256]; /* big enough? */ + static char input[256]; /* big enough? */ + const char * volatile interp_identifier; + /* + * Because interp_identifier is volatile, it cannot be optimized out by + * the compiler as it's considered an externally observable event. This + * prevents the compiler from optimizing out our carefully placed + * $Interpreter:4th string that userboot may use to determine that + * we need to switch interpreters. + */ + interp_identifier = bootprog_interp; interp_init(); printf("\n");
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202005261934.04QJY5Oh013260>