diff options
Diffstat (limited to 'scripts')
28 files changed, 538 insertions, 205 deletions
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 978416dd31c..547e15daf03 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -148,7 +148,7 @@ cc-ldoption = $(call try-run,\  # ld-option  # Usage: LDFLAGS += $(call ld-option, -X)  ld-option = $(call try-run,\ -	$(CC) /dev/null -c -o "$$TMPO" ; $(LD) $(1) "$$TMPO" -o "$$TMP",$(1),$(2)) +	$(CC) -x c /dev/null -c -o "$$TMPO" ; $(LD) $(1) "$$TMPO" -o "$$TMP",$(1),$(2))  # ar-option  # Usage: KBUILD_ARFLAGS := $(call ar-option,D) diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 0e801c3cdaf..d5d859c8072 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -211,7 +211,8 @@ $(obj)/%.i: $(src)/%.c FORCE  cmd_gensymtypes =                                                           \      $(CPP) -D__GENKSYMS__ $(c_flags) $< |                                   \ -    $(GENKSYMS) $(if $(1), -T $(2)) -a $(ARCH)                              \ +    $(GENKSYMS) $(if $(1), -T $(2))                                         \ +     $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX))             \       $(if $(KBUILD_PRESERVE),-p)                                            \       -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null)) diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst index 25f216a841d..182084d728c 100644 --- a/scripts/Makefile.headersinst +++ b/scripts/Makefile.headersinst @@ -14,7 +14,7 @@ kbuild-file := $(srctree)/$(obj)/Kbuild  include $(kbuild-file)  # called may set destination dir (when installing to asm/) -_dst := $(or $(destination-y),$(dst),$(obj)) +_dst := $(if $(destination-y),$(destination-y),$(if $(dst),$(dst),$(obj)))  old-kbuild-file := $(srctree)/$(subst uapi/,,$(obj))/Kbuild  ifneq ($(wildcard $(old-kbuild-file)),) @@ -48,13 +48,14 @@ all-files     := $(header-y) $(genhdr-y) $(wrapper-files)  output-files  := $(addprefix $(installdir)/, $(all-files))  input-files   := $(foreach hdr, $(header-y), \ -		   $(or \ +		   $(if $(wildcard $(srcdir)/$(hdr)), \  			$(wildcard $(srcdir)/$(hdr)), \ -			$(wildcard $(oldsrcdir)/$(hdr)), \ -			$(error Missing UAPI file $(srcdir)/$(hdr)) \ +			$(if $(wildcard $(oldsrcdir)/$(hdr)), \ +				$(wildcard $(oldsrcdir)/$(hdr)), \ +				$(error Missing UAPI file $(srcdir)/$(hdr))) \  		   )) \  		 $(foreach hdr, $(genhdr-y), \ -		   $(or \ +		   $(if	$(wildcard $(gendir)/$(hdr)), \  			$(wildcard $(gendir)/$(hdr)), \  			$(error Missing generated UAPI file $(gendir)/$(hdr)) \  		   )) @@ -71,7 +72,7 @@ printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))  quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\                              file$(if $(word 2, $(all-files)),s))        cmd_install = \ -        $(PERL) $< $(installdir) $(SRCARCH) $(input-files); \ +        $(CONFIG_SHELL) $< $(installdir) $(input-files); \          for F in $(wrapper-files); do                                   \                  echo "\#include <asm-generic/$$F>" > $(installdir)/$$F;    \          done;                                                           \ @@ -97,7 +98,7 @@ __headersinst: $(subdirs) $(install-file)  	@:  targets += $(install-file) -$(install-file): scripts/headers_install.pl $(input-files) FORCE +$(install-file): scripts/headers_install.sh $(input-files) FORCE  	$(if $(unwanted),$(call cmd,remove),)  	$(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))  	$(call if_changed,install) diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 07125e697d7..51bb3de680b 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -119,13 +119,6 @@ _c_flags += $(if $(patsubst n%,, \  		$(CFLAGS_GCOV))  endif -ifdef CONFIG_SYMBOL_PREFIX -_sym_flags = -DSYMBOL_PREFIX=$(patsubst "%",%,$(CONFIG_SYMBOL_PREFIX)) -_cpp_flags += $(_sym_flags) -_a_flags += $(_sym_flags) -endif - -  # If building the kernel in a separate objtree expand all occurrences  # of -Idir to -I$(srctree)/dir except for absolute paths (starting with '/'). @@ -156,9 +149,9 @@ cpp_flags      = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE)     \  ld_flags       = $(LDFLAGS) $(ldflags-y) -dtc_cpp_flags  = -Wp,-MD,$(depfile) -nostdinc                            \ +dtc_cpp_flags  = -Wp,-MD,$(depfile).pre -nostdinc                        \  		 -I$(srctree)/arch/$(SRCARCH)/boot/dts                   \ -		 -I$(srctree)/arch/$(SRCARCH)/include/dts                \ +		 -I$(srctree)/arch/$(SRCARCH)/boot/dts/include           \  		 -undef -D__DTS__  # Finds the multi-part object the current object will be linked into @@ -269,20 +262,17 @@ $(obj)/%.dtb.S: $(obj)/%.dtb  	$(call cmd,dt_S_dtb)  quiet_cmd_dtc = DTC     $@ -cmd_dtc = $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 $(DTC_FLAGS) -d $(depfile) $< +cmd_dtc = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ +	$(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 \ +		-i $(srctree)/arch/$(SRCARCH)/boot/dts $(DTC_FLAGS) \ +		-d $(depfile).dtc $(dtc-tmp) ; \ +	cat $(depfile).pre $(depfile).dtc > $(depfile)  $(obj)/%.dtb: $(src)/%.dts FORCE  	$(call if_changed_dep,dtc)  dtc-tmp = $(subst $(comma),_,$(dot-target).dts) -quiet_cmd_dtc_cpp = DTC+CPP $@ -cmd_dtc_cpp = $(CPP) $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ; \ -	$(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 $(DTC_FLAGS) $(dtc-tmp) - -$(obj)/%.dtb: $(src)/%.dtsp FORCE -	$(call if_changed_dep,dtc_cpp) -  # Bzip2  # --------------------------------------------------------------------------- diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost index cf82c832458..8dcdca27d83 100644 --- a/scripts/Makefile.modpost +++ b/scripts/Makefile.modpost @@ -60,7 +60,8 @@ kernelsymfile := $(objtree)/Module.symvers  modulesymfile := $(firstword $(KBUILD_EXTMOD))/Module.symvers  # Step 1), find all modules listed in $(MODVERDIR)/ -__modules := $(sort $(shell grep -h '\.ko$$' /dev/null $(wildcard $(MODVERDIR)/*.mod))) +MODLISTCMD := find $(MODVERDIR) -name '*.mod' | xargs -r grep -h '\.ko$$' | sort -u +__modules := $(shell $(MODLISTCMD))  modules   := $(patsubst %.o,%.ko, $(wildcard $(__modules:.ko=.o)))  # Stop after building .o files if NOFINAL is set. Makes compile tests quicker @@ -78,12 +79,13 @@ modpost = scripts/mod/modpost                    \   $(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S)      \   $(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) +# We can go over command line length here, so be careful.  quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules -      cmd_modpost = $(modpost) -s +      cmd_modpost = $(MODLISTCMD) | sed 's/\.ko$$/.o/' | $(modpost) -s -T -  PHONY += __modpost  __modpost: $(modules:.ko=.o) FORCE -	$(call cmd,modpost) $(wildcard vmlinux) $(filter-out FORCE,$^) +	$(call cmd,modpost) $(wildcard vmlinux)  quiet_cmd_kernel-mod = MODPOST $@        cmd_kernel-mod = $(modpost) $@ diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c index 7f6425e24ce..078fe1d64e7 100644 --- a/scripts/basic/fixdep.c +++ b/scripts/basic/fixdep.c @@ -320,49 +320,78 @@ static void parse_dep_file(void *map, size_t len)  	char *end = m + len;  	char *p;  	char s[PATH_MAX]; -	int first; - -	p = strchr(m, ':'); -	if (!p) { -		fprintf(stderr, "fixdep: parse error\n"); -		exit(1); -	} -	memcpy(s, m, p-m); s[p-m] = 0; -	m = p+1; +	int is_target; +	int saw_any_target = 0; +	int is_first_dep = 0;  	clear_config(); -	first = 1;  	while (m < end) { +		/* Skip any "white space" */  		while (m < end && (*m == ' ' || *m == '\\' || *m == '\n'))  			m++; +		/* Find next "white space" */  		p = m; -		while (p < end && *p != ' ') p++; -		if (p == end) { -			do p--; while (!isalnum(*p)); +		while (p < end && *p != ' ' && *p != '\\' && *p != '\n')  			p++; +		/* Is the token we found a target name? */ +		is_target = (*(p-1) == ':'); +		/* Don't write any target names into the dependency file */ +		if (is_target) { +			/* The /next/ file is the first dependency */ +			is_first_dep = 1; +		} else { +			/* Save this token/filename */ +			memcpy(s, m, p-m); +			s[p - m] = 0; + +			/* Ignore certain dependencies */ +			if (strrcmp(s, "include/generated/autoconf.h") && +			    strrcmp(s, "arch/um/include/uml-config.h") && +			    strrcmp(s, "include/linux/kconfig.h") && +			    strrcmp(s, ".ver")) { +				/* +				 * Do not list the source file as dependency, +				 * so that kbuild is not confused if a .c file +				 * is rewritten into .S or vice versa. Storing +				 * it in source_* is needed for modpost to +				 * compute srcversions. +				 */ +				if (is_first_dep) { +					/* +					 * If processing the concatenation of +					 * multiple dependency files, only +					 * process the first target name, which +					 * will be the original source name, +					 * and ignore any other target names, +					 * which will be intermediate temporary +					 * files. +					 */ +					if (!saw_any_target) { +						saw_any_target = 1; +						printf("source_%s := %s\n\n", +							target, s); +						printf("deps_%s := \\\n", +							target); +					} +					is_first_dep = 0; +				} else +					printf("  %s \\\n", s); +				do_config_file(s); +			}  		} -		memcpy(s, m, p-m); s[p-m] = 0; -		if (strrcmp(s, "include/generated/autoconf.h") && -		    strrcmp(s, "arch/um/include/uml-config.h") && -		    strrcmp(s, "include/linux/kconfig.h") && -		    strrcmp(s, ".ver")) { -			/* -			 * Do not list the source file as dependency, so that -			 * kbuild is not confused if a .c file is rewritten -			 * into .S or vice versa. Storing it in source_* is -			 * needed for modpost to compute srcversions. -			 */ -			if (first) { -				printf("source_%s := %s\n\n", target, s); -				printf("deps_%s := \\\n", target); -			} else -				printf("  %s \\\n", s); -			do_config_file(s); -		} -		first = 0; +		/* +		 * Start searching for next token immediately after the first +		 * "whitespace" character that follows this token. +		 */  		m = p + 1;  	} + +	if (!saw_any_target) { +		fprintf(stderr, "fixdep: parse error; no targets found\n"); +		exit(1); +	} +  	printf("\n%s: $(deps_%s)\n\n", target, target);  	printf("$(deps_%s):\n", target);  } diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index b28cc384a5b..b954de58304 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -281,6 +281,7 @@ our $signature_tags = qr{(?xi:  	Tested-by:|  	Reviewed-by:|  	Reported-by:| +	Suggested-by:|  	To:|  	Cc:  )}; @@ -628,6 +629,13 @@ sub sanitise_line {  	return $res;  } +sub get_quoted_string { +	my ($line, $rawline) = @_; + +	return "" if ($line !~ m/(\"[X]+\")/g); +	return substr($rawline, $-[0], $+[0] - $-[0]); +} +  sub ctx_statement_block {  	my ($linenr, $remain, $off) = @_;  	my $line = $linenr - 1; @@ -1576,7 +1584,8 @@ sub process {  # Check for incorrect file permissions  		if ($line =~ /^new (file )?mode.*[7531]\d{0,2}$/) {  			my $permhere = $here . "FILE: $realfile\n"; -			if ($realfile =~ /(Makefile|Kconfig|\.c|\.h|\.S|\.tmpl)$/) { +			if ($realfile !~ m@scripts/@ && +			    $realfile !~ /\.(py|pl|awk|sh)$/) {  				ERROR("EXECUTE_PERMISSIONS",  				      "do not set execute permissions for source files\n" . $permhere);  			} @@ -2514,8 +2523,8 @@ sub process {  # check for whitespace before a non-naked semicolon  		if ($line =~ /^\+.*\S\s+;/) { -			CHK("SPACING", -			    "space prohibited before semicolon\n" . $herecurr); +			WARN("SPACING", +			     "space prohibited before semicolon\n" . $herecurr);  		}  # Check operator spacing. @@ -3016,6 +3025,7 @@ sub process {  			    $dstat !~ /^'X'$/ &&					# character constants  			    $dstat !~ /$exceptions/ &&  			    $dstat !~ /^\.$Ident\s*=/ &&				# .foo = +			    $dstat !~ /^(?:\#\s*$Ident|\#\s*$Constant)\s*$/ &&		# stringification #foo  			    $dstat !~ /^do\s*$Constant\s*while\s*$Constant;?$/ &&	# do {...} while (...); // do {...} while (...)  			    $dstat !~ /^for\s*$Constant$/ &&				# for (...)  			    $dstat !~ /^for\s*$Constant\s+(?:$Ident|-?$Constant)$/ &&	# for (...) bar() @@ -3220,7 +3230,7 @@ sub process {  		}  # check for unnecessary blank lines around braces -		if (($line =~ /^..*}\s*$/ && $prevline =~ /^.\s*$/)) { +		if (($line =~ /^.\s*}\s*$/ && $prevline =~ /^.\s*$/)) {  			CHK("BRACES",  			    "Blank lines aren't necessary before a close brace '}'\n" . $hereprev);  		} @@ -3372,6 +3382,15 @@ sub process {  			     "struct spinlock should be spinlock_t\n" . $herecurr);  		} +# check for seq_printf uses that could be seq_puts +		if ($line =~ /\bseq_printf\s*\(/) { +			my $fmt = get_quoted_string($line, $rawline); +			if ($fmt !~ /[^\\]\%/) { +				WARN("PREFER_SEQ_PUTS", +				     "Prefer seq_puts to seq_printf\n" . $herecurr); +			} +		} +  # Check for misused memsets  		if ($^V && $^V ge 5.10.0 &&  		    defined $stat && @@ -3476,6 +3495,13 @@ sub process {  			     "unnecessary cast may hide bugs, see http://c-faq.com/malloc/mallocnocast.html\n" . $herecurr);  		} +# check for krealloc arg reuse +		if ($^V && $^V ge 5.10.0 && +		    $line =~ /\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*krealloc\s*\(\s*\1\s*,/) { +			WARN("KREALLOC_ARG_REUSE", +			     "Reusing the krealloc arg is almost always a bug\n" . $herecurr); +		} +  # check for alloc argument mismatch  		if ($line =~ /\b(kcalloc|kmalloc_array)\s*\(\s*sizeof\b/) {  			WARN("ALLOC_ARRAY_ARGS", diff --git a/scripts/decodecode b/scripts/decodecode index 4f8248d5a11..d8824f37acc 100755 --- a/scripts/decodecode +++ b/scripts/decodecode @@ -89,10 +89,16 @@ echo $code >> $T.s  disas $T  cat $T.dis >> $T.aa +# (lines of whole $T.oo) - (lines of $T.aa, i.e. "Code starting") + 3, +# i.e. the title + the "===..=" line (sed is counting from 1, 0 address is +# special) +faultlinenum=$(( $(wc -l $T.oo  | cut -d" " -f1) - \ +		 $(wc -l $T.aa  | cut -d" " -f1) + 3)) +  faultline=`cat $T.dis | head -1 | cut -d":" -f2-`  faultline=`echo "$faultline" | sed -e 's/\[/\\\[/g; s/\]/\\\]/g'` -cat $T.oo | sed -e "s/\($faultline\)/\*\1     <-- trapping instruction/g" +cat $T.oo | sed -e "${faultlinenum}s/^\(.*:\)\(.*\)/\1\*\2\t\t<-- trapping instruction/"  echo  cat $T.aa  cleanup diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c index d25e4a118d3..88632df4381 100644 --- a/scripts/genksyms/genksyms.c +++ b/scripts/genksyms/genksyms.c @@ -45,7 +45,6 @@ int in_source_file;  static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,  	   flag_preserve, flag_warnings; -static const char *arch = "";  static const char *mod_prefix = "";  static int errors; @@ -731,7 +730,7 @@ static void genksyms_usage(void)  {  	fputs("Usage:\n" "genksyms [-adDTwqhV] > /path/to/.tmp_obj.ver\n" "\n"  #ifdef __GNU_LIBRARY__ -	      "  -a, --arch            Select architecture\n" +	      "  -s, --symbol-prefix   Select symbol prefix\n"  	      "  -d, --debug           Increment the debug level (repeatable)\n"  	      "  -D, --dump            Dump expanded symbol defs (for debugging only)\n"  	      "  -r, --reference file  Read reference symbols from a file\n" @@ -742,7 +741,7 @@ static void genksyms_usage(void)  	      "  -h, --help            Print this message\n"  	      "  -V, --version         Print the release version\n"  #else				/* __GNU_LIBRARY__ */ -	      "  -a                    Select architecture\n" +	      "  -s                    Select symbol prefix\n"  	      "  -d                    Increment the debug level (repeatable)\n"  	      "  -D                    Dump expanded symbol defs (for debugging only)\n"  	      "  -r file               Read reference symbols from a file\n" @@ -763,7 +762,7 @@ int main(int argc, char **argv)  #ifdef __GNU_LIBRARY__  	struct option long_opts[] = { -		{"arch", 1, 0, 'a'}, +		{"symbol-prefix", 1, 0, 's'},  		{"debug", 0, 0, 'd'},  		{"warnings", 0, 0, 'w'},  		{"quiet", 0, 0, 'q'}, @@ -776,14 +775,14 @@ int main(int argc, char **argv)  		{0, 0, 0, 0}  	}; -	while ((o = getopt_long(argc, argv, "a:dwqVDr:T:ph", +	while ((o = getopt_long(argc, argv, "s:dwqVDr:T:ph",  				&long_opts[0], NULL)) != EOF)  #else				/* __GNU_LIBRARY__ */ -	while ((o = getopt(argc, argv, "a:dwqVDr:T:ph")) != EOF) +	while ((o = getopt(argc, argv, "s:dwqVDr:T:ph")) != EOF)  #endif				/* __GNU_LIBRARY__ */  		switch (o) { -		case 'a': -			arch = optarg; +		case 's': +			mod_prefix = optarg;  			break;  		case 'd':  			flag_debug++; @@ -826,9 +825,6 @@ int main(int argc, char **argv)  			genksyms_usage();  			return 1;  		} -	if ((strcmp(arch, "h8300") == 0) || (strcmp(arch, "blackfin") == 0) || -	    (strcmp(arch, "metag") == 0)) -		mod_prefix = "_";  	{  		extern int yydebug;  		extern int yy_flex_debug; diff --git a/scripts/get_maintainer.pl b/scripts/get_maintainer.pl index ce4cc837b74..5e4fb144a04 100755 --- a/scripts/get_maintainer.pl +++ b/scripts/get_maintainer.pl @@ -611,7 +611,7 @@ sub get_maintainers {  				    $hash{$tvi} = $value_pd;  				}  			    } -			} elsif ($type eq 'K') { +			} elsif ($type eq 'N') {  			    if ($file =~ m/$value/x) {  				$hash{$tvi} = 0;  			    } diff --git a/scripts/headers_install.pl b/scripts/headers_install.pl deleted file mode 100644 index 581ca99c96f..00000000000 --- a/scripts/headers_install.pl +++ /dev/null @@ -1,63 +0,0 @@ -#!/usr/bin/perl -w -# -# headers_install prepare the listed header files for use in -# user space and copy the files to their destination. -# -# Usage: headers_install.pl readdir installdir arch [files...] -# installdir: dir to install the files to -# arch:       current architecture -#             arch is used to force a reinstallation when the arch -#             changes because kbuild then detect a command line change. -# files:      list of files to check -# -# Step in preparation for users space: -# 1) Drop all use of compiler.h definitions -# 2) Drop include of compiler.h -# 3) Drop all sections defined out by __KERNEL__ (using unifdef) - -use strict; - -my ($installdir, $arch, @files) = @ARGV; - -my $unifdef = "scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__"; - -foreach my $filename (@files) { -	my $file = $filename; -	$file =~ s!^.*/!!; - -	my $tmpfile = "$installdir/$file.tmp"; - -	open(my $in, '<', $filename) -	    or die "$filename: $!\n"; -	open(my $out, '>', $tmpfile) -	    or die "$tmpfile: $!\n"; -	while (my $line = <$in>) { -		$line =~ s/([\s(])__user\s/$1/g; -		$line =~ s/([\s(])__force\s/$1/g; -		$line =~ s/([\s(])__iomem\s/$1/g; -		$line =~ s/\s__attribute_const__\s/ /g; -		$line =~ s/\s__attribute_const__$//g; -		$line =~ s/\b__packed\b/__attribute__((packed))/g; -		$line =~ s/^#include <linux\/compiler.h>//; -		$line =~ s/(^|\s)(inline)\b/$1__$2__/g; -		$line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g; -		$line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g; -		$line =~ s/#ifndef\s+_UAPI/#ifndef /; -		$line =~ s/#define\s+_UAPI/#define /; -		$line =~ s!#endif\s+/[*]\s*_UAPI!#endif /* !; -		printf {$out} "%s", $line; -	} -	close $out; -	close $in; - -	system $unifdef . " $tmpfile > $installdir/$file"; -	# unifdef will exit 0 on success, and will exit 1 when the -	# file was processed successfully but no changes were made, -	# so abort only when it's higher than that. -	my $e = $? >> 8; -	if ($e > 1) { -		die "$tmpfile: $!\n"; -	} -	unlink $tmpfile; -} -exit 0; diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh new file mode 100644 index 00000000000..643764f53ea --- /dev/null +++ b/scripts/headers_install.sh @@ -0,0 +1,43 @@ +#!/bin/sh + +if [ $# -lt 1 ] +then +	echo "Usage: headers_install.sh OUTDIR [FILES...] +	echo +	echo "Prepares kernel header files for use by user space, by removing" +	echo "all compiler.h definitions and #includes, removing any" +	echo "#ifdef __KERNEL__ sections, and putting __underscores__ around" +	echo "asm/inline/volatile keywords." +	echo +	echo "OUTDIR: directory to write each userspace header FILE to." +	echo "FILES:  list of header files to operate on." + +	exit 1 +fi + +# Grab arguments + +OUTDIR="$1" +shift + +# Iterate through files listed on command line + +FILE= +trap 'rm -f "$OUTDIR/$FILE" "$OUTDIR/$FILE.sed"' EXIT +for i in "$@" +do +	FILE="$(basename "$i")" +	sed -r \ +		-e 's/([ \t(])(__user|__force|__iomem)[ \t]/\1/g' \ +		-e 's/__attribute_const__([ \t]|$)/\1/g' \ +		-e 's@^#include <linux/compiler.h>@@' \ +		-e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \ +		-e 's/(^|[ \t(])(inline|asm|volatile)([ \t(]|$)/\1__\2__\3/g' \ +		-e 's@#(ifndef|define|endif[ \t]*/[*])[ \t]*_UAPI@#\1 @' \ +		"$i" > "$OUTDIR/$FILE.sed" || exit 1 +	scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \ +		> "$OUTDIR/$FILE" +	[ $? -gt 1 ] && exit 1 +	rm -f "$OUTDIR/$FILE.sed" +done +trap - EXIT diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile index 231b4759c71..844bc9da08d 100644 --- a/scripts/kconfig/Makefile +++ b/scripts/kconfig/Makefile @@ -219,7 +219,9 @@ HOSTCFLAGS_gconf.o	= `pkg-config --cflags gtk+-2.0 gmodule-2.0 libglade-2.0` \  HOSTLOADLIBES_mconf   = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC)) -HOSTLOADLIBES_nconf	= -lmenu -lpanel -lncurses +HOSTLOADLIBES_nconf	= $(shell \ +				pkg-config --libs menu panel ncurses 2>/dev/null \ +				|| echo "-lmenu -lpanel -lncurses"  )  $(obj)/qconf.o: $(obj)/.tmp_qtcheck  ifeq ($(qconf-target),1) diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index e39fcd8143e..bde5b95c8c1 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -13,6 +13,7 @@  #include <getopt.h>  #include <sys/stat.h>  #include <sys/time.h> +#include <errno.h>  #include "lkc.h" @@ -514,14 +515,23 @@ int main(int ac, char **av)  		{  			struct timeval now;  			unsigned int seed; +			char *seed_env;  			/*  			 * Use microseconds derived seed,  			 * compensate for systems where it may be zero  			 */  			gettimeofday(&now, NULL); -  			seed = (unsigned int)((now.tv_sec + 1) * (now.tv_usec + 1)); + +			seed_env = getenv("KCONFIG_SEED"); +			if( seed_env && *seed_env ) { +				char *endp; +				int tmp = (int)strtol(seed_env, &endp, 10); +				if (*endp == '\0') { +					seed = tmp; +				} +			}  			srand(seed);  			break;  		} diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 13ddf1126c2..43eda40c383 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -1106,10 +1106,54 @@ static void set_all_choice_values(struct symbol *csym)  void conf_set_all_new_symbols(enum conf_def_mode mode)  {  	struct symbol *sym, *csym; -	int i, cnt; +	int i, cnt, pby, pty, ptm;	/* pby: probability of boolean  = y +					 * pty: probability of tristate = y +					 * ptm: probability of tristate = m +					 */ + +	pby = 50; pty = ptm = 33; /* can't go as the default in switch-case +				   * below, otherwise gcc whines about +				   * -Wmaybe-uninitialized */ +	if (mode == def_random) { +		int n, p[3]; +		char *env = getenv("KCONFIG_PROBABILITY"); +		n = 0; +		while( env && *env ) { +			char *endp; +			int tmp = strtol( env, &endp, 10 ); +			if( tmp >= 0 && tmp <= 100 ) { +				p[n++] = tmp; +			} else { +				errno = ERANGE; +				perror( "KCONFIG_PROBABILITY" ); +				exit( 1 ); +			} +			env = (*endp == ':') ? endp+1 : endp; +			if( n >=3 ) { +				break; +			} +		} +		switch( n ) { +		case 1: +			pby = p[0]; ptm = pby/2; pty = pby-ptm; +			break; +		case 2: +			pty = p[0]; ptm = p[1]; pby = pty + ptm; +			break; +		case 3: +			pby = p[0]; pty = p[1]; ptm = p[2]; +			break; +		} + +		if( pty+ptm > 100 ) { +			errno = ERANGE; +			perror( "KCONFIG_PROBABILITY" ); +			exit( 1 ); +		} +	}  	for_all_symbols(i, sym) { -		if (sym_has_value(sym)) +		if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID))  			continue;  		switch (sym_get_type(sym)) {  		case S_BOOLEAN: @@ -1125,8 +1169,15 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)  				sym->def[S_DEF_USER].tri = no;  				break;  			case def_random: -				cnt = sym_get_type(sym) == S_TRISTATE ? 3 : 2; -				sym->def[S_DEF_USER].tri = (tristate)(rand() % cnt); +				sym->def[S_DEF_USER].tri = no; +				cnt = rand() % 100; +				if (sym->type == S_TRISTATE) { +					if (cnt < pty) +						sym->def[S_DEF_USER].tri = yes; +					else if (cnt < (pty+ptm)) +						sym->def[S_DEF_USER].tri = mod; +				} else if (cnt < pby) +					sym->def[S_DEF_USER].tri = yes;  				break;  			default:  				continue; diff --git a/scripts/kconfig/list.h b/scripts/kconfig/list.h index 0ae730be5f4..685d80e1bb0 100644 --- a/scripts/kconfig/list.h +++ b/scripts/kconfig/list.h @@ -51,6 +51,19 @@ struct list_head {  	     pos = list_entry(pos->member.next, typeof(*pos), member))  /** + * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry + * @pos:	the type * to use as a loop cursor. + * @n:		another type * to use as temporary storage + * @head:	the head for your list. + * @member:	the name of the list_struct within the struct. + */ +#define list_for_each_entry_safe(pos, n, head, member)			\ +	for (pos = list_entry((head)->next, typeof(*pos), member),	\ +		n = list_entry(pos->member.next, typeof(*pos), member);	\ +	     &pos->member != (head);					\ +	     pos = n, n = list_entry(n->member.next, typeof(*n), member)) + +/**   * list_empty - tests whether a list is empty   * @head: the list to test.   */ @@ -88,4 +101,31 @@ static inline void list_add_tail(struct list_head *_new, struct list_head *head)  	__list_add(_new, head->prev, head);  } +/* + * Delete a list entry by making the prev/next entries + * point to each other. + * + * This is only for internal list manipulation where we know + * the prev/next entries already! + */ +static inline void __list_del(struct list_head *prev, struct list_head *next) +{ +	next->prev = prev; +	prev->next = next; +} + +#define LIST_POISON1  ((void *) 0x00100100) +#define LIST_POISON2  ((void *) 0x00200200) +/** + * list_del - deletes entry from list. + * @entry: the element to delete from the list. + * Note: list_empty() on entry does not return true after this, the entry is + * in an undefined state. + */ +static inline void list_del(struct list_head *entry) +{ +	__list_del(entry->prev, entry->next); +	entry->next = (struct list_head*)LIST_POISON1; +	entry->prev = (struct list_head*)LIST_POISON2; +}  #endif diff --git a/scripts/kconfig/lxdialog/check-lxdialog.sh b/scripts/kconfig/lxdialog/check-lxdialog.sh index 80788137c67..9d2a4c585ee 100644 --- a/scripts/kconfig/lxdialog/check-lxdialog.sh +++ b/scripts/kconfig/lxdialog/check-lxdialog.sh @@ -4,6 +4,8 @@  # What library to link  ldflags()  { +	pkg-config --libs ncursesw 2>/dev/null && exit +	pkg-config --libs ncurses 2>/dev/null && exit  	for ext in so a dll.a dylib ; do  		for lib in ncursesw ncurses curses ; do  			$cc -print-file-name=lib${lib}.${ext} | grep -q / @@ -20,12 +22,12 @@ ldflags()  ccflags()  {  	if [ -f /usr/include/ncursesw/curses.h ]; then -		echo '-I/usr/include/ncursesw -DCURSES_LOC="<ncursesw/curses.h>"' +		echo '-I/usr/include/ncursesw -DCURSES_LOC="<curses.h>"'  		echo ' -DNCURSES_WIDECHAR=1'  	elif [ -f /usr/include/ncurses/ncurses.h ]; then  		echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses.h>"'  	elif [ -f /usr/include/ncurses/curses.h ]; then -		echo '-I/usr/include/ncurses -DCURSES_LOC="<ncurses/curses.h>"' +		echo '-I/usr/include/ncurses -DCURSES_LOC="<curses.h>"'  	elif [ -f /usr/include/ncurses.h ]; then  		echo '-DCURSES_LOC="<ncurses.h>"'  	else diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h index 307022a8bee..1099337079b 100644 --- a/scripts/kconfig/lxdialog/dialog.h +++ b/scripts/kconfig/lxdialog/dialog.h @@ -106,8 +106,14 @@ struct dialog_color {  	int hl;		/* highlight this item */  }; +struct subtitle_list { +	struct subtitle_list *next; +	const char *text; +}; +  struct dialog_info {  	const char *backtitle; +	struct subtitle_list *subtitles;  	struct dialog_color screen;  	struct dialog_color shadow;  	struct dialog_color dialog; @@ -196,6 +202,7 @@ int on_key_resize(void);  int init_dialog(const char *backtitle);  void set_dialog_backtitle(const char *backtitle); +void set_dialog_subtitles(struct subtitle_list *subtitles);  void end_dialog(int x, int y);  void attr_clear(WINDOW * win, int height, int width, chtype attr);  void dialog_clear(void); diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c index 109d53117d2..a0e97c29941 100644 --- a/scripts/kconfig/lxdialog/util.c +++ b/scripts/kconfig/lxdialog/util.c @@ -257,12 +257,48 @@ void dialog_clear(void)  	attr_clear(stdscr, LINES, COLS, dlg.screen.atr);  	/* Display background title if it exists ... - SLH */  	if (dlg.backtitle != NULL) { -		int i; +		int i, len = 0, skip = 0; +		struct subtitle_list *pos;  		wattrset(stdscr, dlg.screen.atr);  		mvwaddstr(stdscr, 0, 1, (char *)dlg.backtitle); + +		for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { +			/* 3 is for the arrow and spaces */ +			len += strlen(pos->text) + 3; +		} +  		wmove(stdscr, 1, 1); -		for (i = 1; i < COLS - 1; i++) +		if (len > COLS - 2) { +			const char *ellipsis = "[...] "; +			waddstr(stdscr, ellipsis); +			skip = len - (COLS - 2 - strlen(ellipsis)); +		} + +		for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { +			if (skip == 0) +				waddch(stdscr, ACS_RARROW); +			else +				skip--; + +			if (skip == 0) +				waddch(stdscr, ' '); +			else +				skip--; + +			if (skip < strlen(pos->text)) { +				waddstr(stdscr, pos->text + skip); +				skip = 0; +			} else +				skip -= strlen(pos->text); + +			if (skip == 0) +				waddch(stdscr, ' '); +			else +				skip--; +		} + +		for (i = len + 1; i < COLS - 1; i++)  			waddch(stdscr, ACS_HLINE);  	}  	wnoutrefresh(stdscr); @@ -302,6 +338,11 @@ void set_dialog_backtitle(const char *backtitle)  	dlg.backtitle = backtitle;  } +void set_dialog_subtitles(struct subtitle_list *subtitles) +{ +	dlg.subtitles = subtitles; +} +  /*   * End using dialog functions.   */ diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index 566288a7637..387dc8daf7b 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -311,6 +311,50 @@ static void set_config_filename(const char *config_filename)  		filename[sizeof(filename)-1] = '\0';  } +struct subtitle_part { +	struct list_head entries; +	const char *text; +}; +static LIST_HEAD(trail); + +static struct subtitle_list *subtitles; +static void set_subtitle(void) +{ +	struct subtitle_part *sp; +	struct subtitle_list *pos, *tmp; + +	for (pos = subtitles; pos != NULL; pos = tmp) { +		tmp = pos->next; +		free(pos); +	} + +	subtitles = NULL; +	list_for_each_entry(sp, &trail, entries) { +		if (sp->text) { +			if (pos) { +				pos->next = xcalloc(sizeof(*pos), 1); +				pos = pos->next; +			} else { +				subtitles = pos = xcalloc(sizeof(*pos), 1); +			} +			pos->text = sp->text; +		} +	} + +	set_dialog_subtitles(subtitles); +} + +static void reset_subtitle(void) +{ +	struct subtitle_list *pos, *tmp; + +	for (pos = subtitles; pos != NULL; pos = tmp) { +		tmp = pos->next; +		free(pos); +	} +	subtitles = NULL; +	set_dialog_subtitles(subtitles); +}  struct search_data {  	struct list_head *head; @@ -353,6 +397,8 @@ static void search_conf(void)  	char *dialog_input;  	int dres, vscroll = 0, hscroll = 0;  	bool again; +	struct gstr sttext; +	struct subtitle_part stpart;  	title = str_new();  	str_printf( &title, _("Enter %s (sub)string to search for " @@ -379,6 +425,11 @@ again:  	if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)  		dialog_input += strlen(CONFIG_); +	sttext = str_new(); +	str_printf(&sttext, "Search (%s)", dialog_input_result); +	stpart.text = str_get(&sttext); +	list_add_tail(&stpart.entries, &trail); +  	sym_arr = sym_re_search(dialog_input);  	do {  		LIST_HEAD(head); @@ -389,8 +440,10 @@ again:  			.targets = targets,  			.keys = keys,  		}; +		struct jump_key *pos, *tmp;  		res = get_relations_str(sym_arr, &head); +		set_subtitle();  		dres = show_textbox_ext(_("Search Results"), (char *)  					str_get(&res), 0, 0, keys, &vscroll,  					&hscroll, &update_text, (void *) @@ -402,9 +455,13 @@ again:  				again = true;  			}  		str_free(&res); +		list_for_each_entry_safe(pos, tmp, &head, entries) +			free(pos);  	} while (again);  	free(sym_arr);  	str_free(&title); +	list_del(trail.prev); +	str_free(&sttext);  }  static void build_conf(struct menu *menu) @@ -589,16 +646,24 @@ static void conf(struct menu *menu, struct menu *active_menu)  {  	struct menu *submenu;  	const char *prompt = menu_get_prompt(menu); +	struct subtitle_part stpart;  	struct symbol *sym;  	int res;  	int s_scroll = 0; +	if (menu != &rootmenu) +		stpart.text = menu_get_prompt(menu); +	else +		stpart.text = NULL; +	list_add_tail(&stpart.entries, &trail); +  	while (1) {  		item_reset();  		current_menu = menu;  		build_conf(menu);  		if (!child_count)  			break; +		set_subtitle();  		dialog_clear();  		res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),  				  _(menu_instructions), @@ -640,13 +705,17 @@ static void conf(struct menu *menu, struct menu *active_menu)  		case 2:  			if (sym)  				show_help(submenu); -			else +			else { +				reset_subtitle();  				show_helptext(_("README"), _(mconf_readme)); +			}  			break;  		case 3: +			reset_subtitle();  			conf_save();  			break;  		case 4: +			reset_subtitle();  			conf_load();  			break;  		case 5: @@ -679,6 +748,8 @@ static void conf(struct menu *menu, struct menu *active_menu)  			break;  		}  	} + +	list_del(trail.prev);  }  static int show_textbox_ext(const char *title, char *text, int r, int c, int @@ -881,6 +952,7 @@ static int handle_exit(void)  	int res;  	save_and_exit = 1; +	reset_subtitle();  	dialog_clear();  	if (conf_get_changed())  		res = dialog_yesno(NULL, diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index f3bffa30933..b5c7d90df9d 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -515,13 +515,6 @@ static void get_prompt_str(struct gstr *r, struct property *prop,  	struct jump_key *jump;  	str_printf(r, _("Prompt: %s\n"), _(prop->text)); -	str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name, -		prop->menu->lineno); -	if (!expr_is_yes(prop->visible.expr)) { -		str_append(r, _("  Depends on: ")); -		expr_gstr_print(prop->visible.expr, r); -		str_append(r, "\n"); -	}  	menu = prop->menu->parent;  	for (i = 0; menu != &rootmenu && i < 8; menu = menu->parent) {  		bool accessible = menu_is_visible(menu); @@ -572,6 +565,18 @@ static void get_prompt_str(struct gstr *r, struct property *prop,  }  /* + * get peoperty of type P_SYMBOL + */ +static struct property *get_symbol_prop(struct symbol *sym) +{ +	struct property *prop = NULL; + +	for_all_properties(sym, prop, P_SYMBOL) +		break; +	return prop; +} + +/*   * head is optional and may be NULL   */  void get_symbol_str(struct gstr *r, struct symbol *sym, @@ -595,6 +600,18 @@ void get_symbol_str(struct gstr *r, struct symbol *sym,  	}  	for_all_prompts(sym, prop)  		get_prompt_str(r, prop, head); + +	prop = get_symbol_prop(sym); +	if (prop) { +		str_printf(r, _("  Defined at %s:%d\n"), prop->menu->file->name, +			prop->menu->lineno); +		if (!expr_is_yes(prop->visible.expr)) { +			str_append(r, _("  Depends on: ")); +			expr_gstr_print(prop->visible.expr, r); +			str_append(r, "\n"); +		} +	} +  	hit = false;  	for_all_properties(sym, prop, P_SELECT) {  		if (!hit) { diff --git a/scripts/kconfig/merge_config.sh b/scripts/kconfig/merge_config.sh index 05274fccb88..81b0c61bb9e 100755 --- a/scripts/kconfig/merge_config.sh +++ b/scripts/kconfig/merge_config.sh @@ -120,10 +120,18 @@ if [ "$MAKE" = "false" ]; then  	exit  fi +# If we have an output dir, setup the O= argument, otherwise leave +# it blank, since O=. will create an unnecessary ./source softlink +OUTPUT_ARG="" +if [ "$OUTPUT" != "." ] ; then +	OUTPUT_ARG="O=$OUTPUT" +fi + +  # Use the merged file as the starting point for:  # alldefconfig: Fills in any missing symbols with Kconfig default  # allnoconfig: Fills in any missing symbols with # CONFIG_* is not set -make KCONFIG_ALLCONFIG=$TMP_FILE O=$OUTPUT $ALLTARGET +make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET  # Check all specified config values took (might have missed-dependency issues) diff --git a/scripts/kconfig/streamline_config.pl b/scripts/kconfig/streamline_config.pl index 33689396953..4606cdfb859 100644 --- a/scripts/kconfig/streamline_config.pl +++ b/scripts/kconfig/streamline_config.pl @@ -156,7 +156,6 @@ sub read_kconfig {      my $state = "NONE";      my $config; -    my @kconfigs;      my $cont = 0;      my $line; @@ -190,7 +189,13 @@ sub read_kconfig {  	# collect any Kconfig sources  	if (/^source\s*"(.*)"/) { -	    $kconfigs[$#kconfigs+1] = $1; +	    my $kconfig = $1; +	    # prevent reading twice. +	    if (!defined($read_kconfigs{$kconfig})) { +		$read_kconfigs{$kconfig} = 1; +		read_kconfig($kconfig); +	    } +	    next;  	}  	# configs found @@ -250,14 +255,6 @@ sub read_kconfig {  	}      }      close($kinfile); - -    # read in any configs that were found. -    foreach my $kconfig (@kconfigs) { -	if (!defined($read_kconfigs{$kconfig})) { -	    $read_kconfigs{$kconfig} = 1; -	    read_kconfig($kconfig); -	} -    }  }  if ($kconfig) { @@ -396,6 +393,15 @@ foreach my $module (keys(%modules)) {  	foreach my $conf (@arr) {  	    $configs{$conf} = $module;  	    dprint "$conf added by direct ($module)\n"; +	    if ($debugprint) { +		my $c=$conf; +		$c =~ s/^CONFIG_//; +		if (defined($depends{$c})) { +		    dprint " deps = $depends{$c}\n"; +		} else { +		    dprint " no deps\n"; +		} +	    }  	}      } else {  	# Most likely, someone has a custom (binary?) module loaded. diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh index 3d569d6022c..014994936b1 100644 --- a/scripts/link-vmlinux.sh +++ b/scripts/link-vmlinux.sh @@ -74,9 +74,8 @@ kallsyms()  	info KSYM ${2}  	local kallsymopt; -	if [ -n "${CONFIG_SYMBOL_PREFIX}" ]; then -		kallsymopt="${kallsymopt} \ -			    --symbol-prefix=${CONFIG_SYMBOL_PREFIX}" +	if [ -n "${CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX}" ]; then +		kallsymopt="${kallsymopt} --symbol-prefix=_"  	fi  	if [ -n "${CONFIG_KALLSYMS_ALL}" ]; then diff --git a/scripts/mod/Makefile b/scripts/mod/Makefile index 9415b566336..75d59fcd48b 100644 --- a/scripts/mod/Makefile +++ b/scripts/mod/Makefile @@ -37,6 +37,8 @@ scripts/mod/devicetable-offsets.s: scripts/mod/devicetable-offsets.c FORCE  $(obj)/$(devicetable-offsets-file): scripts/mod/devicetable-offsets.s  	$(call cmd,offsets) +targets += $(devicetable-offsets-file) +  # dependencies on generated files need to be listed explicitly  $(obj)/modpost.o $(obj)/file2alias.o $(obj)/sumversion.o: $(obj)/elfconfig.h diff --git a/scripts/mod/devicetable-offsets.c b/scripts/mod/devicetable-offsets.c index b45260bfeaa..e66d4d258e1 100644 --- a/scripts/mod/devicetable-offsets.c +++ b/scripts/mod/devicetable-offsets.c @@ -174,5 +174,8 @@ int main(void)  	DEVID_FIELD(x86_cpu_id, model);  	DEVID_FIELD(x86_cpu_id, vendor); +	DEVID(mei_cl_device_id); +	DEVID_FIELD(mei_cl_device_id, name); +  	return 0;  } diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index 771ac17f635..45f9a3377dc 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -1133,6 +1133,18 @@ static int do_x86cpu_entry(const char *filename, void *symval,  }  ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry); +/* Looks like: mei:S */ +static int do_mei_entry(const char *filename, void *symval, +			char *alias) +{ +	DEF_FIELD_ADDR(symval, mei_cl_device_id, name); + +	sprintf(alias, MEI_CL_MODULE_PREFIX "%s", *name); + +	return 1; +} +ADD_TO_DEVTABLE("mei", mei_cl_device_id, do_mei_entry); +  /* Does namelen bytes of name exactly match the symbol? */  static bool sym_is(const char *name, unsigned namelen, const char *symbol)  { diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 78b30c1548e..a4be8e112bb 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -15,17 +15,12 @@  #include <stdio.h>  #include <ctype.h>  #include <string.h> +#include <limits.h> +#include <stdbool.h>  #include "modpost.h"  #include "../../include/generated/autoconf.h"  #include "../../include/linux/license.h" - -/* Some toolchains use a `_' prefix for all user symbols. */ -#ifdef CONFIG_SYMBOL_PREFIX -#define MODULE_SYMBOL_PREFIX CONFIG_SYMBOL_PREFIX -#else -#define MODULE_SYMBOL_PREFIX "" -#endif - +#include "../../include/linux/export.h"  /* Are we using CONFIG_MODVERSIONS? */  int modversions = 0; @@ -85,6 +80,14 @@ PRINTF void merror(const char *fmt, ...)  	va_end(arglist);  } +static inline bool strends(const char *str, const char *postfix) +{ +	if (strlen(str) < strlen(postfix)) +		return false; + +	return strcmp(str + strlen(str) - strlen(postfix), postfix) == 0; +} +  static int is_vmlinux(const char *modname)  {  	const char *myname; @@ -120,22 +123,20 @@ static struct module *find_module(char *modname)  	return mod;  } -static struct module *new_module(char *modname) +static struct module *new_module(const char *modname)  {  	struct module *mod; -	char *p, *s; +	char *p;  	mod = NOFAIL(malloc(sizeof(*mod)));  	memset(mod, 0, sizeof(*mod));  	p = NOFAIL(strdup(modname));  	/* strip trailing .o */ -	s = strrchr(p, '.'); -	if (s != NULL) -		if (strcmp(s, ".o") == 0) { -			*s = '\0'; -			mod->is_dot_o = 1; -		} +	if (strends(p, ".o")) { +		p[strlen(p) - 2] = '\0'; +		mod->is_dot_o = 1; +	}  	/* add to list */  	mod->name = p; @@ -562,7 +563,7 @@ static void parse_elf_finish(struct elf_info *info)  static int ignore_undef_symbol(struct elf_info *info, const char *symname)  {  	/* ignore __this_module, it will be resolved shortly */ -	if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0) +	if (strcmp(symname, VMLINUX_SYMBOL_STR(__this_module)) == 0)  		return 1;  	/* ignore global offset table */  	if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0) @@ -583,8 +584,8 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)  	return 0;  } -#define CRC_PFX     MODULE_SYMBOL_PREFIX "__crc_" -#define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_" +#define CRC_PFX     VMLINUX_SYMBOL_STR(__crc_) +#define KSYMTAB_PFX VMLINUX_SYMBOL_STR(__ksymtab_)  static void handle_modversions(struct module *mod, struct elf_info *info,  			       Elf_Sym *sym, const char *symname) @@ -637,14 +638,15 @@ static void handle_modversions(struct module *mod, struct elf_info *info,  		}  #endif -		if (memcmp(symname, MODULE_SYMBOL_PREFIX, -			   strlen(MODULE_SYMBOL_PREFIX)) == 0) { -			mod->unres = -			  alloc_symbol(symname + -			               strlen(MODULE_SYMBOL_PREFIX), -			               ELF_ST_BIND(sym->st_info) == STB_WEAK, -			               mod->unres); -		} +#ifdef CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX +		if (symname[0] != '_') +			break; +		else +			symname++; +#endif +		mod->unres = alloc_symbol(symname, +					  ELF_ST_BIND(sym->st_info) == STB_WEAK, +					  mod->unres);  		break;  	default:  		/* All exported symbols */ @@ -652,9 +654,9 @@ static void handle_modversions(struct module *mod, struct elf_info *info,  			sym_add_exported(symname + strlen(KSYMTAB_PFX), mod,  					export);  		} -		if (strcmp(symname, MODULE_SYMBOL_PREFIX "init_module") == 0) +		if (strcmp(symname, VMLINUX_SYMBOL_STR(init_module)) == 0)  			mod->has_init = 1; -		if (strcmp(symname, MODULE_SYMBOL_PREFIX "cleanup_module") == 0) +		if (strcmp(symname, VMLINUX_SYMBOL_STR(cleanup_module)) == 0)  			mod->has_cleanup = 1;  		break;  	} @@ -1762,6 +1764,27 @@ static void read_symbols(char *modname)  		mod->unres = alloc_symbol("module_layout", 0, mod->unres);  } +static void read_symbols_from_files(const char *filename) +{ +	FILE *in = stdin; +	char fname[PATH_MAX]; + +	if (strcmp(filename, "-") != 0) { +		in = fopen(filename, "r"); +		if (!in) +			fatal("Can't open filenames file %s: %m", filename); +	} + +	while (fgets(fname, PATH_MAX, in) != NULL) { +		if (strends(fname, "\n")) +			fname[strlen(fname)-1] = '\0'; +		read_symbols(fname); +	} + +	if (in != stdin) +		fclose(in); +} +  #define SZ 500  /* We first write the generated file into memory using the @@ -1934,7 +1957,8 @@ static int add_versions(struct buffer *b, struct module *mod)  				s->name, mod->name);  			continue;  		} -		buf_printf(b, "\t{ %#8x, \"%s\" },\n", s->crc, s->name); +		buf_printf(b, "\t{ %#8x, __VMLINUX_SYMBOL_STR(%s) },\n", +			   s->crc, s->name);  	}  	buf_printf(b, "};\n"); @@ -2122,13 +2146,13 @@ int main(int argc, char **argv)  	struct module *mod;  	struct buffer buf = { };  	char *kernel_read = NULL, *module_read = NULL; -	char *dump_write = NULL; +	char *dump_write = NULL, *files_source = NULL;  	int opt;  	int err;  	struct ext_sym_list *extsym_iter;  	struct ext_sym_list *extsym_start = NULL; -	while ((opt = getopt(argc, argv, "i:I:e:msSo:awM:K:")) != -1) { +	while ((opt = getopt(argc, argv, "i:I:e:msST:o:awM:K:")) != -1) {  		switch (opt) {  		case 'i':  			kernel_read = optarg; @@ -2160,6 +2184,9 @@ int main(int argc, char **argv)  		case 'S':  			sec_mismatch_verbose = 0;  			break; +		case 'T': +			files_source = optarg; +			break;  		case 'w':  			warn_unresolved = 1;  			break; @@ -2182,6 +2209,9 @@ int main(int argc, char **argv)  	while (optind < argc)  		read_symbols(argv[optind++]); +	if (files_source) +		read_symbols_from_files(files_source); +  	for (mod = modules; mod; mod = mod->next) {  		if (mod->skip)  			continue;  |