Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f6774cbc authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull misc kbuild changes from Michal Marek:
 "This is the non-critical part of kbuild for v3.6-rc1:

   - Two new coccinelle semantic patches
   - New scripts/tags.sh regexp
   - scripts/config improvements that I mistakenly applied here instead
     of in the kconfig branch (but there are no conflicts)
   - Debian packaging fixes"

* 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild:
  scripts/tags.sh: Teach [ce]tags about libtraceeevent error codes
  scripts/coccinelle: list iterator variable semantic patch
  scripts/coccinelle: Find threaded IRQs requests which are missing IRQF_ONESHOT
  deb-pkg: Add all Makefiles to header package
  deb-pkg: Install linux-firmware-image in versioned dir
  scripts/config: add option to undef a symbol
  scripts/config: allow alternate prefix to config option symbol
  scripts/config: add option to not upper-case symbols
parents b4e2ed32 1fa85059
Loading
Loading
Loading
Loading
+147 −0
Original line number Original line Diff line number Diff line
/// If list_for_each_entry, etc complete a traversal of the list, the iterator
/// variable ends up pointing to an address at an offset from the list head,
/// and not a meaningful structure.  Thus this value should not be used after
/// the end of the iterator.
//#False positives arise when there is a goto in the iterator and the
//#reported reference is at the label of this goto.  Some flag tests
//#may also cause a report to be a false positive.
///
// Confidence: Moderate
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.  GPLv2.
// Copyright: (C) 2012 Gilles Muller, INRIA/LIP6.  GPLv2.
// URL: http://coccinelle.lip6.fr/
// Comments:
// Options: -no_includes -include_headers

virtual context
virtual org
virtual report

@r exists@
identifier c,member;
expression E,x;
iterator name list_for_each_entry;
iterator name list_for_each_entry_reverse;
iterator name list_for_each_entry_continue;
iterator name list_for_each_entry_continue_reverse;
iterator name list_for_each_entry_from;
iterator name list_for_each_entry_safe;
iterator name list_for_each_entry_safe_continue;
iterator name list_for_each_entry_safe_from;
iterator name list_for_each_entry_safe_reverse;
iterator name hlist_for_each_entry;
iterator name hlist_for_each_entry_continue;
iterator name hlist_for_each_entry_from;
iterator name hlist_for_each_entry_safe;
statement S;
position p1,p2;
@@

(
list_for_each_entry@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
|
list_for_each_entry_reverse@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
|
list_for_each_entry_continue@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
|
list_for_each_entry_continue_reverse@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
|
list_for_each_entry_from@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
|
list_for_each_entry_safe@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
|
list_for_each_entry_safe_continue@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
|
list_for_each_entry_safe_from@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
|
list_for_each_entry_safe_reverse@p1(c,...,member) { ... when != break;
                                 when forall
                                 when strict
}
)
...
(
list_for_each_entry(c,...) S
|
list_for_each_entry_reverse(c,...) S
|
list_for_each_entry_continue(c,...) S
|
list_for_each_entry_continue_reverse(c,...) S
|
list_for_each_entry_from(c,...) S
|
list_for_each_entry_safe(c,...) S
|
list_for_each_entry_safe(x,c,...) S
|
list_for_each_entry_safe_continue(c,...) S
|
list_for_each_entry_safe_continue(x,c,...) S
|
list_for_each_entry_safe_from(c,...) S
|
list_for_each_entry_safe_from(x,c,...) S
|
list_for_each_entry_safe_reverse(c,...) S
|
list_for_each_entry_safe_reverse(x,c,...) S
|
hlist_for_each_entry(c,...) S
|
hlist_for_each_entry_continue(c,...) S
|
hlist_for_each_entry_from(c,...) S
|
hlist_for_each_entry_safe(c,...) S
|
list_remove_head(x,c,...)
|
sizeof(<+...c...+>)
|
&c->member
|
c = E
|
*c@p2
)

@script:python depends on org@
p1 << r.p1;
p2 << r.p2;
@@

