which can modify the behaviour of the menu entry and its config
   symbol. These options are currently possible:
 
-  - "defconfig_list"
-    This declares a list of default entries which can be used when
-    looking for the default configuration (which is used when the main
-    .config doesn't exists yet.)
-
   - "modules"
     This declares the symbol to be used as the MODULES symbol, which
     enables the third modular state for all config symbols.
 
 This environment variable can be used to specify a default kernel config
 file name to override the default name of ".config".
 
+KCONFIG_DEFCONFIG_LIST
+----------------------
+
+This environment variable specifies a list of config files which can be used
+as a base configuration in case the .config does not exist yet. Entries in
+the list are separated with whitespaces to each other, and the first one
+that exists is used.
+
 KCONFIG_OVERWRITECONFIG
 -----------------------
 If you set KCONFIG_OVERWRITECONFIG in the environment, Kconfig will not
 
 # SPDX-License-Identifier: GPL-2.0-only
-config DEFCONFIG_LIST
-       string
-       depends on !UML
-       option defconfig_list
-       default "/lib/modules/$(shell,uname -r)/.config"
-       default "/etc/kernel-config"
-       default "/boot/config-$(shell,uname -r)"
-       default "arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)"
-
 config CC_VERSION_TEXT
        string
        default "$(CC_VERSION_TEXT)"
 
 silent := -s
 endif
 
+export KCONFIG_DEFCONFIG_LIST :=
+ifneq ($(SRCARCH),um)
+kernel-release := $(shell uname -r)
+KCONFIG_DEFCONFIG_LIST := \
+       /lib/modules/$(kernel-release)/.config \
+       /etc/kernel-config \
+       /boot/config-$(kernel-release) \
+       arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)
+endif
+
 # We need this, in case the user has it in its environment
 unexport CONFIG_
 
 
        if (name) {
                in = zconf_fopen(name);
        } else {
-               struct property *prop;
+               char *env;
 
                name = conf_get_configname();
                in = zconf_fopen(name);
                if (in)
                        goto load;
                sym_add_change_count(1);
-               if (!sym_defconfig_list)
+
+               env = getenv("KCONFIG_DEFCONFIG_LIST");
+               if (!env)
                        return 1;
 
-               for_all_defaults(sym_defconfig_list, prop) {
-                       if (expr_calc_value(prop->visible.expr) == no ||
-                           prop->expr->type != E_SYMBOL)
-                               continue;
-                       sym_calc_value(prop->expr->left.sym);
-                       name = sym_get_string_value(prop->expr->left.sym);
-                       in = zconf_fopen(name);
+               while (1) {
+                       bool is_last;
+
+                       while (isspace(*env))
+                               env++;
+
+                       if (!*env)
+                               break;
+
+                       p = env;
+                       while (*p && !isspace(*p))
+                               p++;
+
+                       is_last = (*p == '\0');
+
+                       *p = '\0';
+
+                       in = zconf_fopen(env);
                        if (in) {
                                conf_message("using defaults found in %s",
-                                        name);
+                                            env);
                                goto load;
                        }
+
+                       if (is_last)
+                               break;
+
+                       env = p + 1;
                }
        }
        if (!in)
 
 
 extern struct symbol symbol_yes, symbol_no, symbol_mod;
 extern struct symbol *modules_sym;
-extern struct symbol *sym_defconfig_list;
 extern int cdebug;
 struct expr *expr_alloc_symbol(struct symbol *sym);
 struct expr *expr_alloc_one(enum expr_type type, struct expr *ce);
 
 "def_bool"             return T_DEF_BOOL;
 "def_tristate"         return T_DEF_TRISTATE;
 "default"              return T_DEFAULT;
-"defconfig_list"       return T_DEFCONFIG_LIST;
 "depends"              return T_DEPENDS;
 "endchoice"            return T_ENDCHOICE;
 "endif"                        return T_ENDIF;
 
 void menu_add_expr(enum prop_type type, struct expr *expr, struct expr *dep);
 void menu_add_symbol(enum prop_type type, struct symbol *sym, struct expr *dep);
 void menu_add_option_modules(void);
-void menu_add_option_defconfig_list(void);
 void menu_add_option_allnoconfig_y(void);
 void menu_finalize(struct menu *parent);
 void menu_set_type(int type);
 
        modules_sym = current_entry->sym;
 }
 
-void menu_add_option_defconfig_list(void)
-{
-       if (!sym_defconfig_list)
-               sym_defconfig_list = current_entry->sym;
-       else if (sym_defconfig_list != current_entry->sym)
-               zconf_error("trying to redefine defconfig symbol");
-       sym_defconfig_list->flags |= SYMBOL_NO_WRITE;
-}
-
 void menu_add_option_allnoconfig_y(void)
 {
        current_entry->sym->flags |= SYMBOL_ALLNOCONFIG_Y;
 
 %token T_COMMENT
 %token T_CONFIG
 %token T_DEFAULT
-%token T_DEFCONFIG_LIST
 %token T_DEF_BOOL
 %token T_DEF_TRISTATE
 %token T_DEPENDS
        menu_add_option_modules();
 };
 
-config_option: T_OPTION T_DEFCONFIG_LIST T_EOL
-{
-       menu_add_option_defconfig_list();
-};
-
 config_option: T_OPTION T_ALLNOCONFIG_Y T_EOL
 {
        menu_add_option_allnoconfig_y();
 
        .flags = SYMBOL_VALID,
 };
 
-struct symbol *sym_defconfig_list;
 struct symbol *modules_sym;
 static tristate modules_val;
 
 
         # Override 'srctree' environment to make the test as the top directory
         extra_env['srctree'] = self._test_dir
 
+        # Clear KCONFIG_DEFCONFIG_LIST to keep unit tests from being affected
+        # by the user's environment.
+        extra_env['KCONFIG_DEFCONFIG_LIST'] = ''
+
         # Run Kconfig in a temporary directory.
         # This directory is automatically removed when done.
         with tempfile.TemporaryDirectory() as temp_dir: