Merge branch 'misc' of git://git.kernel.org/pub/scm/linux/kernel/git/mmarek/kbuild

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
This commit is contained in:
Linus Torvalds 2012-07-30 11:23:37 -07:00
commit f6774cbcad
5 changed files with 264 additions and 21 deletions

View File

@ -0,0 +1,147 @@
/// 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)

View File

@ -0,0 +1,65 @@
/// 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)

View File

@ -1,6 +1,9 @@
#!/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
ARG="`echo $ARG | tr a-z A-Z`" if [ "$MUNGE_CASE" = "yes" ] ; then
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)

View File

@ -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

View File

@ -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/'