svn commit: r335997 - in head: sys/kern sys/sys usr.sbin/config
Kyle Evans
kevans at FreeBSD.org
Thu Jul 5 16:28:46 UTC 2018
Author: kevans
Date: Thu Jul 5 16:28:43 2018
New Revision: 335997
URL: https://svnweb.freebsd.org/changeset/base/335997
Log:
Revert r335995 due to accidental changes snuck in
Modified:
head/sys/kern/kern_environment.c
head/sys/kern/subr_hints.c
head/sys/kern/tty.c
head/sys/sys/systm.h
head/usr.sbin/config/config.5
head/usr.sbin/config/config.h
head/usr.sbin/config/config.y
head/usr.sbin/config/mkmakefile.c
Modified: head/sys/kern/kern_environment.c
==============================================================================
--- head/sys/kern/kern_environment.c Thu Jul 5 16:27:34 2018 (r335996)
+++ head/sys/kern/kern_environment.c Thu Jul 5 16:28:43 2018 (r335997)
@@ -57,21 +57,14 @@ __FBSDID("$FreeBSD$");
#include <security/mac/mac_framework.h>
-static char *_getenv_dynamic_locked(const char *name, int *idx);
-static char *_getenv_dynamic(const char *name, int *idx);
-
static MALLOC_DEFINE(M_KENV, "kenv", "kernel environment");
#define KENV_SIZE 512 /* Maximum number of environment strings */
-/* pointer to the config-generated static environment */
+/* pointer to the static environment */
char *kern_envp;
-
-/* pointer to the md-static environment */
-char *md_envp;
-static int md_env_len;
-static int md_env_pos;
-
+static int env_len;
+static int env_pos;
static char *kernenv_next(char *);
/* dynamic environment variables */
@@ -227,9 +220,16 @@ done:
* environment obtained from a boot loader, or to provide an empty buffer into
* which MD code can store an initial environment using kern_setenv() calls.
*
- * kern_envp is set to the static_env generated by config(8). This implements
- * the env keyword described in config(5).
+ * When a copy of an initial environment is passed in, we start by scanning that
+ * env for overrides to the compiled-in envmode and hintmode variables.
*
+ * If the global envmode is 1, the environment is initialized from the global
+ * static_env[], regardless of the arguments passed. This implements the env
+ * keyword described in config(5). In this case env_pos is set to env_len,
+ * causing kern_setenv() to return -1 (if len > 0) or panic (if len == 0) until
+ * the dynamic environment is available. The envmode and static_env variables
+ * are defined in env.c which is generated by config(8).
+ *
* If len is non-zero, the caller is providing an empty buffer. The caller will
* subsequently use kern_setenv() to add up to len bytes of initial environment
* before the dynamic environment is available.
@@ -237,112 +237,68 @@ done:
* If len is zero, the caller is providing a pre-loaded buffer containing
* environment strings. Additional strings cannot be added until the dynamic
* environment is available. The memory pointed to must remain stable at least
- * until sysinit runs init_dynamic_kenv() and preferably until after SI_SUB_KMEM
- * is finished so that subr_hints routines may continue to use it until the
- * environments have been fully merged at the end of the pass. If no initial
- * environment is available from the boot loader, passing a NULL pointer allows
- * the static_env to be installed if it is configured. In this case, any call
- * to kern_setenv() prior to the setup of the dynamic environment will result in
- * a panic.
+ * until sysinit runs init_dynamic_kenv(). If no initial environment is
+ * available from the boot loader, passing a NULL pointer allows the static_env
+ * to be installed if it is configured.
*/
void
init_static_kenv(char *buf, size_t len)
{
- char *eval;
+ char *cp;
+
+ for (cp = buf; cp != NULL && cp[0] != '\0'; cp += strlen(cp) + 1) {
+ if (strcmp(cp, "static_env.disabled=1") == 0)
+ envmode = 0;
+ if (strcmp(cp, "static_hints.disabled=1") == 0)
+ hintmode = 0;
+ }
- md_envp = buf;
- md_env_len = len;
- md_env_pos = 0;
-
- /*
- * static_env and static_hints may both be disabled, but in slightly
- * different ways. For static_env, we just don't setup kern_envp and
- * it's as if a static env wasn't even provided. For static_hints,
- * we effectively zero out the buffer to stop the rest of the kernel
- * from being able to use it.
- *
- * We're intentionally setting this up so that static_hints.disabled may
- * be specified in either the MD env or the static env. This keeps us
- * consistent in our new world view.
- */
- eval = kern_getenv("static_env.disabled");
- if (eval == NULL || strcmp(eval, "1") != 0)
+ if (envmode == 1) {
kern_envp = static_env;
- eval = kern_getenv("static_hints.disabled");
- if (eval != NULL && strcmp(eval, "1") == 0)
- *static_hints = '\0';
+ env_len = len;
+ env_pos = len;
+ } else {
+ kern_envp = buf;
+ env_len = len;
+ env_pos = 0;
+ }
}
+/*
+ * Setup the dynamic kernel environment.
+ */
static void
-init_dynamic_kenv_from(char *init_env, int *curpos)
+init_dynamic_kenv(void *data __unused)
{
- char *cp, *cpnext, *eqpos, *found;
+ char *cp, *cpnext;
size_t len;
int i;
- if (init_env && *init_env != '\0') {
- found = NULL;
- i = *curpos;
- for (cp = init_env; cp != NULL; cp = cpnext) {
+ kenvp = malloc((KENV_SIZE + 1) * sizeof(char *), M_KENV,
+ M_WAITOK | M_ZERO);
+ i = 0;
+ if (kern_envp && *kern_envp != '\0') {
+ for (cp = kern_envp; cp != NULL; cp = cpnext) {
cpnext = kernenv_next(cp);
len = strlen(cp) + 1;
if (len > KENV_MNAMELEN + 1 + KENV_MVALLEN + 1) {
printf(
"WARNING: too long kenv string, ignoring %s\n",
cp);
- goto sanitize;
+ continue;
}
- eqpos = strchr(cp, '=');
- if (eqpos == NULL) {
+ if (i < KENV_SIZE) {
+ kenvp[i] = malloc(len, M_KENV, M_WAITOK);
+ strcpy(kenvp[i++], cp);
+ explicit_bzero(cp, strlen(cp));
+ } else
printf(
- "WARNING: malformed static env value, ignoring %s\n",
- cp);
- goto sanitize;
- }
- *eqpos = 0;
- /*
- * De-dupe the environment as we go. We don't add the
- * duplicated assignments because config(8) will flip
- * the order of the static environment around to make
- * kernel processing match the order of specification
- * in the kernel config.
- */
- found = _getenv_dynamic_locked(cp, NULL);
- *eqpos = '=';
- if (found != NULL)
- goto sanitize;
- if (i > KENV_SIZE) {
- printf(
"WARNING: too many kenv strings, ignoring %s\n",
cp);
- goto sanitize;
- }
-
- kenvp[i] = malloc(len, M_KENV, M_WAITOK);
- strcpy(kenvp[i++], cp);
-sanitize:
- explicit_bzero(cp, len - 1);
}
- *curpos = i;
}
-}
+ kenvp[i] = NULL;
-/*
- * Setup the dynamic kernel environment.
- */
-static void
-init_dynamic_kenv(void *data __unused)
-{
- int dynamic_envpos;
-
- kenvp = malloc((KENV_SIZE + 1) * sizeof(char *), M_KENV,
- M_WAITOK | M_ZERO);
-
- dynamic_envpos = 0;
- init_dynamic_kenv_from(md_envp, &dynamic_envpos);
- init_dynamic_kenv_from(kern_envp, &dynamic_envpos);
- kenvp[dynamic_envpos] = NULL;
-
mtx_init(&kenv_lock, "kernel environment", NULL, MTX_DEF);
dynamic_kenv = 1;
}
@@ -362,11 +318,12 @@ freeenv(char *env)
* Internal functions for string lookup.
*/
static char *
-_getenv_dynamic_locked(const char *name, int *idx)
+_getenv_dynamic(const char *name, int *idx)
{
char *cp;
int len, i;
+ mtx_assert(&kenv_lock, MA_OWNED);
len = strlen(name);
for (cp = kenvp[0], i = 0; cp != NULL; cp = kenvp[++i]) {
if ((strncmp(cp, name, len) == 0) &&
@@ -380,20 +337,12 @@ _getenv_dynamic_locked(const char *name, int *idx)
}
static char *
-_getenv_dynamic(const char *name, int *idx)
+_getenv_static(const char *name)
{
-
- mtx_assert(&kenv_lock, MA_OWNED);
- return (_getenv_dynamic_locked(name, idx));
-}
-
-static char *
-_getenv_static_from(char *chkenv, const char *name)
-{
char *cp, *ep;
int len;
- for (cp = chkenv; cp != NULL; cp = kernenv_next(cp)) {
+ for (cp = kern_envp; cp != NULL; cp = kernenv_next(cp)) {
for (ep = cp; (*ep != '=') && (*ep != 0); ep++)
;
if (*ep != '=')
@@ -406,20 +355,6 @@ _getenv_static_from(char *chkenv, const char *name)
return (NULL);
}
-static char *
-_getenv_static(const char *name)
-{
- char *val;
-
- val = _getenv_static_from(md_envp, name);
- if (val != NULL)
- return (val);
- val = _getenv_static_from(kern_envp, name);
- if (val != NULL)
- return (val);
- return (NULL);
-}
-
/*
* Look up an environment variable by name.
* Return a pointer to the string if found.
@@ -464,25 +399,20 @@ testenv(const char *name)
return (0);
}
-/*
- * Set an environment variable in the MD-static environment. This cannot
- * feasibly be done on config(8)-generated static environments as they don't
- * generally include space for extra variables.
- */
static int
setenv_static(const char *name, const char *value)
{
int len;
- if (md_env_pos >= md_env_len)
+ if (env_pos >= env_len)
return (-1);
/* Check space for x=y and two nuls */
len = strlen(name) + strlen(value);
- if (len + 3 < md_env_len - md_env_pos) {
- len = sprintf(&md_envp[md_env_pos], "%s=%s", name, value);
- md_env_pos += len+1;
- md_envp[md_env_pos] = '\0';
+ if (len + 3 < env_len - env_pos) {
+ len = sprintf(&kern_envp[env_pos], "%s=%s", name, value);
+ env_pos += len+1;
+ kern_envp[env_pos] = '\0';
return (0);
} else
return (-1);
@@ -498,7 +428,7 @@ kern_setenv(const char *name, const char *value)
char *buf, *cp, *oldenv;
int namelen, vallen, i;
- if (dynamic_kenv == 0 && md_env_len > 0)
+ if (dynamic_kenv == 0 && env_len > 0)
return (setenv_static(name, value));
KENV_CHECK;
Modified: head/sys/kern/subr_hints.c
==============================================================================
--- head/sys/kern/subr_hints.c Thu Jul 5 16:27:34 2018 (r335996)
+++ head/sys/kern/subr_hints.c Thu Jul 5 16:28:43 2018 (r335997)
@@ -31,36 +31,61 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/lock.h>
-#include <sys/kernel.h>
#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/bus.h>
-#define FBACK_MDENV 0 /* MD env (e.g. loader.conf) */
-#define FBACK_STENV 1 /* Static env */
-#define FBACK_STATIC 2 /* static_hints */
+#define HINTMODE_KENV 0
+#define HINTMODE_STATIC 1
+#define HINTMODE_FALLBACK 2
/*
- * We'll use hintenv_merged to indicate that the dynamic environment has been
- * properly prepared for hint usage. This implies that the dynamic environment
- * has already been setup (dynamic_kenv) and that we have added any supplied
- * static_hints to the dynamic environment.
+ * Access functions for device resources.
*/
-static int hintenv_merged;
+static int checkmethod = 1;
+static char *hintp;
+
/*
- * Access functions for device resources.
+ * Define kern.hintmode sysctl, which only accept value 2, that cause to
+ * switch from Static KENV mode to Dynamic KENV. So systems that have hints
+ * compiled into kernel will be able to see/modify KENV (and hints too).
*/
-static void
-static_hints_to_env(void *data __unused)
+static int
+sysctl_hintmode(SYSCTL_HANDLER_ARGS)
{
const char *cp;
char *line, *eq;
- int eqidx, i;
+ int eqidx, error, i, value;
+ value = hintmode;
+
+ /* Fetch candidate for new hintmode value */
+ error = sysctl_handle_int(oidp, &value, 0, req);
+ if (error || req->newptr == NULL)
+ return (error);
+
+ if (value != HINTMODE_FALLBACK)
+ /* Only accept swithing to hintmode 2 */
+ return (EINVAL);
+
+ /*
+ * The rest of the sysctl handler is just making sure that our
+ * environment is consistent with the world we've already seen.
+ * If we came from kenv at all, then we have nothing to do: static
+ * kenv will get merged into dynamic kenv as soon as kmem becomes
+ * available, dynamic kenv is the environment we'd be setting these
+ * things in anyways. Therefore, we have nothing left to do unless
+ * we came from a static hints configuration.
+ */
+ if (hintmode != HINTMODE_STATIC) {
+ hintmode = value;
+ return (0);
+ }
+
cp = static_hints;
while (cp && *cp != '\0') {
eq = strchr(cp, '=');
@@ -70,152 +95,103 @@ static_hints_to_env(void *data __unused)
eqidx = eq - cp;
i = strlen(cp);
- line = malloc(i + 1, M_TEMP, M_WAITOK);
+ line = malloc(i+1, M_TEMP, M_WAITOK);
strcpy(line, cp);
- line[eqidx] = line[i] = '\0';
- /*
- * Before adding a hint to the dynamic environment, check if
- * another value for said hint has already been added. This is
- * needed because static environment overrides static hints and
- * dynamic environment overrides all.
- */
- if (testenv(line) == 0)
- kern_setenv(line, line + eqidx + 1);
+ line[eqidx] = '\0';
+ kern_setenv(line, line + eqidx + 1);
free(line, M_TEMP);
cp += i + 1;
}
- hintenv_merged = 1;
+
+ hintmode = value;
+ return (0);
}
-/* Any time after dynamic env is setup */
-SYSINIT(hintenv, SI_SUB_KMEM, SI_ORDER_ANY, static_hints_to_env, NULL);
+SYSCTL_PROC(_kern, OID_AUTO, hintmode, CTLTYPE_INT|CTLFLAG_RW,
+ &hintmode, 0, sysctl_hintmode, "I", "Get/set current hintmode");
/*
- * Checks the environment to see if we even have any hints. If it has no hints,
- * then res_find can take the hint that there's no point in searching it and
- * either move on to the next environment or fail early.
- */
-static bool
-_res_checkenv(char *envp)
-{
- char *cp;
-
- cp = envp;
- while (cp) {
- if (strncmp(cp, "hint.", 5) == 0)
- return (true);
- while (*cp != '\0')
- cp++;
- cp++;
- if (*cp == '\0')
- break;
- }
- return (false);
-}
-
-/*
* Evil wildcarding resource string lookup.
* This walks the supplied env string table and returns a match.
* The start point can be remembered for incremental searches.
*/
static int
-res_find(char **hintp_cookie, int *line, int *startln,
+res_find(int *line, int *startln,
const char *name, int *unit, const char *resname, const char *value,
const char **ret_name, int *ret_namelen, int *ret_unit,
const char **ret_resname, int *ret_resnamelen, const char **ret_value)
{
- int dyn_used = 0, fbacklvl = FBACK_MDENV, hit, i = 0, n = 0;
+ int n = 0, hit, i = 0;
char r_name[32];
- int r_unit;
+ int r_unit, use_kenv = (hintmode != HINTMODE_STATIC && dynamic_kenv);
char r_resname[32];
char r_value[128];
const char *s, *cp;
- char *hintp, *p;
+ char *p;
-
- /*
- * We are expecting that the caller will pass us a hintp_cookie that
- * they are tracking. Upon entry, if *hintp_cookie is *not* set, this
- * indicates to us that we should be figuring out based on the current
- * environment where to search. This keeps us sane throughout the
- * entirety of a single search.
- */
- if (*hintp_cookie == NULL) {
+ if (checkmethod) {
hintp = NULL;
- if (hintenv_merged) {
- /*
- * static_hints, if it was previously used, has
- * already been folded in to the environment
- * by this point.
- */
- mtx_lock(&kenv_lock);
- cp = kenvp[0];
- for (i = 0; cp != NULL; cp = kenvp[++i]) {
- if (!strncmp(cp, "hint.", 5)) {
- hintp = kenvp[0];
- break;
+
+ switch (hintmode) {
+ case HINTMODE_KENV: /* loader hints in environment only */
+ break;
+ case HINTMODE_STATIC: /* static hints only */
+ hintp = static_hints;
+ checkmethod = 0;
+ break;
+ case HINTMODE_FALLBACK: /* fallback mode */
+ if (dynamic_kenv) {
+ mtx_lock(&kenv_lock);
+ cp = kenvp[0];
+ for (i = 0; cp != NULL; cp = kenvp[++i]) {
+ if (!strncmp(cp, "hint.", 5)) {
+ use_kenv = 1;
+ checkmethod = 0;
+ break;
+ }
}
+ mtx_unlock(&kenv_lock);
+ } else {
+ cp = kern_envp;
+ while (cp) {
+ if (strncmp(cp, "hint.", 5) == 0) {
+ cp = NULL;
+ hintp = kern_envp;
+ break;
+ }
+ while (*cp != '\0')
+ cp++;
+ cp++;
+ if (*cp == '\0') {
+ cp = NULL;
+ hintp = static_hints;
+ break;
+ }
+ }
}
- mtx_unlock(&kenv_lock);
- dyn_used = 1;
- } else {
- /*
- * We'll have a chance to keep coming back here until
- * we've actually exhausted all of our possibilities.
- * We might have chosen the MD/Static env because it
- * had some kind of hints, but perhaps it didn't have
- * the hint we are looking for. We don't provide any
- * fallback when searching the dynamic environment.
- */
-fallback:
- if (dyn_used || fbacklvl >= FBACK_STATIC)
- return (ENOENT);
-
- if (fbacklvl <= FBACK_MDENV &&
- _res_checkenv(md_envp)) {
- hintp = md_envp;
- goto found;
- }
- fbacklvl++;
-
- if (fbacklvl <= FBACK_STENV &&
- _res_checkenv(kern_envp)) {
+ break;
+ default:
+ break;
+ }
+ if (hintp == NULL) {
+ if (dynamic_kenv) {
+ use_kenv = 1;
+ checkmethod = 0;
+ } else
hintp = kern_envp;
- goto found;
- }
- fbacklvl++;
-
- /* We'll fallback to static_hints if needed/can */
- if (fbacklvl <= FBACK_STATIC &&
- _res_checkenv(static_hints))
- hintp = static_hints;
-found:
- fbacklvl++;
}
-
- if (hintp == NULL)
- return (ENOENT);
- *hintp_cookie = hintp;
- } else {
- hintp = *hintp_cookie;
- if (hintenv_merged && hintp == kenvp[0])
- dyn_used = 1;
- else
- /*
- * If we aren't using the dynamic environment, we need
- * to run through the proper fallback procedure again.
- * This is so that we do continuations right if we're
- * working with *line and *startln.
- */
- goto fallback;
}
- if (dyn_used) {
+ if (use_kenv) {
mtx_lock(&kenv_lock);
i = 0;
- }
-
- cp = hintp;
+ cp = kenvp[0];
+ if (cp == NULL) {
+ mtx_unlock(&kenv_lock);
+ return (ENOENT);
+ }
+ } else
+ cp = hintp;
while (cp) {
hit = 1;
(*line)++;
@@ -224,28 +200,25 @@ found:
else
n = sscanf(cp, "hint.%32[^.].%d.%32[^=]=%127s",
r_name, &r_unit, r_resname, r_value);
- /* We'll circumvent all of the checks if we already know */
- if (hit) {
- if (n != 4) {
- printf("CONFIG: invalid hint '%s'\n", cp);
- p = strchr(cp, 'h');
- *p = 'H';
- hit = 0;
- }
- if (hit && startln && *startln >= 0 && *line < *startln)
- hit = 0;
- if (hit && name && strcmp(name, r_name) != 0)
- hit = 0;
- if (hit && unit && *unit != r_unit)
- hit = 0;
- if (hit && resname && strcmp(resname, r_resname) != 0)
- hit = 0;
- if (hit && value && strcmp(value, r_value) != 0)
- hit = 0;
- if (hit)
- break;
+ if (hit && n != 4) {
+ printf("CONFIG: invalid hint '%s'\n", cp);
+ p = strchr(cp, 'h');
+ *p = 'H';
+ hit = 0;
}
- if (dyn_used) {
+ if (hit && startln && *startln >= 0 && *line < *startln)
+ hit = 0;
+ if (hit && name && strcmp(name, r_name) != 0)
+ hit = 0;
+ if (hit && unit && *unit != r_unit)
+ hit = 0;
+ if (hit && resname && strcmp(resname, r_resname) != 0)
+ hit = 0;
+ if (hit && value && strcmp(value, r_value) != 0)
+ hit = 0;
+ if (hit)
+ break;
+ if (use_kenv) {
cp = kenvp[++i];
if (cp == NULL)
break;
@@ -259,10 +232,10 @@ found:
}
}
}
- if (dyn_used)
+ if (use_kenv)
mtx_unlock(&kenv_lock);
if (cp == NULL)
- goto fallback;
+ return ENOENT;
s = cp;
/* This is a bit of a hack, but at least is reentrant */
@@ -300,13 +273,11 @@ resource_find(int *line, int *startln,
{
int i;
int un;
- char *hintp;
*line = 0;
- hintp = NULL;
/* Search for exact unit matches first */
- i = res_find(&hintp, line, startln, name, unit, resname, value,
+ i = res_find(line, startln, name, unit, resname, value,
ret_name, ret_namelen, ret_unit, ret_resname, ret_resnamelen,
ret_value);
if (i == 0)
@@ -315,7 +286,7 @@ resource_find(int *line, int *startln,
return ENOENT;
/* If we are still here, search for wildcard matches */
un = -1;
- i = res_find(&hintp, line, startln, name, &un, resname, value,
+ i = res_find(line, startln, name, &un, resname, value,
ret_name, ret_namelen, ret_unit, ret_resname, ret_resnamelen,
ret_value);
if (i == 0)
Modified: head/sys/kern/tty.c
==============================================================================
--- head/sys/kern/tty.c Thu Jul 5 16:27:34 2018 (r335996)
+++ head/sys/kern/tty.c Thu Jul 5 16:28:43 2018 (r335997)
@@ -269,7 +269,7 @@ ttydev_open(struct cdev *dev, int oflags, int devtype
struct thread *td)
{
struct tty *tp;
- int cflags, error;
+ int error;
tp = dev->si_drv1;
error = 0;
@@ -325,14 +325,7 @@ ttydev_open(struct cdev *dev, int oflags, int devtype
if (TTY_CALLOUT(tp, dev) || dev == dev_console)
tp->t_termios.c_cflag |= CLOCAL;
- cflags = 0;
- if (tp->t_termios.c_cflag & CDTR_IFLOW)
- cflags |= SER_DTR;
- if (tp->t_termios.c_cflag & CRTS_IFLOW)
- cflags |= SER_RTS;
-
- if (cflags != 0)
- ttydevsw_modem(tp, cflags, 0);
+ ttydevsw_modem(tp, SER_DTR|SER_RTS, 0);
error = ttydevsw_open(tp);
if (error != 0)
Modified: head/sys/sys/systm.h
==============================================================================
--- head/sys/sys/systm.h Thu Jul 5 16:27:34 2018 (r335996)
+++ head/sys/sys/systm.h Thu Jul 5 16:28:43 2018 (r335997)
@@ -156,10 +156,11 @@ void kassert_panic(const char *fmt, ...) __printflike
* XXX most of these variables should be const.
*/
extern int osreldate;
+extern int envmode;
+extern int hintmode; /* 0 = off. 1 = config, 2 = fallback */
extern int dynamic_kenv;
extern struct mtx kenv_lock;
extern char *kern_envp;
-extern char *md_envp;
extern char static_env[];
extern char static_hints[]; /* by config for now */
Modified: head/usr.sbin/config/config.5
==============================================================================
--- head/usr.sbin/config/config.5 Thu Jul 5 16:27:34 2018 (r335996)
+++ head/usr.sbin/config/config.5 Thu Jul 5 16:28:43 2018 (r335997)
@@ -23,7 +23,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd July 5, 2018
+.Dd June 26, 2018
.Dt CONFIG 5
.Os
.Sh NAME
@@ -114,25 +114,13 @@ are defined in the file
.Pp
.It Ic env Ar filename
Specifies a filename containing a kernel environment definition.
-.Pp
-The kernel will augment this compiled-in environment with the environment
-prepared for it at boot time by
+The kernel normally uses an environment prepared for it at boot time
+by
.Xr loader 8 .
-Environment variables specified in the
-.Xr loader 8
-environment will take precedence over environment variables specified in
-.Ar filename ,
-and environment variables specified in the dynamic environment take precedence
-over both of these.
+This directive makes the kernel ignore the boot environment and use
+the compiled-in environment instead, unless the boot environment contains
+.Va static_env.disabled=1 .
.Pp
-.Va static_env.disabled=1
-may be specified in the
-.Xr loader 8
-environment to disable use of this compiled-in environment.
-This option has no effect if specified in any environment after the
-.Xr loader 8
-environment is processed.
-.Pp
This directive is useful for setting kernel tunables in
embedded environments that do not start from
.Xr loader 8 .
@@ -184,28 +172,9 @@ time (see
.Xr device.hints 5 ) .
This directive configures the kernel to use the static device configuration
listed in
-.Ar filename .
-.Pp
-Hints provided in this static device configuration will be overwritten in the
-order in which they're encountered.
-Hints in the compiled-in environment takes precedence over compiled-in hints,
-and hints in the environment prepared for the kernel by
-.Xr loader 8
-takes precedence over hints in the compiled-in environment.
-.Pp
-Once the dynamic environment becomes available, all compiled-in hints will be
-added to the dynamic environment if they do not already have an override in
-the dynamic environment.
-The dynamic environment will then be used for all searches of hints.
-.Pp
-.Va static_hints.disabled=1
-may be specified in either a compiled-in environment or the
-.Xr loader 8
-environment to disable use of these hints files.
-This option has no effect if specified in any environment after the
-.Xr loader 8
-environment is processed.
-.Pp
+.Ar filename ,
+unless the boot environment contains
+.Va static_hints.disabled=1 .
The file
.Ar filename
must conform to the syntax specified by
Modified: head/usr.sbin/config/config.h
==============================================================================
--- head/usr.sbin/config/config.h Thu Jul 5 16:27:34 2018 (r335996)
+++ head/usr.sbin/config/config.h Thu Jul 5 16:28:43 2018 (r335997)
@@ -179,6 +179,8 @@ SLIST_HEAD(, includepath) includepath;
extern char *ident;
extern char kernconfstr[];
extern int do_trace;
+extern int envmode;
+extern int hintmode;
extern int incignore;
char *get_word(FILE *);
Modified: head/usr.sbin/config/config.y
==============================================================================
--- head/usr.sbin/config/config.y Thu Jul 5 16:27:34 2018 (r335996)
+++ head/usr.sbin/config/config.y Thu Jul 5 16:28:43 2018 (r335997)
@@ -82,7 +82,8 @@
struct device_head dtab;
char *ident;
-char *env;
+int envmode;
+int hintmode;
int yyline;
const char *yyfile;
struct file_list_head ftab;
@@ -200,6 +201,7 @@ Config_spec:
err(EXIT_FAILURE, "calloc");
hint->hint_name = $2;
STAILQ_INSERT_HEAD(&hints, hint, hint_next);
+ hintmode = 1;
}
System_spec:
@@ -359,6 +361,7 @@ newenvvar(char *name, bool is_file)
envvar->env_str = name;
envvar->env_is_file = is_file;
STAILQ_INSERT_HEAD(&envvars, envvar, envvar_next);
+ envmode = 1;
}
/*
Modified: head/usr.sbin/config/mkmakefile.c
==============================================================================
--- head/usr.sbin/config/mkmakefile.c Thu Jul 5 16:27:34 2018 (r335996)
+++ head/usr.sbin/config/mkmakefile.c Thu Jul 5 16:28:43 2018 (r335997)
@@ -197,6 +197,7 @@ makehints(void)
fprintf(ofp, "#include <sys/types.h>\n");
fprintf(ofp, "#include <sys/systm.h>\n");
fprintf(ofp, "\n");
+ fprintf(ofp, "int hintmode = %d;\n", hintmode);
fprintf(ofp, "char static_hints[] = {\n");
STAILQ_FOREACH(hint, &hints, hint_next) {
ifp = fopen(hint->hint_name, "r");
@@ -311,6 +312,7 @@ makeenv(void)
fprintf(ofp, "#include <sys/types.h>\n");
fprintf(ofp, "#include <sys/systm.h>\n");
fprintf(ofp, "\n");
+ fprintf(ofp, "int envmode = %d;\n", envmode);
fprintf(ofp, "char static_env[] = {\n");
STAILQ_FOREACH(envvar, &envvars, envvar_next) {
if (envvar->env_is_file) {
More information about the svn-src-all
mailing list