cocci.print_main("invalid iterator index reference",p2)
cocci.print_secs("iterator",p1)

@script:python depends on report@
p1 << r.p1;
p2 << r.p2;
@@

msg = "ERROR: invalid reference to the index variable of the iterator on line %s" % (p1[0].line)
coccilib.report.print_report(p2[0], msg)
+65 −0
Original line number Original line Diff line number Diff line
/// Make sure threaded IRQs without a primary handler are always request with
/// IRQF_ONESHOT
///
//
// Confidence: Good
// Comments:
// Options: --no-includes

virtual patch
virtual context
virtual org
virtual report

@r1@
expression irq;
expression thread_fn;
expression flags;
position p;
@@
request_threaded_irq@p(irq, NULL, thread_fn,
(
flags | IRQF_ONESHOT
|
IRQF_ONESHOT
)
, ...)

@depends on patch@
expression irq;
expression thread_fn;
expression flags;
position p != r1.p;
@@
request_threaded_irq@p(irq, NULL, thread_fn,
(
-0
+IRQF_ONESHOT
|
-flags
+flags | IRQF_ONESHOT
)
, ...)

@depends on context@
position p != r1.p;
@@
*request_threaded_irq@p(...)

@match depends on report || org@
expression irq;
position p != r1.p;
@@
request_threaded_irq@p(irq, NULL, ...)

@script:python depends on org@
p << match.p;
@@
msg = "ERROR: Threaded IRQ with no primary handler requested without IRQF_ONESHOT"
coccilib.org.print_todo(p[0],msg)

@script:python depends on report@
p << match.p;
@@
msg = "ERROR: Threaded IRQ with no primary handler requested without IRQF_ONESHOT"
coccilib.report.print_report(p[0],msg)
+44 −16
Original line number Original line Diff line number Diff line
#!/bin/bash
#!/bin/bash
# Manipulate options in a .config file from the command line
# Manipulate options in a .config file from the command line


# If no prefix forced, use the default CONFIG_
CONFIG_="${CONFIG_-CONFIG_}"

usage() {
usage() {
	cat >&2 <<EOL
	cat >&2 <<EOL
Manipulate options in a .config file from the command line.
Manipulate options in a .config file from the command line.
@@ -14,6 +17,7 @@ commands:
	                     Set option to "string"
	                     Set option to "string"
	--set-val option value
	--set-val option value
	                     Set option to value
	                     Set option to value
	--undefine|-u option Undefine option
	--state|-s option    Print state of option (n,y,m,undef)
	--state|-s option    Print state of option (n,y,m,undef)


	--enable-after|-E beforeopt option
	--enable-after|-E beforeopt option
@@ -26,10 +30,17 @@ commands:
	commands can be repeated multiple times
	commands can be repeated multiple times


options:
options:
	--file .config file to change (default .config)
	--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
config doesn't check the validity of the .config file. This is done at next
make time.
make time.

By default, config 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 ...
EOL
EOL
	exit 1
	exit 1
}
}
@@ -40,11 +51,13 @@ checkarg() {
		usage
		usage
	fi
	fi
	case "$ARG" in
	case "$ARG" in
	CONFIG_*)
	${CONFIG_}*)
		ARG="${ARG/CONFIG_/}"
		ARG="${ARG/${CONFIG_}/}"
		;;
		;;
	esac
	esac
	if [ "$MUNGE_CASE" = "yes" ] ; then
		ARG="`echo $ARG | tr a-z A-Z`"
		ARG="`echo $ARG | tr a-z A-Z`"
	fi
}
}


set_var() {
set_var() {
@@ -61,6 +74,12 @@ set_var() {
	fi
	fi
}
}


undef_var() {
	local name=$1

	sed -ri "/^($name=|# $name is not set)/d" "$FN"
}

if [ "$1" = "--file" ]; then
if [ "$1" = "--file" ]; then
	FN="$2"
	FN="$2"
	if [ "$FN" = "" ] ; then
	if [ "$FN" = "" ] ; then
@@ -75,10 +94,16 @@ if [ "$1" = "" ] ; then
	usage
	usage
fi
fi


MUNGE_CASE=yes
while [ "$1" != "" ] ; do
while [ "$1" != "" ] ; do
	CMD="$1"
	CMD="$1"
	shift
	shift
	case "$CMD" in
	case "$CMD" in
	--keep-case|-k)
		MUNGE_CASE=no
		shift
		continue
		;;
	--refresh)
	--refresh)
		;;
		;;
	--*-after)
	--*-after)
@@ -95,37 +120,40 @@ while [ "$1" != "" ] ; do
	esac
	esac
	case "$CMD" in
	case "$CMD" in
	--enable|-e)
	--enable|-e)
		set_var "CONFIG_$ARG" "CONFIG_$ARG=y"
		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=y"
		;;
		;;


	--disable|-d)
	--disable|-d)
		set_var "CONFIG_$ARG" "# CONFIG_$ARG is not set"
		set_var "${CONFIG_}$ARG" "# ${CONFIG_}$ARG is not set"
		;;
		;;


	--module|-m)
	--module|-m)
		set_var "CONFIG_$ARG" "CONFIG_$ARG=m"
		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=m"
		;;
		;;


	--set-str)
	--set-str)
		# sed swallows one level of escaping, so we need double-escaping
		# sed swallows one level of escaping, so we need double-escaping
		set_var "CONFIG_$ARG" "CONFIG_$ARG=\"${1//\"/\\\\\"}\""
		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=\"${1//\"/\\\\\"}\""
		shift
		shift
		;;
		;;


	--set-val)
	--set-val)
		set_var "CONFIG_$ARG" "CONFIG_$ARG=$1"
		set_var "${CONFIG_}$ARG" "${CONFIG_}$ARG=$1"
		shift
		shift
		;;
		;;
	--undefine|-u)
		undef_var "${CONFIG_}$ARG"
		;;


	--state|-s)
	--state|-s)
		if grep -q "# CONFIG_$ARG is not set" $FN ; then
		if grep -q "# ${CONFIG_}$ARG is not set" $FN ; then
			echo n
			echo n
		else
		else
			V="$(grep "^CONFIG_$ARG=" $FN)"
			V="$(grep "^${CONFIG_}$ARG=" $FN)"
			if [ $? != 0 ] ; then
			if [ $? != 0 ] ; then
				echo undef
				echo undef
			else
			else
				V="${V/#CONFIG_$ARG=/}"
				V="${V/#${CONFIG_}$ARG=/}"
				V="${V/#\"/}"
				V="${V/#\"/}"
				V="${V/%\"/}"
				V="${V/%\"/}"
				V="${V//\\\"/\"}"
				V="${V//\\\"/\"}"
@@ -135,15 +163,15 @@ while [ "$1" != "" ] ; do
		;;
		;;


	--enable-after|-E)
	--enable-after|-E)
		set_var "CONFIG_$B" "CONFIG_$B=y" "CONFIG_$A"
		set_var "${CONFIG_}$B" "${CONFIG_}$B=y" "${CONFIG_}$A"
		;;
		;;


	--disable-after|-D)
	--disable-after|-D)
		set_var "CONFIG_$B" "# CONFIG_$B is not set" "CONFIG_$A"
		set_var "${CONFIG_}$B" "# ${CONFIG_}$B is not set" "${CONFIG_}$A"
		;;
		;;


	--module-after|-M)
	--module-after|-M)
		set_var "CONFIG_$B" "CONFIG_$B=m" "CONFIG_$A"
		set_var "${CONFIG_}$B" "${CONFIG_}$B=m" "${CONFIG_}$A"
		;;
		;;


	# undocumented because it ignores --file (fixme)
	# undocumented because it ignores --file (fixme)
+4 −3
Original line number Original line Diff line number Diff line
@@ -92,7 +92,7 @@ rm -rf "$tmpdir" "$fwdir" "$kernel_headers_dir" "$libc_headers_dir"
mkdir -m 755 -p "$tmpdir/DEBIAN"
mkdir -m 755 -p "$tmpdir/DEBIAN"
mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
mkdir -p  "$tmpdir/lib" "$tmpdir/boot" "$tmpdir/usr/share/doc/$packagename"
mkdir -m 755 -p "$fwdir/DEBIAN"
mkdir -m 755 -p "$fwdir/DEBIAN"
mkdir -p "$fwdir/lib" "$fwdir/usr/share/doc/$fwpackagename"
mkdir -p "$fwdir/lib/firmware/$version/" "$fwdir/usr/share/doc/$fwpackagename"
mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
mkdir -m 755 -p "$libc_headers_dir/DEBIAN"
mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
mkdir -p "$libc_headers_dir/usr/share/doc/$libc_headers_packagename"
mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
mkdir -m 755 -p "$kernel_headers_dir/DEBIAN"
@@ -243,7 +243,7 @@ EOF
fi
fi


# Build header package
# Build header package
(cd $srctree; find . -name Makefile -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles")
(cd $srctree; find . -name Makefile\* -o -name Kconfig\* -o -name \*.pl > "$objtree/debian/hdrsrcfiles")
(cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles")
(cd $srctree; find arch/$SRCARCH/include include scripts -type f >> "$objtree/debian/hdrsrcfiles")
(cd $objtree; find arch/$SRCARCH/include .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles")
(cd $objtree; find arch/$SRCARCH/include .config Module.symvers include scripts -type f >> "$objtree/debian/hdrobjfiles")
destdir=$kernel_headers_dir/usr/src/linux-headers-$version
destdir=$kernel_headers_dir/usr/src/linux-headers-$version
@@ -267,7 +267,8 @@ EOF


# Do we have firmware? Move it out of the way and build it into a package.
# Do we have firmware? Move it out of the way and build it into a package.
if [ -e "$tmpdir/lib/firmware" ]; then
if [ -e "$tmpdir/lib/firmware" ]; then
	mv "$tmpdir/lib/firmware" "$fwdir/lib/"
	mv "$tmpdir/lib/firmware"/* "$fwdir/lib/firmware/$version/"
	rmdir "$tmpdir/lib/firmware"


	cat <<EOF >> debian/control
	cat <<EOF >> debian/control


+4 −2
Original line number Original line Diff line number Diff line
@@ -153,7 +153,8 @@ exuberant()
	--regex-c++='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/'	\
	--regex-c++='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/'	\
	--regex-c++='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/'	\
	--regex-c++='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/'	\
	--regex-c++='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \
	--regex-c++='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \
	--regex-c++='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/'
	--regex-c++='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/' \
	--regex-c++='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'


	all_kconfigs | xargs $1 -a                              \
	all_kconfigs | xargs $1 -a                              \
	--langdef=kconfig --language-force=kconfig              \
	--langdef=kconfig --language-force=kconfig              \
@@ -195,7 +196,8 @@ emacs()
	--regex='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/'	\
	--regex='/CLEARPAGEFLAG_NOOP\(([^,)]*).*/ClearPage\1/'	\
	--regex='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/' \
	--regex='/__CLEARPAGEFLAG_NOOP\(([^,)]*).*/__ClearPage\1/' \
	--regex='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \
	--regex='/TESTCLEARFLAG_FALSE\(([^,)]*).*/TestClearPage\1/' \
	--regex='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/'
	--regex='/__TESTCLEARFLAG_FALSE\(([^,)]*).*/__TestClearPage\1/' \
	--regex='/_PE\(([^,)]*).*/PEVENT_ERRNO__\1/'


	all_kconfigs | xargs $1 -a                              \
	all_kconfigs | xargs $1 -a                              \
	--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'
	--regex='/^[ \t]*\(\(menu\)*config\)[ \t]+\([a-zA-Z0-9_]+\)/\3/'