diff options
Diffstat (limited to 'scripts')
62 files changed, 504 insertions, 240 deletions
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst index 182084d728c8..8ccf83056a7a 100644 --- a/scripts/Makefile.headersinst +++ b/scripts/Makefile.headersinst @@ -47,18 +47,24 @@ header-y      := $(filter-out $(generic-y), $(header-y))  all-files     := $(header-y) $(genhdr-y) $(wrapper-files)  output-files  := $(addprefix $(installdir)/, $(all-files)) -input-files   := $(foreach hdr, $(header-y), \ +input-files1  := $(foreach hdr, $(header-y), \  		   $(if $(wildcard $(srcdir)/$(hdr)), \ -			$(wildcard $(srcdir)/$(hdr)), \ +			$(wildcard $(srcdir)/$(hdr))) \ +		   ) +input-files1-name := $(notdir $(input-files1)) +input-files2  := $(foreach hdr, $(header-y), \ +		   $(if  $(wildcard $(srcdir)/$(hdr)),, \  			$(if $(wildcard $(oldsrcdir)/$(hdr)), \  				$(wildcard $(oldsrcdir)/$(hdr)), \  				$(error Missing UAPI file $(srcdir)/$(hdr))) \ -		   )) \ -		 $(foreach hdr, $(genhdr-y), \ +		   )) +input-files2-name := $(notdir $(input-files2)) +input-files3  := $(foreach hdr, $(genhdr-y), \  		   $(if	$(wildcard $(gendir)/$(hdr)), \  			$(wildcard $(gendir)/$(hdr)), \  			$(error Missing generated UAPI file $(gendir)/$(hdr)) \  		   )) +input-files3-name := $(notdir $(input-files3))  # Work out what needs to be removed  oldheaders    := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h)) @@ -72,7 +78,9 @@ printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@))  quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\                              file$(if $(word 2, $(all-files)),s))        cmd_install = \ -        $(CONFIG_SHELL) $< $(installdir) $(input-files); \ +        $(CONFIG_SHELL) $< $(installdir) $(srcdir) $(input-files1-name); \ +        $(CONFIG_SHELL) $< $(installdir) $(oldsrcdir) $(input-files2-name); \ +        $(CONFIG_SHELL) $< $(installdir) $(gendir) $(input-files3-name); \          for F in $(wrapper-files); do                                   \                  echo "\#include <asm-generic/$$F>" > $(installdir)/$$F;    \          done;                                                           \ @@ -98,7 +106,7 @@ __headersinst: $(subdirs) $(install-file)  	@:  targets += $(install-file) -$(install-file): scripts/headers_install.sh $(input-files) FORCE +$(install-file): scripts/headers_install.sh $(input-files1) $(input-files2) $(input-files3) 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 f97869f1f09b..49392ecbef17 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -63,7 +63,7 @@ multi-objs   := $(multi-objs-y) $(multi-objs-m)  subdir-obj-y := $(filter %/built-in.o, $(obj-y))  # $(obj-dirs) is a list of directories that contain object files -obj-dirs := $(dir $(multi-objs) $(subdir-obj-y)) +obj-dirs := $(dir $(multi-objs) $(obj-y))  # Replace multi-part objects by their individual parts, look at local dir only  real-objs-y := $(foreach m, $(filter-out $(subdir-obj-y), $(obj-y)), $(if $(strip $($(m:.o=-objs)) $($(m:.o=-y))),$($(m:.o=-objs)) $($(m:.o=-y)),$(m))) $(extra-y) @@ -244,7 +244,7 @@ cmd_gzip = (cat $(filter-out FORCE,$^) | gzip -n -f -9 > $@) || \  # ---------------------------------------------------------------------------  # Generate an assembly file to wrap the output of the device tree compiler -quiet_cmd_dt_S_dtb= DTB    $@ +quiet_cmd_dt_S_dtb= DTB     $@  cmd_dt_S_dtb=						\  (							\  	echo '\#include <asm-generic/vmlinux.lds.h>'; 	\ @@ -311,6 +311,11 @@ cmd_lzo = (cat $(filter-out FORCE,$^) | \  	lzop -9 && $(call size_append, $(filter-out FORCE,$^))) > $@ || \  	(rm -f $@ ; false) +quiet_cmd_lz4 = LZ4     $@ +cmd_lz4 = (cat $(filter-out FORCE,$^) | \ +	lz4c -l -c1 stdin stdout && $(call size_append, $(filter-out FORCE,$^))) > $@ || \ +	(rm -f $@ ; false) +  # U-Boot mkimage  # --------------------------------------------------------------------------- diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 6afcd1239ca5..2ee9eb750560 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -6,6 +6,7 @@  # Licensed under the terms of the GNU GPL License version 2  use strict; +use POSIX;  my $P = $0;  $P =~ s@.*/@@g; @@ -399,37 +400,52 @@ sub seed_camelcase_includes {  	return if ($camelcase_seeded);  	my $files; -	my $camelcase_git_file = ""; +	my $camelcase_cache = ""; +	my @include_files = (); + +	$camelcase_seeded = 1;  	if (-d ".git") {  		my $git_last_include_commit = `git log --no-merges --pretty=format:"%h%n" -1 -- include`;  		chomp $git_last_include_commit; -		$camelcase_git_file = ".checkpatch-camelcase.$git_last_include_commit"; -		if (-f $camelcase_git_file) { -			open(my $camelcase_file, '<', "$camelcase_git_file") -			    or warn "$P: Can't read '$camelcase_git_file' $!\n"; -			while (<$camelcase_file>) { -				chomp; -				$camelcase{$_} = 1; -			} -			close($camelcase_file); - -			return; -		} -		$files = `git ls-files include`; +		$camelcase_cache = ".checkpatch-camelcase.git.$git_last_include_commit";  	} else { +		my $last_mod_date = 0;  		$files = `find $root/include -name "*.h"`; +		@include_files = split('\n', $files); +		foreach my $file (@include_files) { +			my $date = POSIX::strftime("%Y%m%d%H%M", +						   localtime((stat $file)[9])); +			$last_mod_date = $date if ($last_mod_date < $date); +		} +		$camelcase_cache = ".checkpatch-camelcase.date.$last_mod_date"; +	} + +	if ($camelcase_cache ne "" && -f $camelcase_cache) { +		open(my $camelcase_file, '<', "$camelcase_cache") +		    or warn "$P: Can't read '$camelcase_cache' $!\n"; +		while (<$camelcase_file>) { +			chomp; +			$camelcase{$_} = 1; +		} +		close($camelcase_file); + +		return; +	} + +	if (-d ".git") { +		$files = `git ls-files "include/*.h"`; +		@include_files = split('\n', $files);  	} -	my @include_files = split('\n', $files); +  	foreach my $file (@include_files) {  		seed_camelcase_file($file);  	} -	$camelcase_seeded = 1; -	if ($camelcase_git_file ne "") { +	if ($camelcase_cache ne "") {  		unlink glob ".checkpatch-camelcase.*"; -		open(my $camelcase_file, '>', "$camelcase_git_file") -		    or warn "$P: Can't write '$camelcase_git_file' $!\n"; +		open(my $camelcase_file, '>', "$camelcase_cache") +		    or warn "$P: Can't write '$camelcase_cache' $!\n";  		foreach (sort { lc($a) cmp lc($b) } keys(%camelcase)) {  			print $camelcase_file ("$_\n");  		} diff --git a/scripts/coccicheck b/scripts/coccicheck index 06fcb3333247..bbf901afb606 100755 --- a/scripts/coccicheck +++ b/scripts/coccicheck @@ -1,17 +1,31 @@  #!/bin/bash +# +# This script requires at least spatch +# version 1.0.0-rc11. +# +  SPATCH="`which ${SPATCH:=spatch}`" +trap kill_running SIGTERM SIGINT +declare -a SPATCH_PID +  # The verbosity may be set by the environmental parameter V=  # as for example with 'make V=1 coccicheck'  if [ -n "$V" -a "$V" != "0" ]; then -	VERBOSE=1 +	VERBOSE="$V"  else  	VERBOSE=0  fi -FLAGS="$SPFLAGS -very_quiet" +if [ -z "$J" ]; then +	NPROC=$(getconf _NPROCESSORS_ONLN) +else +	NPROC="$J" +fi + +FLAGS="$SPFLAGS --very-quiet"  # spatch only allows include directories with the syntax "-I include"  # while gcc also allows "-Iinclude" and "-include include" @@ -27,14 +41,14 @@ if [ "$C" = "1" -o "$C" = "2" ]; then  else      ONLINE=0      if [ "$KBUILD_EXTMOD" = "" ] ; then -        OPTIONS="-dir $srctree $COCCIINCLUDE" +        OPTIONS="--dir $srctree $COCCIINCLUDE"      else -        OPTIONS="-dir $KBUILD_EXTMOD $COCCIINCLUDE" +        OPTIONS="--dir $KBUILD_EXTMOD $COCCIINCLUDE"      fi  fi  if [ "$KBUILD_EXTMOD" != "" ] ; then -    OPTIONS="-patch $srctree $OPTIONS" +    OPTIONS="--patch $srctree $OPTIONS"  fi  if [ ! -x "$SPATCH" ]; then @@ -44,13 +58,21 @@ fi  if [ "$MODE" = "" ] ; then      if [ "$ONLINE" = "0" ] ; then -	echo 'You have not explicitly specified the mode to use. Using default "chain" mode.' -	echo 'All available modes will be tried (in that order): patch, report, context, org' +	echo 'You have not explicitly specified the mode to use. Using default "report" mode.' +	echo 'Available modes are the following: patch, report, context, org'  	echo 'You can specify the mode with "make coccicheck MODE=<mode>"' +	echo 'Note however that some modes are not implemented by some semantic patches.' +    fi +    MODE="report" +fi + +if [ "$MODE" = "chain" ] ; then +    if [ "$ONLINE" = "0" ] ; then +	echo 'You have selected the "chain" mode.' +	echo 'All available modes will be tried (in that order): patch, report, context, org'      fi -    MODE="chain"  elif [ "$MODE" = "report" -o "$MODE" = "org" ] ; then -    FLAGS="$FLAGS -no_show_diff" +    FLAGS="$FLAGS --no-show-diff"  fi  if [ "$ONLINE" = "0" ] ; then @@ -61,19 +83,35 @@ if [ "$ONLINE" = "0" ] ; then  fi  run_cmd() { +	local i  	if [ $VERBOSE -ne 0 ] ; then -		echo "Running: $@" +		echo "Running ($NPROC in parallel): $@"  	fi -	eval $@ +	for i in $(seq 0 $(( NPROC - 1)) ); do +		eval "$@ --max $NPROC --index $i &" +		SPATCH_PID[$i]=$! +		if [ $VERBOSE -eq 2 ] ; then +			echo "${SPATCH_PID[$i]} running" +		fi +	done +	wait  } +kill_running() { +	for i in $(seq $(( NPROC - 1 )) ); do +		if [ $VERBOSE -eq 2 ] ; then +			echo "Killing ${SPATCH_PID[$i]}" +		fi +		kill ${SPATCH_PID[$i]} 2>/dev/null +	done +}  coccinelle () {      COCCI="$1"      OPT=`grep "Option" $COCCI | cut -d':' -f2` -#   The option '-parse_cocci' can be used to syntactically check the SmPL files. +#   The option '--parse-cocci' can be used to syntactically check the SmPL files.  #  #    $SPATCH -D $MODE $FLAGS -parse_cocci $COCCI $OPT > /dev/null @@ -114,20 +152,20 @@ coccinelle () {      if [ "$MODE" = "chain" ] ; then  	run_cmd $SPATCH -D patch   \ -		$FLAGS -sp_file $COCCI $OPT $OPTIONS               || \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS               || \  	run_cmd $SPATCH -D report  \ -		$FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || \  	run_cmd $SPATCH -D context \ -		$FLAGS -sp_file $COCCI $OPT $OPTIONS               || \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS               || \  	run_cmd $SPATCH -D org     \ -		$FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff || exit 1 +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff || exit 1      elif [ "$MODE" = "rep+ctxt" ] ; then  	run_cmd $SPATCH -D report  \ -		$FLAGS -sp_file $COCCI $OPT $OPTIONS -no_show_diff && \ +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS --no-show-diff && \  	run_cmd $SPATCH -D context \ -		$FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1 +		$FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1      else -	run_cmd $SPATCH -D $MODE   $FLAGS -sp_file $COCCI $OPT $OPTIONS || exit 1 +	run_cmd $SPATCH -D $MODE   $FLAGS --cocci-file $COCCI $OPT $OPTIONS || exit 1      fi  } diff --git a/scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci b/scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci index 7d4771d449c3..bd5d08b882ee 100644 --- a/scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci +++ b/scripts/coccinelle/api/alloc/drop_kmalloc_cast.cocci @@ -5,7 +5,7 @@  // Confidence: High  // Copyright: 2009,2010 Nicolas Palix, DIKU.  GPLv2.  // URL: http://coccinelle.lip6.fr/ -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  //  // Keywords: kmalloc, kzalloc, kcalloc  // Version min: < 2.6.12 kmalloc diff --git a/scripts/coccinelle/api/alloc/kzalloc-simple.cocci b/scripts/coccinelle/api/alloc/kzalloc-simple.cocci index 046b9b16f8f9..52c55e4fa67d 100644 --- a/scripts/coccinelle/api/alloc/kzalloc-simple.cocci +++ b/scripts/coccinelle/api/alloc/kzalloc-simple.cocci @@ -9,7 +9,7 @@  // Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU.  GPLv2.  // Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/rules/kzalloc.html -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  //  // Keywords: kmalloc, kzalloc  // Version min: < 2.6.12 kmalloc diff --git a/scripts/coccinelle/api/d_find_alias.cocci b/scripts/coccinelle/api/d_find_alias.cocci index a9694a8d3e5a..9594c9f7eb8d 100644 --- a/scripts/coccinelle/api/d_find_alias.cocci +++ b/scripts/coccinelle/api/d_find_alias.cocci @@ -4,7 +4,7 @@  //  // Confidence: Moderate  // URL: http://coccinelle.lip6.fr/ -// Options: -include_headers +// Options: --include-headers  virtual context  virtual org diff --git a/scripts/coccinelle/api/devm_request_and_ioremap.cocci b/scripts/coccinelle/api/devm_request_and_ioremap.cocci index 46beb81406ab..562ec88b6352 100644 --- a/scripts/coccinelle/api/devm_request_and_ioremap.cocci +++ b/scripts/coccinelle/api/devm_request_and_ioremap.cocci @@ -10,7 +10,7 @@  // Copyright: (C) 2011 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual org diff --git a/scripts/coccinelle/api/kstrdup.cocci b/scripts/coccinelle/api/kstrdup.cocci index 07a74b2c6196..09cba54ed0cf 100644 --- a/scripts/coccinelle/api/kstrdup.cocci +++ b/scripts/coccinelle/api/kstrdup.cocci @@ -6,7 +6,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/api/memdup.cocci b/scripts/coccinelle/api/memdup.cocci index 4dceab6d54de..3d1aa71b7579 100644 --- a/scripts/coccinelle/api/memdup.cocci +++ b/scripts/coccinelle/api/memdup.cocci @@ -6,7 +6,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/api/memdup_user.cocci b/scripts/coccinelle/api/memdup_user.cocci index 2b131a8a1306..c606231b0e46 100644 --- a/scripts/coccinelle/api/memdup_user.cocci +++ b/scripts/coccinelle/api/memdup_user.cocci @@ -7,7 +7,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/api/ptr_ret.cocci b/scripts/coccinelle/api/ptr_ret.cocci index 15f076fdecbe..2274638d005b 100644 --- a/scripts/coccinelle/api/ptr_ret.cocci +++ b/scripts/coccinelle/api/ptr_ret.cocci @@ -5,7 +5,7 @@  // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.  // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/ -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  //  // Keywords: ERR_PTR, PTR_ERR, PTR_RET  // Version min: 2.6.39 diff --git a/scripts/coccinelle/api/simple_open.cocci b/scripts/coccinelle/api/simple_open.cocci index 05962f7be155..b67e174f3d95 100644 --- a/scripts/coccinelle/api/simple_open.cocci +++ b/scripts/coccinelle/api/simple_open.cocci @@ -4,7 +4,7 @@  ///  // Confidence: High  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual report diff --git a/scripts/coccinelle/free/devm_free.cocci b/scripts/coccinelle/free/devm_free.cocci index 0a1e36146d76..3d9349012bb3 100644 --- a/scripts/coccinelle/free/devm_free.cocci +++ b/scripts/coccinelle/free/devm_free.cocci @@ -18,7 +18,7 @@  // Copyright: (C) 2011 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/free/kfree.cocci b/scripts/coccinelle/free/kfree.cocci index d9ae6d89c2f5..577b78056990 100644 --- a/scripts/coccinelle/free/kfree.cocci +++ b/scripts/coccinelle/free/kfree.cocci @@ -10,7 +10,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/free/kfreeaddr.cocci b/scripts/coccinelle/free/kfreeaddr.cocci new file mode 100644 index 000000000000..ce8aacc314cb --- /dev/null +++ b/scripts/coccinelle/free/kfreeaddr.cocci @@ -0,0 +1,32 @@ +/// Free of a structure field +/// +// Confidence: High +// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6.  GPLv2. +// URL: http://coccinelle.lip6.fr/ +// Comments: +// Options: --no-includes --include-headers + +virtual org +virtual report +virtual context + +@r depends on context || report || org @ +expression e; +identifier f; +position p; +@@ + +* kfree@p(&e->f) + +@script:python depends on org@ +p << r.p; +@@ + +cocci.print_main("kfree",p) + +@script:python depends on report@ +p << r.p; +@@ + +msg = "ERROR: kfree of structure field" +coccilib.report.print_report(p[0],msg) diff --git a/scripts/coccinelle/free/pci_free_consistent.cocci b/scripts/coccinelle/free/pci_free_consistent.cocci new file mode 100644 index 000000000000..43600ccb62a8 --- /dev/null +++ b/scripts/coccinelle/free/pci_free_consistent.cocci @@ -0,0 +1,52 @@ +/// Find missing pci_free_consistent for every pci_alloc_consistent. +/// +// Confidence: Moderate +// Copyright: (C) 2013 Petr Strnad.  GPLv2. +// URL: http://coccinelle.lip6.fr/ +// Keywords: pci_free_consistent, pci_alloc_consistent +// Options: --no-includes --include-headers + +virtual report +virtual org + +@search@ +local idexpression id; +expression x,y,z,e; +position p1,p2; +type T; +@@ + +id = pci_alloc_consistent@p1(x,y,&z) +... when != e = id +if (id == NULL || ...) { ... return ...; } +... when != pci_free_consistent(x,y,id,z) +    when != if (id) { ... pci_free_consistent(x,y,id,z) ... } +    when != if (y) { ... pci_free_consistent(x,y,id,z) ... } +    when != e = (T)id +    when exists +( +return 0; +| +return 1; +| +return id; +| +return@p2 ...; +) + +@script:python depends on report@ +p1 << search.p1; +p2 << search.p2; +@@ + +msg = "ERROR: missing pci_free_consistent; pci_alloc_consistent on line %s and return without freeing on line %s" % (p1[0].line,p2[0].line) +coccilib.report.print_report(p2[0],msg) + +@script:python depends on org@ +p1 << search.p1; +p2 << search.p2; +@@ + +msg = "ERROR: missing pci_free_consistent; pci_alloc_consistent on line %s and return without freeing on line %s" % (p1[0].line,p2[0].line) +cocci.print_main(msg,p1) +cocci.print_secs("",p2) diff --git a/scripts/coccinelle/iterators/fen.cocci b/scripts/coccinelle/iterators/fen.cocci index 0a40af828c43..48c152f224e1 100644 --- a/scripts/coccinelle/iterators/fen.cocci +++ b/scripts/coccinelle/iterators/fen.cocci @@ -7,7 +7,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/iterators/itnull.cocci b/scripts/coccinelle/iterators/itnull.cocci index 259899f6838e..f58732b56a40 100644 --- a/scripts/coccinelle/iterators/itnull.cocci +++ b/scripts/coccinelle/iterators/itnull.cocci @@ -11,7 +11,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/iterators/list_entry_update.cocci b/scripts/coccinelle/iterators/list_entry_update.cocci index b2967475679b..873f444e7137 100644 --- a/scripts/coccinelle/iterators/list_entry_update.cocci +++ b/scripts/coccinelle/iterators/list_entry_update.cocci @@ -9,7 +9,7 @@  // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual context  virtual org diff --git a/scripts/coccinelle/iterators/use_after_iter.cocci b/scripts/coccinelle/iterators/use_after_iter.cocci index 06284c57a951..f085f5968c52 100644 --- a/scripts/coccinelle/iterators/use_after_iter.cocci +++ b/scripts/coccinelle/iterators/use_after_iter.cocci @@ -11,7 +11,7 @@  // Copyright: (C) 2012 Gilles Muller, INRIA/LIP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual context  virtual org diff --git a/scripts/coccinelle/locks/call_kern.cocci b/scripts/coccinelle/locks/call_kern.cocci index 8f10b49603c3..669b24436248 100644 --- a/scripts/coccinelle/locks/call_kern.cocci +++ b/scripts/coccinelle/locks/call_kern.cocci @@ -9,7 +9,7 @@  // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/locks/double_lock.cocci b/scripts/coccinelle/locks/double_lock.cocci index 63b24e682fad..002752f97dca 100644 --- a/scripts/coccinelle/locks/double_lock.cocci +++ b/scripts/coccinelle/locks/double_lock.cocci @@ -8,7 +8,7 @@  // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/locks/flags.cocci b/scripts/coccinelle/locks/flags.cocci index 1c4ffe6fd846..debd70e46267 100644 --- a/scripts/coccinelle/locks/flags.cocci +++ b/scripts/coccinelle/locks/flags.cocci @@ -6,7 +6,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual context  virtual org diff --git a/scripts/coccinelle/locks/mini_lock.cocci b/scripts/coccinelle/locks/mini_lock.cocci index 3267d7410bd5..47f649b0ea87 100644 --- a/scripts/coccinelle/locks/mini_lock.cocci +++ b/scripts/coccinelle/locks/mini_lock.cocci @@ -11,7 +11,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual context  virtual org diff --git a/scripts/coccinelle/misc/boolinit.cocci b/scripts/coccinelle/misc/boolinit.cocci index 97ce41ce8135..b9abed49cd95 100644 --- a/scripts/coccinelle/misc/boolinit.cocci +++ b/scripts/coccinelle/misc/boolinit.cocci @@ -6,7 +6,7 @@  // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.  // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/ -// Options: -include_headers +// Options: --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/misc/cstptr.cocci b/scripts/coccinelle/misc/cstptr.cocci index d42564484528..f0368b3d4563 100644 --- a/scripts/coccinelle/misc/cstptr.cocci +++ b/scripts/coccinelle/misc/cstptr.cocci @@ -6,7 +6,7 @@  // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/misc/doubleinit.cocci b/scripts/coccinelle/misc/doubleinit.cocci index cf74a00cf597..c0c3371d25e0 100644 --- a/scripts/coccinelle/misc/doubleinit.cocci +++ b/scripts/coccinelle/misc/doubleinit.cocci @@ -8,7 +8,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/misc/ifaddr.cocci b/scripts/coccinelle/misc/ifaddr.cocci index 3e4089a77000..8aebd1875e75 100644 --- a/scripts/coccinelle/misc/ifaddr.cocci +++ b/scripts/coccinelle/misc/ifaddr.cocci @@ -6,7 +6,7 @@  // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/misc/ifcol.cocci b/scripts/coccinelle/misc/ifcol.cocci index b7ed91dbeb95..d0d00ef1f12a 100644 --- a/scripts/coccinelle/misc/ifcol.cocci +++ b/scripts/coccinelle/misc/ifcol.cocci @@ -13,7 +13,7 @@  // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/misc/noderef.cocci b/scripts/coccinelle/misc/noderef.cocci index c1707214e602..80a831c91161 100644 --- a/scripts/coccinelle/misc/noderef.cocci +++ b/scripts/coccinelle/misc/noderef.cocci @@ -6,7 +6,7 @@  // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/misc/orplus.cocci b/scripts/coccinelle/misc/orplus.cocci index 4a28cef1484e..81fabf379390 100644 --- a/scripts/coccinelle/misc/orplus.cocci +++ b/scripts/coccinelle/misc/orplus.cocci @@ -7,7 +7,7 @@  // Copyright: (C) 2013 Gilles Muller, INRIA/LIP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual org  virtual report diff --git a/scripts/coccinelle/misc/warn.cocci b/scripts/coccinelle/misc/warn.cocci index fda8c3558e4f..d2e5b6cedb84 100644 --- a/scripts/coccinelle/misc/warn.cocci +++ b/scripts/coccinelle/misc/warn.cocci @@ -5,7 +5,7 @@  // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/null/eno.cocci b/scripts/coccinelle/null/eno.cocci index ed961a1f7d11..9bd29aa83399 100644 --- a/scripts/coccinelle/null/eno.cocci +++ b/scripts/coccinelle/null/eno.cocci @@ -6,7 +6,7 @@  // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/coccinelle/null/kmerr.cocci b/scripts/coccinelle/null/kmerr.cocci index 949bf656c64c..5354a7903ccb 100644 --- a/scripts/coccinelle/null/kmerr.cocci +++ b/scripts/coccinelle/null/kmerr.cocci @@ -10,7 +10,7 @@  // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual context  virtual org diff --git a/scripts/coccinelle/tests/doublebitand.cocci b/scripts/coccinelle/tests/doublebitand.cocci index 9ba73d05a77e..72f1572aaec3 100644 --- a/scripts/coccinelle/tests/doublebitand.cocci +++ b/scripts/coccinelle/tests/doublebitand.cocci @@ -10,7 +10,7 @@  // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual context  virtual org diff --git a/scripts/coccinelle/tests/doubletest.cocci b/scripts/coccinelle/tests/doubletest.cocci index 13a2c0e8a4bf..78d74c22ca12 100644 --- a/scripts/coccinelle/tests/doubletest.cocci +++ b/scripts/coccinelle/tests/doubletest.cocci @@ -8,7 +8,7 @@  // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual context  virtual org diff --git a/scripts/coccinelle/tests/odd_ptr_err.cocci b/scripts/coccinelle/tests/odd_ptr_err.cocci index e8dd8a6b28a2..cfe0a35cf2dd 100644 --- a/scripts/coccinelle/tests/odd_ptr_err.cocci +++ b/scripts/coccinelle/tests/odd_ptr_err.cocci @@ -7,7 +7,7 @@  // Copyright: (C) 2012 Gilles Muller, INRIA.  GPLv2.  // URL: http://coccinelle.lip6.fr/  // Comments: -// Options: -no_includes -include_headers +// Options: --no-includes --include-headers  virtual patch  virtual context diff --git a/scripts/config b/scripts/config index a65ecbbdd32a..567120a87c39 100755 --- a/scripts/config +++ b/scripts/config @@ -1,6 +1,8 @@  #!/bin/bash  # Manipulate options in a .config file from the command line +myname=${0##*/} +  # If no prefix forced, use the default CONFIG_  CONFIG_="${CONFIG_-CONFIG_}" @@ -8,7 +10,7 @@ usage() {  	cat >&2 <<EOL  Manipulate options in a .config file from the command line.  Usage: -config options command ... +$myname options command ...  commands:  	--enable|-e option   Enable option  	--disable|-d option  Disable option @@ -33,14 +35,14 @@ options:  	--file config-file   .config file to change (default .config)  	--keep-case|-k       Keep next symbols' case (dont' upper-case it) -config doesn't check the validity of the .config file. This is done at next +$myname doesn't check the validity of the .config file. This is done at next  make time. -By default, config will upper-case the given symbol. Use --keep-case to keep +By default, $myname will upper-case the given symbol. Use --keep-case to keep  the case of all following symbols unchanged. -config uses 'CONFIG_' as the default symbol prefix. Set the environment -variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" config ... +$myname uses 'CONFIG_' as the default symbol prefix. Set the environment +variable CONFIG_ to the prefix to use. Eg.: CONFIG_="FOO_" $myname ...  EOL  	exit 1  } diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh index 643764f53ea7..5de5660cb708 100644 --- a/scripts/headers_install.sh +++ b/scripts/headers_install.sh @@ -2,7 +2,7 @@  if [ $# -lt 1 ]  then -	echo "Usage: headers_install.sh OUTDIR [FILES...] +	echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]  	echo  	echo "Prepares kernel header files for use by user space, by removing"  	echo "all compiler.h definitions and #includes, removing any" @@ -10,6 +10,7 @@ then  	echo "asm/inline/volatile keywords."  	echo  	echo "OUTDIR: directory to write each userspace header FILE to." +	echo "SRCDIR: source directory where files are picked."  	echo "FILES:  list of header files to operate on."  	exit 1 @@ -19,6 +20,8 @@ fi  OUTDIR="$1"  shift +SRCDIR="$1" +shift  # Iterate through files listed on command line @@ -34,7 +37,7 @@ do  		-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 +		"$SRCDIR/$i" > "$OUTDIR/$FILE.sed" || exit 1  	scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \  		> "$OUTDIR/$FILE"  	[ $? -gt 1 ] && exit 1 diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c index bde5b95c8c19..d19944f9c3ac 100644 --- a/scripts/kconfig/conf.c +++ b/scripts/kconfig/conf.c @@ -527,11 +527,12 @@ int main(int ac, char **av)  			seed_env = getenv("KCONFIG_SEED");  			if( seed_env && *seed_env ) {  				char *endp; -				int tmp = (int)strtol(seed_env, &endp, 10); +				int tmp = (int)strtol(seed_env, &endp, 0);  				if (*endp == '\0') {  					seed = tmp;  				}  			} +			fprintf( stderr, "KCONFIG_SEED=0x%X\n", seed );  			srand(seed);  			break;  		} @@ -653,7 +654,8 @@ int main(int ac, char **av)  		conf_set_all_new_symbols(def_default);  		break;  	case randconfig: -		conf_set_all_new_symbols(def_random); +		/* Really nothing to do in this loop */ +		while (conf_set_all_new_symbols(def_random)) ;  		break;  	case defconfig:  		conf_set_all_new_symbols(def_default); diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c index 43eda40c3838..c55c227af463 100644 --- a/scripts/kconfig/confdata.c +++ b/scripts/kconfig/confdata.c @@ -1040,7 +1040,7 @@ void conf_set_changed_callback(void (*fn)(void))  	conf_changed_callback = fn;  } -static void randomize_choice_values(struct symbol *csym) +static bool randomize_choice_values(struct symbol *csym)  {  	struct property *prop;  	struct symbol *sym; @@ -1053,7 +1053,7 @@ static void randomize_choice_values(struct symbol *csym)  	 * In both cases stop.  	 */  	if (csym->curr.tri != yes) -		return; +		return false;  	prop = sym_get_choice_prop(csym); @@ -1077,13 +1077,18 @@ static void randomize_choice_values(struct symbol *csym)  		else {  			sym->def[S_DEF_USER].tri = no;  		} +		sym->flags |= SYMBOL_DEF_USER; +		/* clear VALID to get value calculated */ +		sym->flags &= ~SYMBOL_VALID;  	}  	csym->flags |= SYMBOL_DEF_USER;  	/* clear VALID to get value calculated */  	csym->flags &= ~(SYMBOL_VALID); + +	return true;  } -static void set_all_choice_values(struct symbol *csym) +void set_all_choice_values(struct symbol *csym)  {  	struct property *prop;  	struct symbol *sym; @@ -1100,10 +1105,10 @@ static void set_all_choice_values(struct symbol *csym)  	}  	csym->flags |= SYMBOL_DEF_USER;  	/* clear VALID to get value calculated */ -	csym->flags &= ~(SYMBOL_VALID); +	csym->flags &= ~(SYMBOL_VALID | SYMBOL_NEED_SET_CHOICE_VALUES);  } -void conf_set_all_new_symbols(enum conf_def_mode mode) +bool conf_set_all_new_symbols(enum conf_def_mode mode)  {  	struct symbol *sym, *csym;  	int i, cnt, pby, pty, ptm;	/* pby: probability of boolean  = y @@ -1151,6 +1156,7 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)  			exit( 1 );  		}  	} +	bool has_changed = false;  	for_all_symbols(i, sym) {  		if (sym_has_value(sym) || (sym->flags & SYMBOL_VALID)) @@ -1158,6 +1164,7 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)  		switch (sym_get_type(sym)) {  		case S_BOOLEAN:  		case S_TRISTATE: +			has_changed = true;  			switch (mode) {  			case def_yes:  				sym->def[S_DEF_USER].tri = yes; @@ -1202,14 +1209,26 @@ void conf_set_all_new_symbols(enum conf_def_mode mode)  	 * selected in a choice block and we set it to yes,  	 * and the rest to no.  	 */ +	if (mode != def_random) { +		for_all_symbols(i, csym) { +			if ((sym_is_choice(csym) && !sym_has_value(csym)) || +			    sym_is_choice_value(csym)) +				csym->flags |= SYMBOL_NEED_SET_CHOICE_VALUES; +		} +	} +  	for_all_symbols(i, csym) {  		if (sym_has_value(csym) || !sym_is_choice(csym))  			continue;  		sym_calc_value(csym);  		if (mode == def_random) -			randomize_choice_values(csym); -		else +			has_changed = randomize_choice_values(csym); +		else {  			set_all_choice_values(csym); +			has_changed = true; +		}  	} + +	return has_changed;  } diff --git a/scripts/kconfig/expr.h b/scripts/kconfig/expr.h index cdd48600e02a..df198a5f4822 100644 --- a/scripts/kconfig/expr.h +++ b/scripts/kconfig/expr.h @@ -106,6 +106,9 @@ struct symbol {  #define SYMBOL_DEF3       0x40000  /* symbol.def[S_DEF_3] is valid */  #define SYMBOL_DEF4       0x80000  /* symbol.def[S_DEF_4] is valid */ +/* choice values need to be set before calculating this symbol value */ +#define SYMBOL_NEED_SET_CHOICE_VALUES  0x100000 +  #define SYMBOL_MAXLENGTH	256  #define SYMBOL_HASHSIZE		9973 diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h index f8aee5fc6d5e..09f4edfdc911 100644 --- a/scripts/kconfig/lkc.h +++ b/scripts/kconfig/lkc.h @@ -86,7 +86,8 @@ const char *conf_get_autoconfig_name(void);  char *conf_get_default_confname(void);  void sym_set_change_count(int count);  void sym_add_change_count(int count); -void conf_set_all_new_symbols(enum conf_def_mode mode); +bool conf_set_all_new_symbols(enum conf_def_mode mode); +void set_all_choice_values(struct symbol *csym);  struct conf_printer {  	void (*print_symbol)(FILE *, struct symbol *, const char *, void *); diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h index ef1a7381f956..ecdb9659b67d 100644 --- a/scripts/kconfig/lkc_proto.h +++ b/scripts/kconfig/lkc_proto.h @@ -14,6 +14,7 @@ P(conf_set_message_callback, void,(void (*fn)(const char *fmt, va_list ap)));  /* menu.c */  P(rootmenu,struct menu,); +P(menu_is_empty, bool, (struct menu *menu));  P(menu_is_visible, bool, (struct menu *menu));  P(menu_has_prompt, bool, (struct menu *menu));  P(menu_get_prompt,const char *,(struct menu *menu)); diff --git a/scripts/kconfig/lxdialog/checklist.c b/scripts/kconfig/lxdialog/checklist.c index a2eb80fbc896..3b15c08ec1fa 100644 --- a/scripts/kconfig/lxdialog/checklist.c +++ b/scripts/kconfig/lxdialog/checklist.c @@ -132,16 +132,16 @@ int dialog_checklist(const char *title, const char *prompt, int height,  	}  do_resize: -	if (getmaxy(stdscr) < (height + 6)) +	if (getmaxy(stdscr) < (height + CHECKLIST_HEIGTH_MIN))  		return -ERRDISPLAYTOOSMALL; -	if (getmaxx(stdscr) < (width + 6)) +	if (getmaxx(stdscr) < (width + CHECKLIST_WIDTH_MIN))  		return -ERRDISPLAYTOOSMALL;  	max_choice = MIN(list_height, item_count());  	/* center dialog box on screen */ -	x = (COLS - width) / 2; -	y = (LINES - height) / 2; +	x = (getmaxx(stdscr) - width) / 2; +	y = (getmaxy(stdscr) - height) / 2;  	draw_shadow(stdscr, y, x, height, width); diff --git a/scripts/kconfig/lxdialog/dialog.h b/scripts/kconfig/lxdialog/dialog.h index 1099337079b6..b4343d384926 100644 --- a/scripts/kconfig/lxdialog/dialog.h +++ b/scripts/kconfig/lxdialog/dialog.h @@ -200,6 +200,20 @@ int item_is_tag(char tag);  int on_key_esc(WINDOW *win);  int on_key_resize(void); +/* minimum (re)size values */ +#define CHECKLIST_HEIGTH_MIN 6	/* For dialog_checklist() */ +#define CHECKLIST_WIDTH_MIN 6 +#define INPUTBOX_HEIGTH_MIN 2	/* For dialog_inputbox() */ +#define INPUTBOX_WIDTH_MIN 2 +#define MENUBOX_HEIGTH_MIN 15	/* For dialog_menu() */ +#define MENUBOX_WIDTH_MIN 65 +#define TEXTBOX_HEIGTH_MIN 8	/* For dialog_textbox() */ +#define TEXTBOX_WIDTH_MIN 8 +#define YESNO_HEIGTH_MIN 4	/* For dialog_yesno() */ +#define YESNO_WIDTH_MIN 4 +#define WINDOW_HEIGTH_MIN 19	/* For init_dialog() */ +#define WINDOW_WIDTH_MIN 80 +  int init_dialog(const char *backtitle);  void set_dialog_backtitle(const char *backtitle);  void set_dialog_subtitles(struct subtitle_list *subtitles); diff --git a/scripts/kconfig/lxdialog/inputbox.c b/scripts/kconfig/lxdialog/inputbox.c index 21404a04d7c3..447a582198c9 100644 --- a/scripts/kconfig/lxdialog/inputbox.c +++ b/scripts/kconfig/lxdialog/inputbox.c @@ -56,14 +56,14 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int width  		strcpy(instr, init);  do_resize: -	if (getmaxy(stdscr) <= (height - 2)) +	if (getmaxy(stdscr) <= (height - INPUTBOX_HEIGTH_MIN))  		return -ERRDISPLAYTOOSMALL; -	if (getmaxx(stdscr) <= (width - 2)) +	if (getmaxx(stdscr) <= (width - INPUTBOX_WIDTH_MIN))  		return -ERRDISPLAYTOOSMALL;  	/* center dialog box on screen */ -	x = (COLS - width) / 2; -	y = (LINES - height) / 2; +	x = (getmaxx(stdscr) - width) / 2; +	y = (getmaxy(stdscr) - height) / 2;  	draw_shadow(stdscr, y, x, height, width); diff --git a/scripts/kconfig/lxdialog/menubox.c b/scripts/kconfig/lxdialog/menubox.c index 38cd69c5660e..c93de0b2faca 100644 --- a/scripts/kconfig/lxdialog/menubox.c +++ b/scripts/kconfig/lxdialog/menubox.c @@ -193,7 +193,7 @@ int dialog_menu(const char *title, const char *prompt,  do_resize:  	height = getmaxy(stdscr);  	width = getmaxx(stdscr); -	if (height < 15 || width < 65) +	if (height < MENUBOX_HEIGTH_MIN || width < MENUBOX_WIDTH_MIN)  		return -ERRDISPLAYTOOSMALL;  	height -= 4; @@ -203,8 +203,8 @@ do_resize:  	max_choice = MIN(menu_height, item_count());  	/* center dialog box on screen */ -	x = (COLS - width) / 2; -	y = (LINES - height) / 2; +	x = (getmaxx(stdscr) - width) / 2; +	y = (getmaxy(stdscr) - height) / 2;  	draw_shadow(stdscr, y, x, height, width); diff --git a/scripts/kconfig/lxdialog/textbox.c b/scripts/kconfig/lxdialog/textbox.c index a48bb93e0907..1773319b95e7 100644 --- a/scripts/kconfig/lxdialog/textbox.c +++ b/scripts/kconfig/lxdialog/textbox.c @@ -80,7 +80,7 @@ int dialog_textbox(const char *title, char *tbuf, int initial_height,  do_resize:  	getmaxyx(stdscr, height, width); -	if (height < 8 || width < 8) +	if (height < TEXTBOX_HEIGTH_MIN || width < TEXTBOX_WIDTH_MIN)  		return -ERRDISPLAYTOOSMALL;  	if (initial_height != 0)  		height = initial_height; @@ -98,8 +98,8 @@ do_resize:  			width = 0;  	/* center dialog box on screen */ -	x = (COLS - width) / 2; -	y = (LINES - height) / 2; +	x = (getmaxx(stdscr) - width) / 2; +	y = (getmaxy(stdscr) - height) / 2;  	draw_shadow(stdscr, y, x, height, width); diff --git a/scripts/kconfig/lxdialog/util.c b/scripts/kconfig/lxdialog/util.c index a0e97c299410..58a8289dd650 100644 --- a/scripts/kconfig/lxdialog/util.c +++ b/scripts/kconfig/lxdialog/util.c @@ -254,7 +254,12 @@ void attr_clear(WINDOW * win, int height, int width, chtype attr)  void dialog_clear(void)  { -	attr_clear(stdscr, LINES, COLS, dlg.screen.atr); +	int lines, columns; + +	lines = getmaxy(stdscr); +	columns = getmaxx(stdscr); + +	attr_clear(stdscr, lines, columns, dlg.screen.atr);  	/* Display background title if it exists ... - SLH */  	if (dlg.backtitle != NULL) {  		int i, len = 0, skip = 0; @@ -269,10 +274,10 @@ void dialog_clear(void)  		}  		wmove(stdscr, 1, 1); -		if (len > COLS - 2) { +		if (len > columns - 2) {  			const char *ellipsis = "[...] ";  			waddstr(stdscr, ellipsis); -			skip = len - (COLS - 2 - strlen(ellipsis)); +			skip = len - (columns - 2 - strlen(ellipsis));  		}  		for (pos = dlg.subtitles; pos != NULL; pos = pos->next) { @@ -298,7 +303,7 @@ void dialog_clear(void)  				skip--;  		} -		for (i = len + 1; i < COLS - 1; i++) +		for (i = len + 1; i < columns - 1; i++)  			waddch(stdscr, ACS_HLINE);  	}  	wnoutrefresh(stdscr); @@ -317,7 +322,7 @@ int init_dialog(const char *backtitle)  	getyx(stdscr, saved_y, saved_x);  	getmaxyx(stdscr, height, width); -	if (height < 19 || width < 80) { +	if (height < WINDOW_HEIGTH_MIN || width < WINDOW_WIDTH_MIN) {  		endwin();  		return -ERRDISPLAYTOOSMALL;  	} @@ -371,27 +376,19 @@ void print_title(WINDOW *dialog, const char *title, int width)  /*   * Print a string of text in a window, automatically wrap around to the   * next line if the string is too long to fit on one line. Newline - * characters '\n' are replaced by spaces.  We start on a new line + * characters '\n' are propperly processed.  We start on a new line   * if there is no room for at least 4 nonblanks following a double-space.   */  void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)  {  	int newl, cur_x, cur_y; -	int i, prompt_len, room, wlen; -	char tempstr[MAX_LEN + 1], *word, *sp, *sp2; +	int prompt_len, room, wlen; +	char tempstr[MAX_LEN + 1], *word, *sp, *sp2, *newline_separator = 0;  	strcpy(tempstr, prompt);  	prompt_len = strlen(tempstr); -	/* -	 * Remove newlines -	 */ -	for (i = 0; i < prompt_len; i++) { -		if (tempstr[i] == '\n') -			tempstr[i] = ' '; -	} -  	if (prompt_len <= width - x * 2) {	/* If prompt is short */  		wmove(win, y, (width - prompt_len) / 2);  		waddstr(win, tempstr); @@ -401,7 +398,10 @@ void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)  		newl = 1;  		word = tempstr;  		while (word && *word) { -			sp = strchr(word, ' '); +			sp = strpbrk(word, "\n "); +			if (sp && *sp == '\n') +				newline_separator = sp; +  			if (sp)  				*sp++ = 0; @@ -413,7 +413,7 @@ void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)  			if (wlen > room ||  			    (newl && wlen < 4 && sp  			     && wlen + 1 + strlen(sp) > room -			     && (!(sp2 = strchr(sp, ' ')) +			     && (!(sp2 = strpbrk(sp, "\n "))  				 || wlen + 1 + (sp2 - sp) > room))) {  				cur_y++;  				cur_x = x; @@ -421,7 +421,15 @@ void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)  			wmove(win, cur_y, cur_x);  			waddstr(win, word);  			getyx(win, cur_y, cur_x); -			cur_x++; + +			/* Move to the next line if the word separator was a newline */ +			if (newline_separator) { +				cur_y++; +				cur_x = x; +				newline_separator = 0; +			} else +				cur_x++; +  			if (sp && *sp == ' ') {  				cur_x++;	/* double space */  				while (*++sp == ' ') ; diff --git a/scripts/kconfig/lxdialog/yesno.c b/scripts/kconfig/lxdialog/yesno.c index 4e6e8090c20b..676fb2f824a3 100644 --- a/scripts/kconfig/lxdialog/yesno.c +++ b/scripts/kconfig/lxdialog/yesno.c @@ -45,14 +45,14 @@ int dialog_yesno(const char *title, const char *prompt, int height, int width)  	WINDOW *dialog;  do_resize: -	if (getmaxy(stdscr) < (height + 4)) +	if (getmaxy(stdscr) < (height + YESNO_HEIGTH_MIN))  		return -ERRDISPLAYTOOSMALL; -	if (getmaxx(stdscr) < (width + 4)) +	if (getmaxx(stdscr) < (width + YESNO_WIDTH_MIN))  		return -ERRDISPLAYTOOSMALL;  	/* center dialog box on screen */ -	x = (COLS - width) / 2; -	y = (LINES - height) / 2; +	x = (getmaxx(stdscr) - width) / 2; +	y = (getmaxy(stdscr) - height) / 2;  	draw_shadow(stdscr, y, x, height, width); diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c index a69cbd78fb38..6c9c45f9fbba 100644 --- a/scripts/kconfig/mconf.c +++ b/scripts/kconfig/mconf.c @@ -48,7 +48,7 @@ static const char mconf_readme[] = N_(  "----------\n"  "o  Use the Up/Down arrow keys (cursor keys) to highlight the item\n"  "   you wish to change or submenu wish to select and press <Enter>.\n" -"   Submenus are designated by \"--->\".\n" +"   Submenus are designated by \"--->\", empty ones by \"----\".\n"  "\n"  "   Shortcut: Press the option's highlighted letter (hotkey).\n"  "             Pressing a hotkey more than once will sequence\n" @@ -176,7 +176,7 @@ static const char mconf_readme[] = N_(  "\n"),  menu_instructions[] = N_(  	"Arrow keys navigate the menu.  " -	"<Enter> selects submenus --->.  " +	"<Enter> selects submenus ---> (or empty submenus ----).  "  	"Highlighted letters are hotkeys.  "  	"Pressing <Y> includes, <N> excludes, <M> modularizes features.  "  	"Press <Esc><Esc> to exit, <?> for Help, </> for Search.  " @@ -401,7 +401,7 @@ static void search_conf(void)  	struct subtitle_part stpart;  	title = str_new(); -	str_printf( &title, _("Enter %s (sub)string to search for " +	str_printf( &title, _("Enter %s (sub)string or regexp to search for "  			      "(with or without \"%s\")"), CONFIG_, CONFIG_);  again: @@ -498,8 +498,9 @@ static void build_conf(struct menu *menu)  						  menu->data ? "-->" : "++>",  						  indent + 1, ' ', prompt);  				} else -					item_make("   %*c%s  --->", indent + 1, ' ', prompt); - +					item_make("   %*c%s  %s", +						  indent + 1, ' ', prompt, +						  menu_is_empty(menu) ? "----" : "--->");  				item_set_tag('m');  				item_set_data(menu);  				if (single_menu_mode && menu->data) @@ -630,7 +631,7 @@ static void build_conf(struct menu *menu)  			  (sym_has_value(sym) || !sym_is_changable(sym)) ?  			  "" : _(" (NEW)"));  		if (menu->prompt->type == P_MENU) { -			item_add_str("  --->"); +			item_add_str("  %s", menu_is_empty(menu) ? "----" : "--->");  			return;  		}  	} @@ -826,7 +827,9 @@ static void conf_choice(struct menu *menu)  		dialog_clear();  		res = dialog_checklist(prompt ? _(prompt) : _("Main Menu"),  					_(radiolist_instructions), -					 15, 70, 6); +					MENUBOX_HEIGTH_MIN, +					MENUBOX_WIDTH_MIN, +					CHECKLIST_HEIGTH_MIN);  		selected = item_activate_selected();  		switch (res) {  		case 0: @@ -957,8 +960,8 @@ static int handle_exit(void)  	dialog_clear();  	if (conf_get_changed())  		res = dialog_yesno(NULL, -				   _("Do you wish to save your new configuration ?\n" -				     "<ESC><ESC> to continue."), +				   _("Do you wish to save your new configuration?\n" +				     "(Press <ESC><ESC> to continue kernel configuration.)"),  				   6, 60);  	else  		res = -1; diff --git a/scripts/kconfig/menu.c b/scripts/kconfig/menu.c index fd3f0180e08f..7e233a6ca64e 100644 --- a/scripts/kconfig/menu.c +++ b/scripts/kconfig/menu.c @@ -443,6 +443,22 @@ bool menu_has_prompt(struct menu *menu)  	return true;  } +/* + * Determine if a menu is empty. + * A menu is considered empty if it contains no or only + * invisible entries. + */ +bool menu_is_empty(struct menu *menu) +{ +	struct menu *child; + +	for (child = menu->list; child; child = child->next) { +		if (menu_is_visible(child)) +			return(false); +	} +	return(true); +} +  bool menu_is_visible(struct menu *menu)  {  	struct menu *child; diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c index dbf31edd22b2..7975d8d258c3 100644 --- a/scripts/kconfig/nconf.c +++ b/scripts/kconfig/nconf.c @@ -45,8 +45,8 @@ static const char nconf_global_help[] = N_(  "<n> to remove it.  You may press the <Space> key to cycle through the\n"  "available options.\n"  "\n" -"A trailing \"--->\" designates a submenu.\n" -"\n" +"A trailing \"--->\" designates a submenu, a trailing \"----\" an\n" +"empty submenu.\n"  "\n"  "Menu navigation keys\n"  "----------------------------------------------------------------------\n" @@ -131,7 +131,7 @@ static const char nconf_global_help[] = N_(  "\n"),  menu_no_f_instructions[] = N_(  "Legend:  [*] built-in  [ ] excluded  <M> module  < > module capable.\n" -"Submenus are designated by a trailing \"--->\".\n" +"Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n"  "\n"  "Use the following keys to navigate the menus:\n"  "Move up or down with <Up> and <Down>.\n" @@ -148,7 +148,7 @@ menu_no_f_instructions[] = N_(  "For help related to the current menu entry press <?> or <h>.\n"),  menu_instructions[] = N_(  "Legend:  [*] built-in  [ ] excluded  <M> module  < > module capable.\n" -"Submenus are designated by a trailing \"--->\".\n" +"Submenus are designated by a trailing \"--->\", empty ones by \"----\".\n"  "\n"  "Use the following keys to navigate the menus:\n"  "Move up or down with <Up> or <Down>.\n" @@ -365,15 +365,16 @@ static void print_function_line(void)  	int i;  	int offset = 1;  	const int skip = 1; +	int lines = getmaxy(stdscr);  	for (i = 0; i < function_keys_num; i++) {  		(void) wattrset(main_window, attributes[FUNCTION_HIGHLIGHT]); -		mvwprintw(main_window, LINES-3, offset, +		mvwprintw(main_window, lines-3, offset,  				"%s",  				function_keys[i].key_str);  		(void) wattrset(main_window, attributes[FUNCTION_TEXT]);  		offset += strlen(function_keys[i].key_str); -		mvwprintw(main_window, LINES-3, +		mvwprintw(main_window, lines-3,  				offset, "%s",  				function_keys[i].func);  		offset += strlen(function_keys[i].func) + skip; @@ -694,7 +695,7 @@ static void search_conf(void)  	int dres;  	title = str_new(); -	str_printf( &title, _("Enter %s (sub)string to search for " +	str_printf( &title, _("Enter %s (sub)string or regexp to search for "  			      "(with or without \"%s\")"), CONFIG_, CONFIG_);  again: @@ -759,9 +760,9 @@ static void build_conf(struct menu *menu)  						indent + 1, ' ', prompt);  				} else  					item_make(menu, 'm', -						"   %*c%s  --->", -						indent + 1, -						' ', prompt); +						  "   %*c%s  %s", +						  indent + 1, ' ', prompt, +						  menu_is_empty(menu) ? "----" : "--->");  				if (single_menu_mode && menu->data)  					goto conf_childs; @@ -903,7 +904,7 @@ static void build_conf(struct menu *menu)  				(sym_has_value(sym) || !sym_is_changable(sym)) ?  				"" : _(" (NEW)"));  		if (menu->prompt && menu->prompt->type == P_MENU) { -			item_add_str("  --->"); +			item_add_str("  %s", menu_is_empty(menu) ? "----" : "--->");  			return;  		}  	} @@ -954,7 +955,7 @@ static void show_menu(const char *prompt, const char *instructions,  	clear();  	(void) wattrset(main_window, attributes[NORMAL]); -	print_in_middle(stdscr, 1, 0, COLS, +	print_in_middle(stdscr, 1, 0, getmaxx(stdscr),  			menu_backtitle,  			attributes[MAIN_HEADING]); @@ -1455,14 +1456,18 @@ static void conf_save(void)  void setup_windows(void)  { +	int lines, columns; + +	getmaxyx(stdscr, lines, columns); +  	if (main_window != NULL)  		delwin(main_window);  	/* set up the menu and menu window */ -	main_window = newwin(LINES-2, COLS-2, 2, 1); +	main_window = newwin(lines-2, columns-2, 2, 1);  	keypad(main_window, TRUE); -	mwin_max_lines = LINES-7; -	mwin_max_cols = COLS-6; +	mwin_max_lines = lines-7; +	mwin_max_cols = columns-6;  	/* panels order is from bottom to top */  	new_panel(main_window); @@ -1470,6 +1475,7 @@ void setup_windows(void)  int main(int ac, char **av)  { +	int lines, columns;  	char *mode;  	setlocale(LC_ALL, ""); @@ -1495,7 +1501,8 @@ int main(int ac, char **av)  	keypad(stdscr, TRUE);  	curs_set(0); -	if (COLS < 75 || LINES < 20) { +	getmaxyx(stdscr, lines, columns); +	if (columns < 75 || lines < 20) {  		endwin();  		printf("Your terminal should have at "  			"least 20 lines and 75 columns\n"); diff --git a/scripts/kconfig/nconf.gui.c b/scripts/kconfig/nconf.gui.c index 9f8c44ecc703..8275f0e55106 100644 --- a/scripts/kconfig/nconf.gui.c +++ b/scripts/kconfig/nconf.gui.c @@ -276,8 +276,8 @@ int btn_dialog(WINDOW *main_window, const char *msg, int btn_num, ...)  	total_width = max(msg_width, btns_width);  	/* place dialog in middle of screen */ -	y = (LINES-(msg_lines+4))/2; -	x = (COLS-(total_width+4))/2; +	y = (getmaxy(stdscr)-(msg_lines+4))/2; +	x = (getmaxx(stdscr)-(total_width+4))/2;  	/* create the windows */ @@ -387,8 +387,8 @@ int dialog_inputbox(WINDOW *main_window,  		prompt_width = max(prompt_width, strlen(title));  	/* place dialog in middle of screen */ -	y = (LINES-(prompt_lines+4))/2; -	x = (COLS-(prompt_width+4))/2; +	y = (getmaxy(stdscr)-(prompt_lines+4))/2; +	x = (getmaxx(stdscr)-(prompt_width+4))/2;  	strncpy(result, init, *result_len); @@ -545,7 +545,7 @@ void show_scroll_win(WINDOW *main_window,  {  	int res;  	int total_lines = get_line_no(text); -	int x, y; +	int x, y, lines, columns;  	int start_x = 0, start_y = 0;  	int text_lines = 0, text_cols = 0;  	int total_cols = 0; @@ -556,6 +556,8 @@ void show_scroll_win(WINDOW *main_window,  	WINDOW *pad;  	PANEL *panel; +	getmaxyx(stdscr, lines, columns); +  	/* find the widest line of msg: */  	total_lines = get_line_no(text);  	for (i = 0; i < total_lines; i++) { @@ -569,14 +571,14 @@ void show_scroll_win(WINDOW *main_window,  	(void) wattrset(pad, attributes[SCROLLWIN_TEXT]);  	fill_window(pad, text); -	win_lines = min(total_lines+4, LINES-2); -	win_cols = min(total_cols+2, COLS-2); +	win_lines = min(total_lines+4, lines-2); +	win_cols = min(total_cols+2, columns-2);  	text_lines = max(win_lines-4, 0);  	text_cols = max(win_cols-2, 0);  	/* place window in middle of screen */ -	y = (LINES-win_lines)/2; -	x = (COLS-win_cols)/2; +	y = (lines-win_lines)/2; +	x = (columns-win_cols)/2;  	win = newwin(win_lines, win_cols, y, x);  	keypad(win, TRUE); diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c index ecc5aa5f865d..d550300ec00c 100644 --- a/scripts/kconfig/symbol.c +++ b/scripts/kconfig/symbol.c @@ -136,7 +136,7 @@ static struct property *sym_get_range_prop(struct symbol *sym)  	return NULL;  } -static int sym_get_range_val(struct symbol *sym, int base) +static long sym_get_range_val(struct symbol *sym, int base)  {  	sym_calc_value(sym);  	switch (sym->type) { @@ -155,7 +155,7 @@ static int sym_get_range_val(struct symbol *sym, int base)  static void sym_validate_range(struct symbol *sym)  {  	struct property *prop; -	int base, val, val2; +	long base, val, val2;  	char str[64];  	switch (sym->type) { @@ -179,9 +179,9 @@ static void sym_validate_range(struct symbol *sym)  			return;  	}  	if (sym->type == S_INT) -		sprintf(str, "%d", val2); +		sprintf(str, "%ld", val2);  	else -		sprintf(str, "0x%x", val2); +		sprintf(str, "0x%lx", val2);  	sym->curr.val = strdup(str);  } @@ -300,6 +300,14 @@ void sym_calc_value(struct symbol *sym)  	if (sym->flags & SYMBOL_VALID)  		return; + +	if (sym_is_choice_value(sym) && +	    sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) { +		sym->flags &= ~SYMBOL_NEED_SET_CHOICE_VALUES; +		prop = sym_get_choice_prop(sym); +		sym_calc_value(prop_get_symbol(prop)); +	} +  	sym->flags |= SYMBOL_VALID;  	oldval = sym->curr; @@ -425,6 +433,9 @@ void sym_calc_value(struct symbol *sym)  	if (sym->flags & SYMBOL_AUTO)  		sym->flags &= ~SYMBOL_WRITE; + +	if (sym->flags & SYMBOL_NEED_SET_CHOICE_VALUES) +		set_all_choice_values(sym);  }  void sym_clear_all_valid(void) @@ -583,7 +594,7 @@ bool sym_string_valid(struct symbol *sym, const char *str)  bool sym_string_within_range(struct symbol *sym, const char *str)  {  	struct property *prop; -	int val; +	long val;  	switch (sym->type) {  	case S_STRING: @@ -943,38 +954,98 @@ const char *sym_escape_string_value(const char *in)  	return res;  } +struct sym_match { +	struct symbol	*sym; +	off_t		so, eo; +}; + +/* Compare matched symbols as thus: + * - first, symbols that match exactly + * - then, alphabetical sort + */ +static int sym_rel_comp( const void *sym1, const void *sym2 ) +{ +	struct sym_match *s1 = *(struct sym_match **)sym1; +	struct sym_match *s2 = *(struct sym_match **)sym2; +	int l1, l2; + +	/* Exact match: +	 * - if matched length on symbol s1 is the length of that symbol, +	 *   then this symbol should come first; +	 * - if matched length on symbol s2 is the length of that symbol, +	 *   then this symbol should come first. +	 * Note: since the search can be a regexp, both symbols may match +	 * exactly; if this is the case, we can't decide which comes first, +	 * and we fallback to sorting alphabetically. +	 */ +	l1 = s1->eo - s1->so; +	l2 = s2->eo - s2->so; +	if (l1 == strlen(s1->sym->name) && l2 != strlen(s2->sym->name)) +		return -1; +	if (l1 != strlen(s1->sym->name) && l2 == strlen(s2->sym->name)) +		return 1; + +	/* As a fallback, sort symbols alphabetically */ +	return strcmp(s1->sym->name, s2->sym->name); +} +  struct symbol **sym_re_search(const char *pattern)  {  	struct symbol *sym, **sym_arr = NULL; +	struct sym_match **sym_match_arr = NULL;  	int i, cnt, size;  	regex_t re; +	regmatch_t match[1];  	cnt = size = 0;  	/* Skip if empty */  	if (strlen(pattern) == 0)  		return NULL; -	if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB|REG_ICASE)) +	if (regcomp(&re, pattern, REG_EXTENDED|REG_ICASE))  		return NULL;  	for_all_symbols(i, sym) { +		struct sym_match *tmp_sym_match;  		if (sym->flags & SYMBOL_CONST || !sym->name)  			continue; -		if (regexec(&re, sym->name, 0, NULL, 0)) +		if (regexec(&re, sym->name, 1, match, 0))  			continue;  		if (cnt + 1 >= size) { -			void *tmp = sym_arr; +			void *tmp;  			size += 16; -			sym_arr = realloc(sym_arr, size * sizeof(struct symbol *)); -			if (!sym_arr) { -				free(tmp); -				return NULL; +			tmp = realloc(sym_match_arr, size * sizeof(struct sym_match *)); +			if (!tmp) { +				goto sym_re_search_free;  			} +			sym_match_arr = tmp;  		}  		sym_calc_value(sym); -		sym_arr[cnt++] = sym; +		tmp_sym_match = (struct sym_match*)malloc(sizeof(struct sym_match)); +		if (!tmp_sym_match) +			goto sym_re_search_free; +		tmp_sym_match->sym = sym; +		/* As regexec return 0, we know we have a match, so +		 * we can use match[0].rm_[se]o without further checks +		 */ +		tmp_sym_match->so = match[0].rm_so; +		tmp_sym_match->eo = match[0].rm_eo; +		sym_match_arr[cnt++] = tmp_sym_match;  	} -	if (sym_arr) +	if (sym_match_arr) { +		qsort(sym_match_arr, cnt, sizeof(struct sym_match*), sym_rel_comp); +		sym_arr = malloc((cnt+1) * sizeof(struct symbol)); +		if (!sym_arr) +			goto sym_re_search_free; +		for (i = 0; i < cnt; i++) +			sym_arr[i] = sym_match_arr[i]->sym;  		sym_arr[cnt] = NULL; +	} +sym_re_search_free: +	if (sym_match_arr) { +		for (i = 0; i < cnt; i++) +			free(sym_match_arr[i]); +		free(sym_match_arr); +	}  	regfree(&re);  	return sym_arr; diff --git a/scripts/mod/Makefile b/scripts/mod/Makefile index 75d59fcd48b8..c11212ff3510 100644 --- a/scripts/mod/Makefile +++ b/scripts/mod/Makefile @@ -15,8 +15,8 @@ endef  quiet_cmd_offsets = GEN     $@  define cmd_offsets  	(set -e; \ -	 echo "#ifndef __DEVICEVTABLE_OFFSETS_H__"; \ -	 echo "#define __DEVICEVTABLE_OFFSETS_H__"; \ +	 echo "#ifndef __DEVICETABLE_OFFSETS_H__"; \ +	 echo "#define __DEVICETABLE_OFFSETS_H__"; \  	 echo "/*"; \  	 echo " * DO NOT MODIFY."; \  	 echo " *"; \ @@ -29,15 +29,10 @@ define cmd_offsets  	 echo "#endif" ) > $@  endef -# We use internal kbuild rules to avoid the "is up to date" message from make -scripts/mod/devicetable-offsets.s: scripts/mod/devicetable-offsets.c FORCE -	$(Q)mkdir -p $(dir $@) -	$(call if_changed_dep,cc_s_c) +$(obj)/$(devicetable-offsets-file): $(obj)/devicetable-offsets.s +	$(call if_changed,offsets) -$(obj)/$(devicetable-offsets-file): scripts/mod/devicetable-offsets.s -	$(call cmd,offsets) - -targets += $(devicetable-offsets-file) +targets += $(devicetable-offsets-file) devicetable-offsets.s  # dependencies on generated files need to be listed explicitly diff --git a/scripts/mod/file2alias.c b/scripts/mod/file2alias.c index d9e67b719f08..23708636b05c 100644 --- a/scripts/mod/file2alias.c +++ b/scripts/mod/file2alias.c @@ -79,10 +79,12 @@ struct devtable **__start___devtable, **__stop___devtable;  extern struct devtable *__start___devtable[], *__stop___devtable[];  #endif /* __MACH__ */ -#if __GNUC__ == 3 && __GNUC_MINOR__ < 3 -# define __used			__attribute__((__unused__)) -#else -# define __used			__attribute__((__used__)) +#if !defined(__used) +# if __GNUC__ == 3 && __GNUC_MINOR__ < 3 +#  define __used			__attribute__((__unused__)) +# else +#  define __used			__attribute__((__used__)) +# endif  #endif  /* Define a variable f that holds the value of field f of struct devid diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 3d155dd27eb6..62164348ecf7 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -861,24 +861,23 @@ static void check_section(const char *modname, struct elf_info *elf,  #define ALL_INIT_DATA_SECTIONS \ -	".init.setup$", ".init.rodata$", \ -	".cpuinit.rodata$", ".meminit.rodata$", \ -	".init.data$", ".cpuinit.data$", ".meminit.data$" +	".init.setup$", ".init.rodata$", ".meminit.rodata$", \ +	".init.data$", ".meminit.data$"  #define ALL_EXIT_DATA_SECTIONS \ -	".exit.data$", ".cpuexit.data$", ".memexit.data$" +	".exit.data$", ".memexit.data$"  #define ALL_INIT_TEXT_SECTIONS \ -	".init.text$", ".cpuinit.text$", ".meminit.text$" +	".init.text$", ".meminit.text$"  #define ALL_EXIT_TEXT_SECTIONS \ -	".exit.text$", ".cpuexit.text$", ".memexit.text$" +	".exit.text$", ".memexit.text$"  #define ALL_PCI_INIT_SECTIONS	\  	".pci_fixup_early$", ".pci_fixup_header$", ".pci_fixup_final$", \  	".pci_fixup_enable$", ".pci_fixup_resume$", \  	".pci_fixup_resume_early$", ".pci_fixup_suspend$" -#define ALL_XXXINIT_SECTIONS CPU_INIT_SECTIONS, MEM_INIT_SECTIONS -#define ALL_XXXEXIT_SECTIONS CPU_EXIT_SECTIONS, MEM_EXIT_SECTIONS +#define ALL_XXXINIT_SECTIONS MEM_INIT_SECTIONS +#define ALL_XXXEXIT_SECTIONS MEM_EXIT_SECTIONS  #define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS  #define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS @@ -887,11 +886,9 @@ static void check_section(const char *modname, struct elf_info *elf,  #define TEXT_SECTIONS ".text$", ".text.unlikely$"  #define INIT_SECTIONS      ".init.*" -#define CPU_INIT_SECTIONS  ".cpuinit.*"  #define MEM_INIT_SECTIONS  ".meminit.*"  #define EXIT_SECTIONS      ".exit.*" -#define CPU_EXIT_SECTIONS  ".cpuexit.*"  #define MEM_EXIT_SECTIONS  ".memexit.*"  /* init data sections */ @@ -979,48 +976,20 @@ const struct sectioncheck sectioncheck[] = {  	.mismatch = DATA_TO_ANY_EXIT,  	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },  }, -/* Do not reference init code/data from cpuinit/meminit code/data */ +/* Do not reference init code/data from meminit code/data */  {  	.fromsec = { ALL_XXXINIT_SECTIONS, NULL },  	.tosec   = { INIT_SECTIONS, NULL },  	.mismatch = XXXINIT_TO_SOME_INIT,  	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },  }, -/* Do not reference cpuinit code/data from meminit code/data */ -{ -	.fromsec = { MEM_INIT_SECTIONS, NULL }, -	.tosec   = { CPU_INIT_SECTIONS, NULL }, -	.mismatch = XXXINIT_TO_SOME_INIT, -	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, -}, -/* Do not reference meminit code/data from cpuinit code/data */ -{ -	.fromsec = { CPU_INIT_SECTIONS, NULL }, -	.tosec   = { MEM_INIT_SECTIONS, NULL }, -	.mismatch = XXXINIT_TO_SOME_INIT, -	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, -}, -/* Do not reference exit code/data from cpuexit/memexit code/data */ +/* Do not reference exit code/data from memexit code/data */  {  	.fromsec = { ALL_XXXEXIT_SECTIONS, NULL },  	.tosec   = { EXIT_SECTIONS, NULL },  	.mismatch = XXXEXIT_TO_SOME_EXIT,  	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },  }, -/* Do not reference cpuexit code/data from memexit code/data */ -{ -	.fromsec = { MEM_EXIT_SECTIONS, NULL }, -	.tosec   = { CPU_EXIT_SECTIONS, NULL }, -	.mismatch = XXXEXIT_TO_SOME_EXIT, -	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, -}, -/* Do not reference memexit code/data from cpuexit code/data */ -{ -	.fromsec = { CPU_EXIT_SECTIONS, NULL }, -	.tosec   = { MEM_EXIT_SECTIONS, NULL }, -	.mismatch = XXXEXIT_TO_SOME_EXIT, -	.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL }, -},  /* Do not use exit code/data from init code */  {  	.fromsec = { ALL_INIT_SECTIONS, NULL }, @@ -1089,8 +1058,6 @@ static const struct sectioncheck *section_mismatch(   * Pattern 2:   *   Many drivers utilise a *driver container with references to   *   add, remove, probe functions etc. - *   These functions may often be marked __cpuinit and we do not want to - *   warn here.   *   the pattern is identified by:   *   tosec   = init or exit section   *   fromsec = data section @@ -1249,7 +1216,6 @@ static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,  /*   * Convert a section name to the function/data attribute   * .init.text => __init - * .cpuinit.data => __cpudata   * .memexitconst => __memconst   * etc.   * diff --git a/scripts/package/mkspec b/scripts/package/mkspec index fbbfd08853d3..fdd3fbf4d4a4 100755 --- a/scripts/package/mkspec +++ b/scripts/package/mkspec @@ -74,6 +74,7 @@ echo ""  fi  echo "%install" +echo 'KBUILD_IMAGE=$(make image_name)'  echo "%ifarch ia64"  echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib/modules'  echo 'mkdir -p $RPM_BUILD_ROOT/lib/firmware' diff --git a/scripts/setlocalversion b/scripts/setlocalversion index 84b88f109b80..d105a44b68f6 100755 --- a/scripts/setlocalversion +++ b/scripts/setlocalversion @@ -71,9 +71,6 @@ scm_version()  			printf -- '-svn%s' "`git svn find-rev $head`"  		fi -		# Update index only on r/w media -		[ -w . ] && git update-index --refresh --unmerged > /dev/null -  		# Check for uncommitted changes  		if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then  			printf '%s' -dirty  | 
