util/kconfig: Uprev to Linux 6.8's kconfig

Linux kconfig has its own implementation of KCONFIG_WERROR now, so use
that. This reduces our patch count by 2.

Change-Id: I4f5f1f552e96f8ef7a4c5c0ab2ab7e2b6d798ceb
Signed-off-by: Patrick Georgi <patrick@georgi.software>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/81223
Reviewed-by: Felix Singer <service+coreboot-gerrit@felixsinger.de>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/util/kconfig/Makefile b/util/kconfig/Makefile
index 245445e..76cc2c5 100644
--- a/util/kconfig/Makefile
+++ b/util/kconfig/Makefile
@@ -27,6 +27,14 @@
 endif
 KCONFIG_DEFCONFIG_LIST += arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)
 
+ifneq ($(findstring c, $(KBUILD_EXTRA_WARN)),)
+export KCONFIG_WARN_UNKNOWN_SYMBOLS=1
+endif
+
+ifneq ($(findstring e, $(KBUILD_EXTRA_WARN)),)
+export KCONFIG_WERROR=1
+endif
+
 # We need this, in case the user has it in its environment
 unexport CONFIG_
 
@@ -99,7 +107,7 @@
 
 %.config: $(obj)/conf
 	$(if $(config-fragments),, $(error $@ fragment does not exists on this architecture))
-	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m .config $(config-fragments)
+	$(Q)$(CONFIG_SHELL) $(srctree)/scripts/kconfig/merge_config.sh -m $(KCONFIG_CONFIG) $(config-fragments)
 	$(Q)$(MAKE) -f $(srctree)/Makefile olddefconfig
 
 PHONY += tinyconfig
@@ -166,7 +174,7 @@
 
 # nconf: Used for the nconfig target based on ncurses
 hostprogs	+= nconf
-nconf-objs	:= nconf.o nconf.gui.o $(common-objs)
+nconf-objs	:= nconf.o nconf.gui.o mnconf-common.o $(common-objs)
 
 HOSTLDLIBS_nconf       = $(call read-file, $(obj)/nconf-libs)
 HOSTCFLAGS_nconf.o     = $(call read-file, $(obj)/nconf-cflags)
@@ -179,7 +187,7 @@
 hostprogs	+= mconf
 lxdialog	:= $(addprefix lxdialog/, \
 		     checklist.o inputbox.o menubox.o textbox.o util.o yesno.o)
-mconf-objs	:= mconf.o $(lxdialog) $(common-objs)
+mconf-objs	:= mconf.o $(lxdialog) mnconf-common.o $(common-objs)
 
 HOSTLDLIBS_mconf = $(call read-file, $(obj)/mconf-libs)
 $(foreach f, mconf.o $(lxdialog), \
diff --git a/util/kconfig/conf.c b/util/kconfig/conf.c
index f13c02c..8499143 100644
--- a/util/kconfig/conf.c
+++ b/util/kconfig/conf.c
@@ -827,6 +827,9 @@
 		break;
 	}
 
+	if (conf_errors())
+		exit(1);
+
 	if (sync_kconfig) {
 		name = getenv("KCONFIG_NOSILENTUPDATE");
 		if (name && *name) {
@@ -890,6 +893,9 @@
 		break;
 	}
 
+	if (sym_dep_errors())
+		exit(1);
+
 	if (input_mode == savedefconfig) {
 		if (conf_write_defconfig(defconfig_file)) {
 			fprintf(stderr, "\n*** Error while saving defconfig to: %s\n\n",
diff --git a/util/kconfig/confdata.c b/util/kconfig/confdata.c
index 3fbd9e7..0105917 100644
--- a/util/kconfig/confdata.c
+++ b/util/kconfig/confdata.c
@@ -155,6 +155,13 @@
 static const char *conf_filename;
 static int conf_lineno, conf_warnings;
 
+bool conf_errors(void)
+{
+	if (conf_warnings)
+		return getenv("KCONFIG_WERROR");
+	return false;
+}
+
 #ifdef __MINGW32__
 #define mkdir(_n,_p) mkdir((_n))
 #endif
@@ -310,16 +317,12 @@
 #define LINE_GROWTH 16
 static int add_byte(int c, char **lineptr, size_t slen, size_t *n)
 {
-	char *nline;
 	size_t new_size = slen + 1;
+
 	if (new_size > *n) {
 		new_size += LINE_GROWTH - 1;
 		new_size *= 2;
-		nline = xrealloc(*lineptr, new_size);
-		if (!nline)
-			return -1;
-
-		*lineptr = nline;
+		*lineptr = xrealloc(*lineptr, new_size);
 		*n = new_size;
 	}
 
@@ -362,19 +365,37 @@
 	return -1;
 }
 
+/* like getline(), but the newline character is stripped away */
+static ssize_t getline_stripped(char **lineptr, size_t *n, FILE *stream)
+{
+	ssize_t len;
+
+	len = compat_getline(lineptr, n, stream);
+
+	if (len > 0 && (*lineptr)[len - 1] == '\n') {
+		len--;
+		(*lineptr)[len] = '\0';
+
+		if (len > 0 && (*lineptr)[len - 1] == '\r') {
+			len--;
+			(*lineptr)[len] = '\0';
+		}
+	}
+
+	return len;
+}
+
 int conf_read_simple(const char *name, int def)
 {
 	FILE *in = NULL;
 	char   *line = NULL;
 	size_t  line_asize = 0;
-	char *p, *p2;
+	char *p, *val;
 	struct symbol *sym;
 	int i, def_flags;
-	const char *warn_unknown;
-	const char *werror;
+	const char *warn_unknown, *sym_name;
 
 	warn_unknown = getenv("KCONFIG_WARN_UNKNOWN_SYMBOLS");
-	werror = getenv("KCONFIG_WERROR");
 	if (name) {
 		in = zconf_fopen(name);
 	} else {
@@ -438,8 +459,7 @@
 		case S_INT:
 		case S_HEX:
 		case S_STRING:
-			if (sym->def[def].val)
-				free(sym->def[def].val);
+			free(sym->def[def].val);
 			/* fall through */
 		default:
 			sym->def[def].val = NULL;
@@ -447,90 +467,68 @@
 		}
 	}
 
-	while (compat_getline(&line, &line_asize, in) != -1) {
+	while (getline_stripped(&line, &line_asize, in) != -1) {
 		conf_lineno++;
-		sym = NULL;
+
+		if (!line[0]) /* blank line */
+			continue;
+
 		if (line[0] == '#') {
-			if (memcmp(line + 2, CONFIG_, strlen(CONFIG_)))
+			if (line[1] != ' ')
 				continue;
-			p = strchr(line + 2 + strlen(CONFIG_), ' ');
+			p = line + 2;
+			if (memcmp(p, CONFIG_, strlen(CONFIG_)))
+				continue;
+			sym_name = p + strlen(CONFIG_);
+			p = strchr(sym_name, ' ');
 			if (!p)
 				continue;
 			*p++ = 0;
-			if (strncmp(p, "is not set", 10))
+			if (strcmp(p, "is not set"))
 				continue;
-			if (def == S_DEF_USER) {
-				sym = sym_find(line + 2 + strlen(CONFIG_));
-				if (!sym) {
-					if (warn_unknown)
-						conf_warning("unknown symbol: %s",
-							     line + 2 + strlen(CONFIG_));
 
-					conf_set_changed(true);
-					continue;
-				}
-			} else {
-				sym = sym_lookup(line + 2 + strlen(CONFIG_), 0);
-				if (sym->type == S_UNKNOWN)
-					sym->type = S_BOOLEAN;
-			}
-			if (sym->flags & def_flags) {
-				conf_notice("override: reassigning to symbol %s", sym->name);
-			}
-			switch (sym->type) {
-			case S_BOOLEAN:
-			case S_TRISTATE:
-				sym->def[def].tri = no;
-				sym->flags |= def_flags;
-				break;
-			default:
-				;
-			}
-		} else if (memcmp(line, CONFIG_, strlen(CONFIG_)) == 0) {
-			p = strchr(line + strlen(CONFIG_), '=');
-			if (!p)
-				continue;
-			*p++ = 0;
-			p2 = strchr(p, '\n');
-			if (p2) {
-				*p2-- = 0;
-				if (*p2 == '\r')
-					*p2 = 0;
-			}
-
-			sym = sym_find(line + strlen(CONFIG_));
-			if (!sym) {
-				if (def == S_DEF_AUTO) {
-					/*
-					 * Reading from include/config/auto.conf
-					 * If CONFIG_FOO previously existed in
-					 * auto.conf but it is missing now,
-					 * include/config/FOO must be touched.
-					 */
-					conf_touch_dep(line + strlen(CONFIG_));
-				} else {
-					if (warn_unknown)
-						conf_warning("unknown symbol: %s",
-							     line + strlen(CONFIG_));
-
-					conf_set_changed(true);
-				}
-				continue;
-			}
-
-			if (sym->flags & def_flags) {
-				conf_notice("override: reassigning to symbol %s", sym->name);
-			}
-			if (conf_set_sym_val(sym, def, def_flags, p))
-				continue;
+			val = "n";
 		} else {
-			if (line[0] != '\r' && line[0] != '\n')
-				conf_warning("unexpected data: %.*s",
-					     (int)strcspn(line, "\r\n"), line);
+			if (memcmp(line, CONFIG_, strlen(CONFIG_))) {
+				conf_warning("unexpected data: %s", line);
+				continue;
+			}
 
+			sym_name = line + strlen(CONFIG_);
+			p = strchr(sym_name, '=');
+			if (!p) {
+				conf_warning("unexpected data: %s", line);
+				continue;
+			}
+			*p = 0;
+			val = p + 1;
+		}
+
+		sym = sym_find(sym_name);
+		if (!sym) {
+			if (def == S_DEF_AUTO) {
+				/*
+				 * Reading from include/config/auto.conf.
+				 * If CONFIG_FOO previously existed in auto.conf
+				 * but it is missing now, include/config/FOO
+				 * must be touched.
+				 */
+				conf_touch_dep(sym_name);
+			} else {
+				if (warn_unknown)
+					conf_warning("unknown symbol: %s", sym_name);
+
+				conf_set_changed(true);
+			}
 			continue;
 		}
 
+		if (sym->flags & def_flags)
+			conf_notice("override: reassigning to symbol %s", sym->name);
+
+		if (conf_set_sym_val(sym, def, def_flags, val))
+			continue;
+
 		if (sym && sym_is_choice_value(sym)) {
 			struct symbol *cs = prop_get_symbol(sym_get_choice_prop(sym));
 			switch (sym->def[def].tri) {
@@ -554,11 +552,6 @@
 	free(line);
 	fclose(in);
 
-	if (conf_warnings && werror) {
-		fprintf(stderr, "\nERROR: %d warnings encountered, and warnings are errors.\n\n", conf_warnings);
-		exit(1);
-	}
-
 	return 0;
 }
 
@@ -617,7 +610,7 @@
 				/* Reset a string value if it's out of range */
 				if (sym_string_within_range(sym, sym->def[S_DEF_USER].val))
 					break;
-				sym->flags &= ~(SYMBOL_VALID|SYMBOL_DEF_USER);
+				sym->flags &= ~SYMBOL_VALID;
 				conf_unsaved++;
 				break;
 			default:
diff --git a/util/kconfig/expr.c b/util/kconfig/expr.c
index 552c214..22bc337 100644
--- a/util/kconfig/expr.c
+++ b/util/kconfig/expr.c
@@ -1131,7 +1131,6 @@
 	default:
 		return -1;
 	}
-	printf("[%dgt%d?]", t1, t2);
 	return 0;
 }
 
diff --git a/util/kconfig/lkc.h b/util/kconfig/lkc.h
index 6989a48..412f525 100644
--- a/util/kconfig/lkc.h
+++ b/util/kconfig/lkc.h
@@ -100,8 +100,6 @@
 bool menu_has_prompt(struct menu *menu);
 const char *menu_get_prompt(struct menu *menu);
 struct menu *menu_get_parent_menu(struct menu *menu);
-bool menu_has_help(struct menu *menu);
-const char *menu_get_help(struct menu *menu);
 int get_jump_key_char(void);
 struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head);
 void menu_get_ext_help(struct menu *menu, struct gstr *help);
diff --git a/util/kconfig/lkc_proto.h b/util/kconfig/lkc_proto.h
index 72ac612..ff63564 100644
--- a/util/kconfig/lkc_proto.h
+++ b/util/kconfig/lkc_proto.h
@@ -1,4 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef LKC_PROTO_H
+#define LKC_PROTO_H
+
 #include <stdarg.h>
 
 /* confdata.c */
@@ -12,6 +15,7 @@
 bool conf_get_changed(void);
 void conf_set_changed_callback(void (*fn)(void));
 void conf_set_message_callback(void (*fn)(const char *s));
+bool conf_errors(void);
 
 /* symbol.c */
 extern struct symbol * symbol_hash[SYMBOL_HASHSIZE];
@@ -22,6 +26,7 @@
 struct symbol ** sym_re_search(const char *pattern);
 const char * sym_type_name(enum symbol_type type);
 void sym_calc_value(struct symbol *sym);
+bool sym_dep_errors(void);
 enum symbol_type sym_get_type(struct symbol *sym);
 bool sym_tristate_within_range(struct symbol *sym,tristate tri);
 bool sym_set_tristate_value(struct symbol *sym,tristate tri);
@@ -50,3 +55,5 @@
 
 /* expr.c */
 void expr_print(struct expr *e, void (*fn)(void *, struct symbol *, const char *), void *data, int prevtoken);
+
+#endif /* LKC_PROTO_H */
diff --git a/util/kconfig/mconf.c b/util/kconfig/mconf.c
index 078b0a8..d921223 100644
--- a/util/kconfig/mconf.c
+++ b/util/kconfig/mconf.c
@@ -21,6 +21,7 @@
 
 #include "lkc.h"
 #include "lxdialog/dialog.h"
+#include "mnconf-common.h"
 
 static const char mconf_readme[] =
 "Overview\n"
@@ -247,7 +248,7 @@
 	"      -> PCI support (PCI [=y])\n"
 	"(1)     -> PCI access mode (<choice> [=y])\n"
 	"  Defined at drivers/pci/Kconfig:47\n"
-	"  Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
+	"  Depends on: X86_LOCAL_APIC && X86_IO_APIC\n"
 	"  Selects: LIBCRC32\n"
 	"  Selected by: BAR [=n]\n"
 	"-----------------------------------------------------------------\n"
@@ -286,7 +287,6 @@
 static int show_all_options;
 static int save_and_exit;
 static int silent;
-static int jump_key_char;
 
 static void conf(struct menu *menu, struct menu *active_menu);
 
@@ -378,58 +378,6 @@
 	str_free(&help);
 }
 
-struct search_data {
-	struct list_head *head;
-	struct menu *target;
-};
-
-static int next_jump_key(int key)
-{
-	if (key < '1' || key > '9')
-		return '1';
-
-	key++;
-
-	if (key > '9')
-		key = '1';
-
-	return key;
-}
-
-static int handle_search_keys(int key, size_t start, size_t end, void *_data)
-{
-	struct search_data *data = _data;
-	struct jump_key *pos;
-	int index = 0;
-
-	if (key < '1' || key > '9')
-		return 0;
-
-	list_for_each_entry(pos, data->head, entries) {
-		index = next_jump_key(index);
-
-		if (pos->offset < start)
-			continue;
-
-		if (pos->offset >= end)
-			break;
-
-		if (key == index) {
-			data->target = pos->target;
-			return 1;
-		}
-	}
-
-	return 0;
-}
-
-int get_jump_key_char(void)
-{
-	jump_key_char = next_jump_key(jump_key_char);
-
-	return jump_key_char;
-}
-
 static void search_conf(void)
 {
 	struct symbol **sym_arr;
diff --git a/util/kconfig/menu.c b/util/kconfig/menu.c
index d936ccc..26e81b4 100644
--- a/util/kconfig/menu.c
+++ b/util/kconfig/menu.c
@@ -673,19 +673,6 @@
 	return menu;
 }
 
-bool menu_has_help(struct menu *menu)
-{
-	return menu->help != NULL;
-}
-
-const char *menu_get_help(struct menu *menu)
-{
-	if (menu->help)
-		return menu->help;
-	else
-		return "";
-}
-
 static void get_def_str(struct gstr *r, struct menu *menu)
 {
 	str_printf(r, "Defined at %s:%d\n",
@@ -856,10 +843,10 @@
 	struct symbol *sym = menu->sym;
 	const char *help_text = nohelp_text;
 
-	if (menu_has_help(menu)) {
+	if (menu->help) {
 		if (sym->name)
 			str_printf(help, "%s%s:\n\n", CONFIG_, sym->name);
-		help_text = menu_get_help(menu);
+		help_text = menu->help;
 	}
 	str_printf(help, "%s\n", help_text);
 	if (sym)
diff --git a/util/kconfig/mnconf-common.c b/util/kconfig/mnconf-common.c
new file mode 100644
index 0000000..18cb9a6
--- /dev/null
+++ b/util/kconfig/mnconf-common.c
@@ -0,0 +1,53 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#include "expr.h"
+#include "list.h"
+#include "mnconf-common.h"
+
+int jump_key_char;
+
+int next_jump_key(int key)
+{
+	if (key < '1' || key > '9')
+		return '1';
+
+	key++;
+
+	if (key > '9')
+		key = '1';
+
+	return key;
+}
+
+int handle_search_keys(int key, size_t start, size_t end, void *_data)
+{
+	struct search_data *data = _data;
+	struct jump_key *pos;
+	int index = 0;
+
+	if (key < '1' || key > '9')
+		return 0;
+
+	list_for_each_entry(pos, data->head, entries) {
+		index = next_jump_key(index);
+
+		if (pos->offset < start)
+			continue;
+
+		if (pos->offset >= end)
+			break;
+
+		if (key == index) {
+			data->target = pos->target;
+			return 1;
+		}
+	}
+
+	return 0;
+}
+
+int get_jump_key_char(void)
+{
+	jump_key_char = next_jump_key(jump_key_char);
+
+	return jump_key_char;
+}
diff --git a/util/kconfig/mnconf-common.h b/util/kconfig/mnconf-common.h
new file mode 100644
index 0000000..ab6292c
--- /dev/null
+++ b/util/kconfig/mnconf-common.h
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef MNCONF_COMMON_H
+#define MNCONF_COMMON_H
+
+#include <stddef.h>
+
+struct search_data {
+	struct list_head *head;
+	struct menu *target;
+};
+
+extern int jump_key_char;
+
+int next_jump_key(int key);
+int handle_search_keys(int key, size_t start, size_t end, void *_data);
+int get_jump_key_char(void);
+
+#endif /* MNCONF_COMMON_H */
diff --git a/util/kconfig/nconf.c b/util/kconfig/nconf.c
index a8c3cc0..91b1962 100644
--- a/util/kconfig/nconf.c
+++ b/util/kconfig/nconf.c
@@ -12,6 +12,7 @@
 #include <stdlib.h>
 
 #include "lkc.h"
+#include "mnconf-common.h"
 #include "nconf.h"
 #include <ctype.h>
 
@@ -216,7 +217,7 @@
 "Symbol: FOO [ = m]\n"
 "Prompt: Foo bus is used to drive the bar HW\n"
 "Defined at drivers/pci/Kconfig:47\n"
-"Depends on: X86_LOCAL_APIC && X86_IO_APIC || IA64\n"
+"Depends on: X86_LOCAL_APIC && X86_IO_APIC\n"
 "Location:\n"
 "  -> Bus options (PCI, PCMCIA, EISA, ISA)\n"
 "    -> PCI support (PCI [ = y])\n"
@@ -279,7 +280,6 @@
 
 static char *dialog_input_result;
 static int dialog_input_result_len;
-static int jump_key_char;
 
 static void selected_conf(struct menu *menu, struct menu *active_menu);
 static void conf(struct menu *menu);
@@ -691,57 +691,6 @@
 	return 0;
 }
 
-struct search_data {
-	struct list_head *head;
-	struct menu *target;
-};
-
-static int next_jump_key(int key)
-{
-	if (key < '1' || key > '9')
-		return '1';
-
-	key++;
-
-	if (key > '9')
-		key = '1';
-
-	return key;
-}
-
-static int handle_search_keys(int key, size_t start, size_t end, void *_data)
-{
-	struct search_data *data = _data;
-	struct jump_key *pos;
-	int index = 0;
-
-	if (key < '1' || key > '9')
-		return 0;
-
-	list_for_each_entry(pos, data->head, entries) {
-		index = next_jump_key(index);
-
-		if (pos->offset < start)
-			continue;
-
-		if (pos->offset >= end)
-			break;
-
-		if (key == index) {
-			data->target = pos->target;
-			return 1;
-		}
-	}
-
-	return 0;
-}
-
-int get_jump_key_char(void)
-{
-	jump_key_char = next_jump_key(jump_key_char);
-
-	return jump_key_char;
-}
 
 static void search_conf(void)
 {
diff --git a/util/kconfig/patches/0001-Kconfig-Add-KCONFIG_STRICT-mode.patch b/util/kconfig/patches/0001-Kconfig-Add-KCONFIG_STRICT-mode.patch
deleted file mode 100644
index 4b1e5bb..0000000
--- a/util/kconfig/patches/0001-Kconfig-Add-KCONFIG_STRICT-mode.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-Make KCONFIG_WERROR more verbose.
-
-Index: kconfig/confdata.c
-===================================================================
---- kconfig.orig/confdata.c
-+++ kconfig/confdata.c
-@@ -533,8 +533,10 @@ load:
- 	free(line);
- 	fclose(in);
- 
--	if (conf_warnings && werror)
-+	if (conf_warnings && werror) {
-+		fprintf(stderr, "\nERROR: %d warnings encountered, and warnings are errors.\n\n", conf_warnings);
- 		exit(1);
-+	}
- 
- 	return 0;
- }
diff --git a/util/kconfig/patches/0002-Kconfig-Change-symbol-override-from-warning-to-notic.patch b/util/kconfig/patches/0002-Kconfig-Change-symbol-override-from-warning-to-notic.patch
index 3ad9f1e..a064e15 100644
--- a/util/kconfig/patches/0002-Kconfig-Change-symbol-override-from-warning-to-notic.patch
+++ b/util/kconfig/patches/0002-Kconfig-Change-symbol-override-from-warning-to-notic.patch
@@ -23,7 +23,7 @@
 ===================================================================
 --- kconfig.orig/confdata.c
 +++ kconfig/confdata.c
-@@ -166,6 +166,16 @@ static void conf_warning(const char *fmt
+@@ -173,6 +173,16 @@ static void conf_warning(const char *fmt
  	conf_warnings++;
  }
  
@@ -40,25 +40,16 @@
  static void conf_default_message_callback(const char *s)
  {
  	printf("#\n# ");
-@@ -454,7 +464,7 @@ load:
- 					sym->type = S_BOOLEAN;
- 			}
- 			if (sym->flags & def_flags) {
--				conf_warning("override: reassigning to symbol %s", sym->name);
-+				conf_notice("override: reassigning to symbol %s", sym->name);
- 			}
- 			switch (sym->type) {
- 			case S_BOOLEAN:
-@@ -498,7 +508,7 @@ load:
- 			}
+@@ -503,7 +513,7 @@ load:
+ 		}
  
- 			if (sym->flags & def_flags) {
--				conf_warning("override: reassigning to symbol %s", sym->name);
-+				conf_notice("override: reassigning to symbol %s", sym->name);
- 			}
- 			if (conf_set_sym_val(sym, def, def_flags, p))
- 				continue;
-@@ -523,7 +533,7 @@ load:
+ 		if (sym->flags & def_flags)
+-			conf_warning("override: reassigning to symbol %s", sym->name);
++			conf_notice("override: reassigning to symbol %s", sym->name);
+ 
+ 		if (conf_set_sym_val(sym, def, def_flags, val))
+ 			continue;
+@@ -521,7 +531,7 @@ load:
  				break;
  			case yes:
  				if (cs->def[def].tri != no)
diff --git a/util/kconfig/patches/0003-util-kconfig-conf.c-Fix-newline-in-error-printf.patch b/util/kconfig/patches/0003-util-kconfig-conf.c-Fix-newline-in-error-printf.patch
index c49ae50..7b5105b 100644
--- a/util/kconfig/patches/0003-util-kconfig-conf.c-Fix-newline-in-error-printf.patch
+++ b/util/kconfig/patches/0003-util-kconfig-conf.c-Fix-newline-in-error-printf.patch
@@ -14,7 +14,7 @@
 ===================================================================
 --- kconfig.orig/conf.c
 +++ kconfig/conf.c
-@@ -892,7 +892,7 @@ int main(int ac, char **av)
+@@ -898,7 +898,7 @@ int main(int ac, char **av)
  
  	if (input_mode == savedefconfig) {
  		if (conf_write_defconfig(defconfig_file)) {
diff --git a/util/kconfig/patches/0006-util-kconfig-Set-parameter-of-mkdir-to-only-one-for-.patch b/util/kconfig/patches/0006-util-kconfig-Set-parameter-of-mkdir-to-only-one-for-.patch
index cd61f44..5e317a8 100644
--- a/util/kconfig/patches/0006-util-kconfig-Set-parameter-of-mkdir-to-only-one-for-.patch
+++ b/util/kconfig/patches/0006-util-kconfig-Set-parameter-of-mkdir-to-only-one-for-.patch
@@ -15,9 +15,9 @@
 ===================================================================
 --- kconfig.orig/confdata.c
 +++ kconfig/confdata.c
-@@ -155,6 +155,10 @@ static void conf_message(const char *fmt
- static const char *conf_filename;
- static int conf_lineno, conf_warnings;
+@@ -162,6 +162,10 @@ bool conf_errors(void)
+ 	return false;
+ }
  
 +#ifdef __MINGW32__
 +#define mkdir(_n,_p) mkdir((_n))
diff --git a/util/kconfig/patches/0007-kconfig-Allow-KCONFIG_STRICT-outside-of-confdata.c.patch b/util/kconfig/patches/0007-kconfig-Allow-KCONFIG_STRICT-outside-of-confdata.c.patch
deleted file mode 100644
index a9f3218..0000000
--- a/util/kconfig/patches/0007-kconfig-Allow-KCONFIG_STRICT-outside-of-confdata.c.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From:   Sergey Senozhatsky <senozhatsky@chromium.org>
-To:     Masahiro Yamada <masahiroy@kernel.org>
-Cc:     Patrick Georgi <pgeorgi@google.com>, linux-kbuild@vger.kernel.org,
-        linux-kernel@vger.kernel.org,
-        Sergey Senozhatsky <senozhatsky@chromium.org>,
-        Stefan Reinauer <reinauer@google.com>
-Subject: [PATCH] kconfig: WERROR unmet symbol dependency
-Date:   Wed, 22 Nov 2023 12:47:45 +0900
-Message-ID: <20231122034753.1446513-1-senozhatsky@chromium.org>
-MIME-Version: 1.0
-Content-Transfer-Encoding: 8bit
-List-ID: <linux-kernel.vger.kernel.org>
-X-Mailing-List: linux-kernel@vger.kernel.org
-
-When KCONFIG_WERROR env variable is set treat unmet direct
-symbol dependency as a terminal condition (error).
-
-Suggested-by: Stefan Reinauer <reinauer@google.com>
-Signed-off-by: Sergey Senozhatsky <senozhatsky@chromium.org>
----
- scripts/kconfig/symbol.c | 9 ++++++++-
- 1 file changed, 8 insertions(+), 1 deletion(-)
-
-Index: kconfig/symbol.c
-===================================================================
---- kconfig.orig/symbol.c
-+++ kconfig/symbol.c
-@@ -37,6 +37,7 @@ static struct symbol symbol_empty = {
- 
- struct symbol *modules_sym;
- static tristate modules_val;
-+static int sym_warnings;
- 
- enum symbol_type sym_get_type(struct symbol *sym)
- {
-@@ -317,12 +318,14 @@ static void sym_warn_unmet_dep(struct sy
- 			       "  Selected by [m]:\n");
- 
- 	fputs(str_get(&gs), stderr);
-+	sym_warnings++;
- }
- 
- void sym_calc_value(struct symbol *sym)
- {
- 	struct symbol_value newval, oldval;
- 	struct property *prop;
-+	const char *werror;
- 	struct expr *e;
- 
- 	if (!sym)
-@@ -338,8 +341,9 @@ void sym_calc_value(struct symbol *sym)
- 		sym_calc_value(prop_get_symbol(prop));
- 	}
- 
-+	werror = getenv("KCONFIG_WERROR");
-+	sym_warnings = 0;
- 	sym->flags |= SYMBOL_VALID;
--
- 	oldval = sym->curr;
- 
- 	switch (sym->type) {
-@@ -430,6 +434,9 @@ void sym_calc_value(struct symbol *sym)
- 		;
- 	}
- 
-+	if (sym_warnings && werror)
-+		exit(1);
-+
- 	sym->curr = newval;
- 	if (sym_is_choice(sym) && newval.tri == yes)
- 		sym->curr.val = sym_calc_choice(sym);
diff --git a/util/kconfig/patches/0009-util-kconfig-Allow-emitting-false-booleans-into-kconfig-output.patch b/util/kconfig/patches/0009-util-kconfig-Allow-emitting-false-booleans-into-kconfig-output.patch
index 101bc69..6fd2eab 100644
--- a/util/kconfig/patches/0009-util-kconfig-Allow-emitting-false-booleans-into-kconfig-output.patch
+++ b/util/kconfig/patches/0009-util-kconfig-Allow-emitting-false-booleans-into-kconfig-output.patch
@@ -14,7 +14,7 @@
 ===================================================================
 --- kconfig.orig/confdata.c
 +++ kconfig/confdata.c
-@@ -738,7 +738,12 @@ static void print_symbol_for_dotconfig(F
+@@ -731,7 +731,12 @@ static void print_symbol_for_dotconfig(F
  
  static void print_symbol_for_autoconf(FILE *fp, struct symbol *sym)
  {
@@ -28,7 +28,7 @@
  }
  
  void print_symbol_for_listconfig(struct symbol *sym)
-@@ -763,6 +768,10 @@ static void print_symbol_for_c(FILE *fp,
+@@ -756,6 +761,10 @@ static void print_symbol_for_c(FILE *fp,
  	case S_TRISTATE:
  		switch (*val) {
  		case 'n':
@@ -39,7 +39,7 @@
  			return;
  		case 'm':
  			sym_suffix = "_MODULE";
-@@ -774,6 +783,12 @@ static void print_symbol_for_c(FILE *fp,
+@@ -767,6 +776,12 @@ static void print_symbol_for_c(FILE *fp,
  	case S_HEX:
  		if (val[0] != '0' || (val[1] != 'x' && val[1] != 'X'))
  			val_prefix = "0x";
@@ -52,7 +52,7 @@
  		break;
  	case S_STRING:
  		escaped = escape_string_value(val);
-@@ -1190,8 +1205,9 @@ static int __conf_write_autoconf(const c
+@@ -1183,8 +1198,9 @@ static int __conf_write_autoconf(const c
  
  	conf_write_heading(file, comment_style);
  
diff --git a/util/kconfig/patches/0014-util-kconfig-Move-Kconfig-deps-back-into-build-confi.patch b/util/kconfig/patches/0014-util-kconfig-Move-Kconfig-deps-back-into-build-confi.patch
index 54a79c3..62835cc 100644
--- a/util/kconfig/patches/0014-util-kconfig-Move-Kconfig-deps-back-into-build-confi.patch
+++ b/util/kconfig/patches/0014-util-kconfig-Move-Kconfig-deps-back-into-build-confi.patch
@@ -21,7 +21,7 @@
 ===================================================================
 --- kconfig.orig/confdata.c
 +++ kconfig/confdata.c
-@@ -237,6 +237,13 @@ static const char *conf_get_rustccfg_nam
+@@ -244,6 +244,13 @@ static const char *conf_get_rustccfg_nam
  	return name ? name : "include/generated/rustc_cfg";
  }
  
@@ -35,7 +35,7 @@
  static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
  {
  	char *p2;
-@@ -1106,19 +1113,19 @@ static int conf_write_autoconf_cmd(const
+@@ -1099,19 +1106,19 @@ static int conf_write_autoconf_cmd(const
  
  static int conf_touch_deps(void)
  {
diff --git a/util/kconfig/patches/series b/util/kconfig/patches/series
index ed9f719..6058fe7 100644
--- a/util/kconfig/patches/series
+++ b/util/kconfig/patches/series
@@ -1,9 +1,7 @@
-0001-Kconfig-Add-KCONFIG_STRICT-mode.patch
 0002-Kconfig-Change-symbol-override-from-warning-to-notic.patch
 0003-util-kconfig-conf.c-Fix-newline-in-error-printf.patch
 0004-src-util-Use-NULL-instead-of-0-for-pointer.patch
 0006-util-kconfig-Set-parameter-of-mkdir-to-only-one-for-.patch
-0007-kconfig-Allow-KCONFIG_STRICT-outside-of-confdata.c.patch
 0008-kconfig-Add-wildcard-support-for-source.patch
 0009-util-kconfig-Allow-emitting-false-booleans-into-kconfig-output.patch
 0010-reenable-source-in-choice.patch
diff --git a/util/kconfig/symbol.c b/util/kconfig/symbol.c
index 77de8ee..3afe5be 100644
--- a/util/kconfig/symbol.c
+++ b/util/kconfig/symbol.c
@@ -29,12 +29,6 @@
 	.flags = SYMBOL_CONST|SYMBOL_VALID,
 };
 
-static struct symbol symbol_empty = {
-	.name = "",
-	.curr = { "", no },
-	.flags = SYMBOL_VALID,
-};
-
 struct symbol *modules_sym;
 static tristate modules_val;
 static int sym_warnings;
@@ -321,11 +315,17 @@
 	sym_warnings++;
 }
 
+bool sym_dep_errors(void)
+{
+	if (sym_warnings)
+		return getenv("KCONFIG_WERROR");
+	return false;
+}
+
 void sym_calc_value(struct symbol *sym)
 {
 	struct symbol_value newval, oldval;
 	struct property *prop;
-	const char *werror;
 	struct expr *e;
 
 	if (!sym)
@@ -341,20 +341,25 @@
 		sym_calc_value(prop_get_symbol(prop));
 	}
 
-	werror = getenv("KCONFIG_WERROR");
-	sym_warnings = 0;
 	sym->flags |= SYMBOL_VALID;
+
 	oldval = sym->curr;
 
+	newval.tri = no;
+
 	switch (sym->type) {
 	case S_INT:
+		newval.val = "0";
+		break;
 	case S_HEX:
+		newval.val = "0x0";
+		break;
 	case S_STRING:
-		newval = symbol_empty.curr;
+		newval.val = "";
 		break;
 	case S_BOOLEAN:
 	case S_TRISTATE:
-		newval = symbol_no.curr;
+		newval.val = "n";
 		break;
 	default:
 		sym->curr.val = sym->name;
@@ -434,9 +439,6 @@
 		;
 	}
 
-	if (sym_warnings && werror)
-		exit(1);
-
 	sym->curr = newval;
 	if (sym_is_choice(sym) && newval.tri == yes)
 		sym->curr.val = sym_calc_choice(sym);
@@ -704,13 +706,12 @@
 {
 	struct property *prop;
 	struct symbol *ds;
-	const char *str;
+	const char *str = "";
 	tristate val;
 
 	sym_calc_visibility(sym);
 	sym_calc_value(modules_sym);
 	val = symbol_no.curr.tri;
-	str = symbol_empty.curr.val;
 
 	/* If symbol has a default value look it up */
 	prop = sym_get_default_prop(sym);
@@ -760,14 +761,17 @@
 		case yes: return "y";
 		}
 	case S_INT:
+		if (!str[0])
+			str = "0";
+		break;
 	case S_HEX:
-		return str;
-	case S_STRING:
-		return str;
-	case S_UNKNOWN:
+		if (!str[0])
+			str = "0x0";
+		break;
+	default:
 		break;
 	}
-	return "";
+	return str;
 }
 
 const char *sym_get_string_value(struct symbol *sym)
diff --git a/util/kconfig/util.c b/util/kconfig/util.c
index 53e079e..23b3d23 100644
--- a/util/kconfig/util.c
+++ b/util/kconfig/util.c
@@ -42,8 +42,7 @@
 /* Free storage for growable string */
 void str_free(struct gstr *gs)
 {
-	if (gs->s)
-		free(gs->s);
+	free(gs->s);
 	gs->s = NULL;
 	gs->len = 0;
 }