Merge branch 'master' into for-next
Conflicts: drivers/devfreq/exynos4_bus.c Sync with Linus' tree to be able to apply patches that are against newer code (mvneta).
This commit is contained in:
@@ -266,6 +266,9 @@ $(obj)/%.dtb.S: $(obj)/%.dtb
|
||||
quiet_cmd_dtc = DTC $@
|
||||
cmd_dtc = $(objtree)/scripts/dtc/dtc -O dtb -o $@ -b 0 $(DTC_FLAGS) -d $(depfile) $<
|
||||
|
||||
$(obj)/%.dtb: $(src)/%.dts FORCE
|
||||
$(call if_changed_dep,dtc)
|
||||
|
||||
# Bzip2
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
|
||||
@@ -16,8 +16,9 @@ PHONY += $(modules)
|
||||
__modinst: $(modules)
|
||||
@:
|
||||
|
||||
# Don't stop modules_install if we can't sign external modules.
|
||||
quiet_cmd_modules_install = INSTALL $@
|
||||
cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) ; $(mod_sign_cmd) $(2)/$(notdir $@)
|
||||
cmd_modules_install = mkdir -p $(2); cp $@ $(2) ; $(mod_strip_cmd) $(2)/$(notdir $@) ; $(mod_sign_cmd) $(2)/$(notdir $@) $(patsubst %,|| true,$(KBUILD_EXTMOD))
|
||||
|
||||
# Modules built outside the kernel source tree go into extra by default
|
||||
INSTALL_MOD_DIR ?= extra
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# ==========================================================================
|
||||
# Signing modules
|
||||
# ==========================================================================
|
||||
|
||||
PHONY := __modsign
|
||||
__modsign:
|
||||
|
||||
include scripts/Kbuild.include
|
||||
|
||||
__modules := $(sort $(shell grep -h '\.ko' /dev/null $(wildcard $(MODVERDIR)/*.mod)))
|
||||
modules := $(patsubst %.o,%.ko,$(wildcard $(__modules:.ko=.o)))
|
||||
|
||||
PHONY += $(modules)
|
||||
__modsign: $(modules)
|
||||
@:
|
||||
|
||||
quiet_cmd_sign_ko = SIGN [M] $(2)/$(notdir $@)
|
||||
cmd_sign_ko = $(mod_sign_cmd) $(2)/$(notdir $@)
|
||||
|
||||
# Modules built outside the kernel source tree go into extra by default
|
||||
INSTALL_MOD_DIR ?= extra
|
||||
ext-mod-dir = $(INSTALL_MOD_DIR)$(subst $(patsubst %/,%,$(KBUILD_EXTMOD)),,$(@D))
|
||||
|
||||
modinst_dir = $(if $(KBUILD_EXTMOD),$(ext-mod-dir),kernel/$(@D))
|
||||
|
||||
$(modules):
|
||||
$(call cmd,sign_ko,$(MODLIB)/$(modinst_dir))
|
||||
|
||||
# Declare the contents of the .PHONY variable as phony. We keep that
|
||||
# information in a variable se we can use it in if_changed and friends.
|
||||
|
||||
.PHONY: $(PHONY)
|
||||
+92
-64
@@ -33,6 +33,7 @@ my %ignore_type = ();
|
||||
my @ignore = ();
|
||||
my $help = 0;
|
||||
my $configuration_file = ".checkpatch.conf";
|
||||
my $max_line_length = 80;
|
||||
|
||||
sub help {
|
||||
my ($exitcode) = @_;
|
||||
@@ -51,6 +52,7 @@ Options:
|
||||
-f, --file treat FILE as regular source file
|
||||
--subjective, --strict enable more subjective tests
|
||||
--ignore TYPE(,TYPE2...) ignore various comma separated message types
|
||||
--max-line-length=n set the maximum line length, if exceeded, warn
|
||||
--show-types show the message "types" in the output
|
||||
--root=PATH PATH to the kernel tree root
|
||||
--no-summary suppress the per-file summary
|
||||
@@ -107,6 +109,7 @@ GetOptions(
|
||||
'strict!' => \$check,
|
||||
'ignore=s' => \@ignore,
|
||||
'show-types!' => \$show_types,
|
||||
'max-line-length=i' => \$max_line_length,
|
||||
'root=s' => \$root,
|
||||
'summary!' => \$summary,
|
||||
'mailback!' => \$mailback,
|
||||
@@ -227,7 +230,11 @@ our $Inline = qr{inline|__always_inline|noinline};
|
||||
our $Member = qr{->$Ident|\.$Ident|\[[^]]*\]};
|
||||
our $Lval = qr{$Ident(?:$Member)*};
|
||||
|
||||
our $Constant = qr{(?i:(?:[0-9]+|0x[0-9a-f]+)[ul]*)};
|
||||
our $Float_hex = qr{(?i:0x[0-9a-f]+p-?[0-9]+[fl]?)};
|
||||
our $Float_dec = qr{(?i:((?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:e-?[0-9]+)?[fl]?))};
|
||||
our $Float_int = qr{(?i:[0-9]+e-?[0-9]+[fl]?)};
|
||||
our $Float = qr{$Float_hex|$Float_dec|$Float_int};
|
||||
our $Constant = qr{(?:$Float|(?i:(?:0x[0-9a-f]+|[0-9]+)[ul]*))};
|
||||
our $Assignment = qr{(?:\*\=|/=|%=|\+=|-=|<<=|>>=|&=|\^=|\|=|=)};
|
||||
our $Compare = qr{<=|>=|==|!=|<|>};
|
||||
our $Operators = qr{
|
||||
@@ -352,27 +359,6 @@ sub deparenthesize {
|
||||
|
||||
$chk_signoff = 0 if ($file);
|
||||
|
||||
my @dep_includes = ();
|
||||
my @dep_functions = ();
|
||||
my $removal = "Documentation/feature-removal-schedule.txt";
|
||||
if ($tree && -f "$root/$removal") {
|
||||
open(my $REMOVE, '<', "$root/$removal") ||
|
||||
die "$P: $removal: open failed - $!\n";
|
||||
while (<$REMOVE>) {
|
||||
if (/^Check:\s+(.*\S)/) {
|
||||
for my $entry (split(/[, ]+/, $1)) {
|
||||
if ($entry =~ m@include/(.*)@) {
|
||||
push(@dep_includes, $1);
|
||||
|
||||
} elsif ($entry !~ m@/@) {
|
||||
push(@dep_functions, $entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
close($REMOVE);
|
||||
}
|
||||
|
||||
my @rawlines = ();
|
||||
my @lines = ();
|
||||
my $vname;
|
||||
@@ -1412,6 +1398,8 @@ sub process {
|
||||
my %suppress_export;
|
||||
my $suppress_statement = 0;
|
||||
|
||||
my %camelcase = ();
|
||||
|
||||
# Pre-scan the patch sanitizing the lines.
|
||||
# Pre-scan the patch looking for any __setup documentation.
|
||||
#
|
||||
@@ -1757,6 +1745,13 @@ sub process {
|
||||
#print "is_start<$is_start> is_end<$is_end> length<$length>\n";
|
||||
}
|
||||
|
||||
# discourage the addition of CONFIG_EXPERIMENTAL in Kconfig.
|
||||
if ($realfile =~ /Kconfig/ &&
|
||||
$line =~ /.\s*depends on\s+.*\bEXPERIMENTAL\b/) {
|
||||
WARN("CONFIG_EXPERIMENTAL",
|
||||
"Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
|
||||
}
|
||||
|
||||
if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) &&
|
||||
($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) {
|
||||
my $flag = $1;
|
||||
@@ -1774,15 +1769,15 @@ sub process {
|
||||
# check we are in a valid source file if not then ignore this hunk
|
||||
next if ($realfile !~ /\.(h|c|s|S|pl|sh)$/);
|
||||
|
||||
#80 column limit
|
||||
#line length limit
|
||||
if ($line =~ /^\+/ && $prevrawline !~ /\/\*\*/ &&
|
||||
$rawline !~ /^.\s*\*\s*\@$Ident\s/ &&
|
||||
!($line =~ /^\+\s*$logFunctions\s*\(\s*(?:(KERN_\S+\s*|[^"]*))?"[X\t]*"\s*(?:|,|\)\s*;)\s*$/ ||
|
||||
$line =~ /^\+\s*"[^"]*"\s*(?:\s*|,|\)\s*;)\s*$/) &&
|
||||
$length > 80)
|
||||
$length > $max_line_length)
|
||||
{
|
||||
WARN("LONG_LINE",
|
||||
"line over 80 characters\n" . $herecurr);
|
||||
"line over $max_line_length characters\n" . $herecurr);
|
||||
}
|
||||
|
||||
# Check for user-visible strings broken across lines, which breaks the ability
|
||||
@@ -1890,8 +1885,10 @@ sub process {
|
||||
}
|
||||
|
||||
if ($realfile =~ m@^(drivers/net/|net/)@ &&
|
||||
$rawline !~ m@^\+[ \t]*(\/\*|\*\/)@ &&
|
||||
$rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) {
|
||||
$rawline !~ m@^\+[ \t]*\*/[ \t]*$@ && #trailing */
|
||||
$rawline !~ m@^\+.*/\*.*\*/[ \t]*$@ && #inline /*...*/
|
||||
$rawline !~ m@^\+.*\*{2,}/[ \t]*$@ && #trailing **/
|
||||
$rawline =~ m@^\+[ \t]*.+\*\/[ \t]*$@) { #non blank */
|
||||
WARN("NETWORKING_BLOCK_COMMENT_STYLE",
|
||||
"networking block comments put the trailing */ on a separate line\n" . $herecurr);
|
||||
}
|
||||
@@ -1910,6 +1907,12 @@ sub process {
|
||||
# check we are in a valid C source file if not then ignore this hunk
|
||||
next if ($realfile !~ /\.(h|c)$/);
|
||||
|
||||
# discourage the addition of CONFIG_EXPERIMENTAL in #if(def).
|
||||
if ($line =~ /^\+\s*\#\s*if.*\bCONFIG_EXPERIMENTAL\b/) {
|
||||
WARN("CONFIG_EXPERIMENTAL",
|
||||
"Use of CONFIG_EXPERIMENTAL is deprecated. For alternatives, see https://lkml.org/lkml/2012/10/23/580\n");
|
||||
}
|
||||
|
||||
# check for RCS/CVS revision markers
|
||||
if ($rawline =~ /^\+.*\$(Revision|Log|Id)(?:\$|)/) {
|
||||
WARN("CVS_KEYWORD",
|
||||
@@ -2223,8 +2226,11 @@ sub process {
|
||||
my $path = $1;
|
||||
if ($path =~ m{//}) {
|
||||
ERROR("MALFORMED_INCLUDE",
|
||||
"malformed #include filename\n" .
|
||||
$herecurr);
|
||||
"malformed #include filename\n" . $herecurr);
|
||||
}
|
||||
if ($path =~ "^uapi/" && $realfile =~ m@\binclude/uapi/@) {
|
||||
ERROR("UAPI_INCLUDE",
|
||||
"No #include in ...include/uapi/... should use a uapi/ path prefix\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2904,12 +2910,17 @@ sub process {
|
||||
}
|
||||
}
|
||||
|
||||
#studly caps, commented out until figure out how to distinguish between use of existing and adding new
|
||||
# if (($line=~/[\w_][a-z\d]+[A-Z]/) and !($line=~/print/)) {
|
||||
# print "No studly caps, use _\n";
|
||||
# print "$herecurr";
|
||||
# $clean = 0;
|
||||
# }
|
||||
#CamelCase
|
||||
while ($line =~ m{($Constant|$Lval)}g) {
|
||||
my $var = $1;
|
||||
if ($var !~ /$Constant/ &&
|
||||
$var =~ /[A-Z]\w*[a-z]|[a-z]\w*[A-Z]/ &&
|
||||
!defined $camelcase{$var}) {
|
||||
$camelcase{$var} = 1;
|
||||
WARN("CAMELCASE",
|
||||
"Avoid CamelCase: <$var>\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
|
||||
#no spaces allowed after \ in define
|
||||
if ($line=~/\#\s*define.*\\\s$/) {
|
||||
@@ -3011,6 +3022,17 @@ sub process {
|
||||
"Macros with complex values should be enclosed in parenthesis\n" . "$herectx");
|
||||
}
|
||||
}
|
||||
|
||||
# check for line continuations outside of #defines, preprocessor #, and asm
|
||||
|
||||
} else {
|
||||
if ($prevline !~ /^..*\\$/ &&
|
||||
$line !~ /^\+\s*\#.*\\$/ && # preprocessor
|
||||
$line !~ /^\+.*\b(__asm__|asm)\b.*\\$/ && # asm
|
||||
$line =~ /^\+.*\\$/) {
|
||||
WARN("LINE_CONTINUATIONS",
|
||||
"Avoid unnecessary line continuations\n" . $herecurr);
|
||||
}
|
||||
}
|
||||
|
||||
# do {} while (0) macro tests:
|
||||
@@ -3181,20 +3203,14 @@ sub process {
|
||||
}
|
||||
}
|
||||
|
||||
# don't include deprecated include files (uses RAW line)
|
||||
for my $inc (@dep_includes) {
|
||||
if ($rawline =~ m@^.\s*\#\s*include\s*\<$inc>@) {
|
||||
ERROR("DEPRECATED_INCLUDE",
|
||||
"Don't use <$inc>: see Documentation/feature-removal-schedule.txt\n" . $herecurr);
|
||||
}
|
||||
# check for unnecessary blank lines around braces
|
||||
if (($line =~ /^..*}\s*$/ && $prevline =~ /^.\s*$/)) {
|
||||
CHK("BRACES",
|
||||
"Blank lines aren't necessary before a close brace '}'\n" . $hereprev);
|
||||
}
|
||||
|
||||
# don't use deprecated functions
|
||||
for my $func (@dep_functions) {
|
||||
if ($line =~ /\b$func\b/) {
|
||||
ERROR("DEPRECATED_FUNCTION",
|
||||
"Don't use $func(): see Documentation/feature-removal-schedule.txt\n" . $herecurr);
|
||||
}
|
||||
if (($line =~ /^.\s*$/ && $prevline =~ /^..*{\s*$/)) {
|
||||
CHK("BRACES",
|
||||
"Blank lines aren't necessary after an open brace '{'\n" . $hereprev);
|
||||
}
|
||||
|
||||
# no volatiles please
|
||||
@@ -3211,20 +3227,12 @@ sub process {
|
||||
$herecurr);
|
||||
}
|
||||
|
||||
# check for needless kfree() checks
|
||||
if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
|
||||
my $expr = $1;
|
||||
if ($line =~ /\bkfree\(\Q$expr\E\);/) {
|
||||
WARN("NEEDLESS_KFREE",
|
||||
"kfree(NULL) is safe this check is probably not required\n" . $hereprev);
|
||||
}
|
||||
}
|
||||
# check for needless usb_free_urb() checks
|
||||
if ($prevline =~ /\bif\s*\(([^\)]*)\)/) {
|
||||
my $expr = $1;
|
||||
if ($line =~ /\busb_free_urb\(\Q$expr\E\);/) {
|
||||
WARN("NEEDLESS_USB_FREE_URB",
|
||||
"usb_free_urb(NULL) is safe this check is probably not required\n" . $hereprev);
|
||||
# check for needless "if (<foo>) fn(<foo>)" uses
|
||||
if ($prevline =~ /\bif\s*\(\s*($Lval)\s*\)/) {
|
||||
my $expr = '\s*\(\s*' . quotemeta($1) . '\s*\)\s*;';
|
||||
if ($line =~ /\b(kfree|usb_free_urb|debugfs_remove(?:_recursive)?)$expr/) {
|
||||
WARN('NEEDLESS_IF',
|
||||
"$1(NULL) is safe this check is probably not required\n" . $hereprev);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3342,6 +3350,12 @@ sub process {
|
||||
"Avoid line continuations in quoted strings\n" . $herecurr);
|
||||
}
|
||||
|
||||
# check for struct spinlock declarations
|
||||
if ($line =~ /^.\s*\bstruct\s+spinlock\s+\w+\s*;/) {
|
||||
WARN("USE_SPINLOCK_T",
|
||||
"struct spinlock should be spinlock_t\n" . $herecurr);
|
||||
}
|
||||
|
||||
# Check for misused memsets
|
||||
if ($^V && $^V ge 5.10.0 &&
|
||||
defined $stat &&
|
||||
@@ -3448,8 +3462,22 @@ sub process {
|
||||
|
||||
# check for multiple semicolons
|
||||
if ($line =~ /;\s*;\s*$/) {
|
||||
WARN("ONE_SEMICOLON",
|
||||
"Statements terminations use 1 semicolon\n" . $herecurr);
|
||||
WARN("ONE_SEMICOLON",
|
||||
"Statements terminations use 1 semicolon\n" . $herecurr);
|
||||
}
|
||||
|
||||
# check for switch/default statements without a break;
|
||||
if ($^V && $^V ge 5.10.0 &&
|
||||
defined $stat &&
|
||||
$stat =~ /^\+[$;\s]*(?:case[$;\s]+\w+[$;\s]*:[$;\s]*|)*[$;\s]*\bdefault[$;\s]*:[$;\s]*;/g) {
|
||||
my $ctx = '';
|
||||
my $herectx = $here . "\n";
|
||||
my $cnt = statement_rawlines($stat);
|
||||
for (my $n = 0; $n < $cnt; $n++) {
|
||||
$herectx .= raw_line($linenr, $n) . "\n";
|
||||
}
|
||||
WARN("DEFAULT_NO_BREAK",
|
||||
"switch default: should use break\n" . $herectx);
|
||||
}
|
||||
|
||||
# check for gcc specific __FUNCTION__
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
/// Make sure calls to d_find_alias() have a corresponding call to dput().
|
||||
//
|
||||
// Keywords: d_find_alias, dput
|
||||
//
|
||||
// Confidence: Moderate
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// Options: -include_headers
|
||||
|
||||
virtual context
|
||||
virtual org
|
||||
virtual patch
|
||||
virtual report
|
||||
|
||||
@r exists@
|
||||
local idexpression struct dentry *dent;
|
||||
expression E, E1;
|
||||
statement S1, S2;
|
||||
position p1, p2;
|
||||
@@
|
||||
(
|
||||
if (!(dent@p1 = d_find_alias(...))) S1
|
||||
|
|
||||
dent@p1 = d_find_alias(...)
|
||||
)
|
||||
|
||||
<...when != dput(dent)
|
||||
when != if (...) { <+... dput(dent) ...+> }
|
||||
when != true !dent || ...
|
||||
when != dent = E
|
||||
when != E = dent
|
||||
if (!dent || ...) S2
|
||||
...>
|
||||
(
|
||||
return <+...dent...+>;
|
||||
|
|
||||
return @p2 ...;
|
||||
|
|
||||
dent@p2 = E1;
|
||||
|
|
||||
E1 = dent;
|
||||
)
|
||||
|
||||
@depends on context@
|
||||
local idexpression struct dentry *r.dent;
|
||||
position r.p1,r.p2;
|
||||
@@
|
||||
* dent@p1 = ...
|
||||
...
|
||||
(
|
||||
* return@p2 ...;
|
||||
|
|
||||
* dent@p2
|
||||
)
|
||||
|
||||
|
||||
@script:python depends on org@
|
||||
p1 << r.p1;
|
||||
p2 << r.p2;
|
||||
@@
|
||||
cocci.print_main("Missing call to dput()",p1)
|
||||
cocci.print_secs("",p2)
|
||||
|
||||
@depends on patch@
|
||||
local idexpression struct dentry *r.dent;
|
||||
position r.p2;
|
||||
@@
|
||||
(
|
||||
+ dput(dent);
|
||||
return @p2 ...;
|
||||
|
|
||||
+ dput(dent);
|
||||
dent@p2 = ...;
|
||||
)
|
||||
|
||||
@script:python depends on report@
|
||||
p1 << r.p1;
|
||||
p2 << r.p2;
|
||||
@@
|
||||
msg = "Missing call to dput() at line %s."
|
||||
coccilib.report.print_report(p1[0], msg % (p2[0].line))
|
||||
@@ -0,0 +1,109 @@
|
||||
/// Use WARN(1,...) rather than printk followed by WARN_ON(1)
|
||||
///
|
||||
// Confidence: High
|
||||
// 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 patch
|
||||
virtual context
|
||||
virtual org
|
||||
virtual report
|
||||
|
||||
@bad1@
|
||||
position p;
|
||||
@@
|
||||
|
||||
printk(...);
|
||||
printk@p(...);
|
||||
WARN_ON(1);
|
||||
|
||||
@r1 depends on context || report || org@
|
||||
position p != bad1.p;
|
||||
@@
|
||||
|
||||
printk@p(...);
|
||||
*WARN_ON(1);
|
||||
|
||||
@script:python depends on org@
|
||||
p << r1.p;
|
||||
@@
|
||||
|
||||
cocci.print_main("printk + WARN_ON can be just WARN",p)
|
||||
|
||||
@script:python depends on report@
|
||||
p << r1.p;
|
||||
@@
|
||||
|
||||
msg = "SUGGESTION: printk + WARN_ON can be just WARN"
|
||||
coccilib.report.print_report(p[0],msg)
|
||||
|
||||
@ok1 depends on patch@
|
||||
expression list es;
|
||||
position p != bad1.p;
|
||||
@@
|
||||
|
||||
-printk@p(
|
||||
+WARN(1,
|
||||
es);
|
||||
-WARN_ON(1);
|
||||
|
||||
@depends on patch@
|
||||
expression list ok1.es;
|
||||
@@
|
||||
|
||||
if (...)
|
||||
- {
|
||||
WARN(1,es);
|
||||
- }
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
|
||||
@bad2@
|
||||
position p;
|
||||
@@
|
||||
|
||||
printk(...);
|
||||
printk@p(...);
|
||||
WARN_ON_ONCE(1);
|
||||
|
||||
@r2 depends on context || report || org@
|
||||
position p != bad1.p;
|
||||
@@
|
||||
|
||||
printk@p(...);
|
||||
*WARN_ON_ONCE(1);
|
||||
|
||||
@script:python depends on org@
|
||||
p << r2.p;
|
||||
@@
|
||||
|
||||
cocci.print_main("printk + WARN_ON_ONCE can be just WARN_ONCE",p)
|
||||
|
||||
@script:python depends on report@
|
||||
p << r2.p;
|
||||
@@
|
||||
|
||||
msg = "SUGGESTION: printk + WARN_ON_ONCE can be just WARN_ONCE"
|
||||
coccilib.report.print_report(p[0],msg)
|
||||
|
||||
@ok2 depends on patch@
|
||||
expression list es;
|
||||
position p != bad2.p;
|
||||
@@
|
||||
|
||||
-printk@p(
|
||||
+WARN_ONCE(1,
|
||||
es);
|
||||
-WARN_ON_ONCE(1);
|
||||
|
||||
@depends on patch@
|
||||
expression list ok2.es;
|
||||
@@
|
||||
|
||||
if (...)
|
||||
- {
|
||||
WARN_ONCE(1,es);
|
||||
- }
|
||||
@@ -101,7 +101,6 @@ while [ "$1" != "" ] ; do
|
||||
case "$CMD" in
|
||||
--keep-case|-k)
|
||||
MUNGE_CASE=no
|
||||
shift
|
||||
continue
|
||||
;;
|
||||
--refresh)
|
||||
|
||||
@@ -27,3 +27,5 @@ HOSTCFLAGS_dtc-parser.tab.o := $(HOSTCFLAGS_DTC)
|
||||
# dependencies on generated files need to be listed explicitly
|
||||
$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
|
||||
|
||||
# generated files need to be cleaned explicitly
|
||||
clean-files := dtc-lexer.lex.c dtc-parser.tab.c dtc-parser.tab.h
|
||||
|
||||
@@ -42,6 +42,9 @@ foreach my $filename (@files) {
|
||||
$line =~ s/(^|\s)(inline)\b/$1__$2__/g;
|
||||
$line =~ s/(^|\s)(asm)\b(\s|[(]|$)/$1__$2__$3/g;
|
||||
$line =~ s/(^|\s|[(])(volatile)\b(\s|[(]|$)/$1__$2__$3/g;
|
||||
$line =~ s/#ifndef\s+_UAPI/#ifndef /;
|
||||
$line =~ s/#define\s+_UAPI/#define /;
|
||||
$line =~ s!#endif\s+/[*]\s*_UAPI!#endif /* !;
|
||||
printf {$out} "%s", $line;
|
||||
}
|
||||
close $out;
|
||||
|
||||
@@ -12,7 +12,7 @@ extern "C" {
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/queue.h>
|
||||
#include "list.h"
|
||||
#ifndef __cplusplus
|
||||
#include <stdbool.h>
|
||||
#endif
|
||||
@@ -175,12 +175,11 @@ struct menu {
|
||||
#define MENU_ROOT 0x0002
|
||||
|
||||
struct jump_key {
|
||||
CIRCLEQ_ENTRY(jump_key) entries;
|
||||
struct list_head entries;
|
||||
size_t offset;
|
||||
struct menu *target;
|
||||
int index;
|
||||
};
|
||||
CIRCLEQ_HEAD(jk_head, jump_key);
|
||||
|
||||
#define JUMP_NB 9
|
||||
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
#ifndef LIST_H
|
||||
#define LIST_H
|
||||
|
||||
/*
|
||||
* Copied from include/linux/...
|
||||
*/
|
||||
|
||||
#undef offsetof
|
||||
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
|
||||
|
||||
/**
|
||||
* container_of - cast a member of a structure out to the containing structure
|
||||
* @ptr: the pointer to the member.
|
||||
* @type: the type of the container struct this is embedded in.
|
||||
* @member: the name of the member within the struct.
|
||||
*
|
||||
*/
|
||||
#define container_of(ptr, type, member) ({ \
|
||||
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
|
||||
(type *)( (char *)__mptr - offsetof(type,member) );})
|
||||
|
||||
|
||||
struct list_head {
|
||||
struct list_head *next, *prev;
|
||||
};
|
||||
|
||||
|
||||
#define LIST_HEAD_INIT(name) { &(name), &(name) }
|
||||
|
||||
#define LIST_HEAD(name) \
|
||||
struct list_head name = LIST_HEAD_INIT(name)
|
||||
|
||||
/**
|
||||
* list_entry - get the struct for this entry
|
||||
* @ptr: the &struct list_head pointer.
|
||||
* @type: the type of the struct this is embedded in.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*/
|
||||
#define list_entry(ptr, type, member) \
|
||||
container_of(ptr, type, member)
|
||||
|
||||
/**
|
||||
* list_for_each_entry - iterate over list of given type
|
||||
* @pos: the type * to use as a loop cursor.
|
||||
* @head: the head for your list.
|
||||
* @member: the name of the list_struct within the struct.
|
||||
*/
|
||||
#define list_for_each_entry(pos, head, member) \
|
||||
for (pos = list_entry((head)->next, typeof(*pos), member); \
|
||||
&pos->member != (head); \
|
||||
pos = list_entry(pos->member.next, typeof(*pos), member))
|
||||
|
||||
/**
|
||||
* list_empty - tests whether a list is empty
|
||||
* @head: the list to test.
|
||||
*/
|
||||
static inline int list_empty(const struct list_head *head)
|
||||
{
|
||||
return head->next == head;
|
||||
}
|
||||
|
||||
/*
|
||||
* Insert a new entry between two known consecutive entries.
|
||||
*
|
||||
* This is only for internal list manipulation where we know
|
||||
* the prev/next entries already!
|
||||
*/
|
||||
static inline void __list_add(struct list_head *_new,
|
||||
struct list_head *prev,
|
||||
struct list_head *next)
|
||||
{
|
||||
next->prev = _new;
|
||||
_new->next = next;
|
||||
_new->prev = prev;
|
||||
prev->next = _new;
|
||||
}
|
||||
|
||||
/**
|
||||
* list_add_tail - add a new entry
|
||||
* @new: new entry to be added
|
||||
* @head: list head to add it before
|
||||
*
|
||||
* Insert a new entry before the specified head.
|
||||
* This is useful for implementing queues.
|
||||
*/
|
||||
static inline void list_add_tail(struct list_head *_new, struct list_head *head)
|
||||
{
|
||||
__list_add(_new, head->prev, head);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -21,9 +21,9 @@ P(menu_get_root_menu,struct menu *,(struct menu *menu));
|
||||
P(menu_get_parent_menu,struct menu *,(struct menu *menu));
|
||||
P(menu_has_help,bool,(struct menu *menu));
|
||||
P(menu_get_help,const char *,(struct menu *menu));
|
||||
P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct jk_head
|
||||
P(get_symbol_str, void, (struct gstr *r, struct symbol *sym, struct list_head
|
||||
*head));
|
||||
P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct jk_head
|
||||
P(get_relations_str, struct gstr, (struct symbol **sym_arr, struct list_head
|
||||
*head));
|
||||
P(menu_get_ext_help,void,(struct menu *menu, struct gstr *help));
|
||||
|
||||
|
||||
@@ -312,7 +312,7 @@ static void set_config_filename(const char *config_filename)
|
||||
|
||||
|
||||
struct search_data {
|
||||
struct jk_head *head;
|
||||
struct list_head *head;
|
||||
struct menu **targets;
|
||||
int *keys;
|
||||
};
|
||||
@@ -323,7 +323,7 @@ static void update_text(char *buf, size_t start, size_t end, void *_data)
|
||||
struct jump_key *pos;
|
||||
int k = 0;
|
||||
|
||||
CIRCLEQ_FOREACH(pos, data->head, entries) {
|
||||
list_for_each_entry(pos, data->head, entries) {
|
||||
if (pos->offset >= start && pos->offset < end) {
|
||||
char header[4];
|
||||
|
||||
@@ -375,7 +375,7 @@ again:
|
||||
|
||||
sym_arr = sym_re_search(dialog_input);
|
||||
do {
|
||||
struct jk_head head = CIRCLEQ_HEAD_INITIALIZER(head);
|
||||
LIST_HEAD(head);
|
||||
struct menu *targets[JUMP_NB];
|
||||
int keys[JUMP_NB + 1], i;
|
||||
struct search_data data = {
|
||||
|
||||
@@ -508,7 +508,7 @@ const char *menu_get_help(struct menu *menu)
|
||||
}
|
||||
|
||||
static void get_prompt_str(struct gstr *r, struct property *prop,
|
||||
struct jk_head *head)
|
||||
struct list_head *head)
|
||||
{
|
||||
int i, j;
|
||||
struct menu *submenu[8], *menu, *location = NULL;
|
||||
@@ -544,12 +544,13 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
|
||||
} else
|
||||
jump->target = location;
|
||||
|
||||
if (CIRCLEQ_EMPTY(head))
|
||||
if (list_empty(head))
|
||||
jump->index = 0;
|
||||
else
|
||||
jump->index = CIRCLEQ_LAST(head)->index + 1;
|
||||
jump->index = list_entry(head->prev, struct jump_key,
|
||||
entries)->index + 1;
|
||||
|
||||
CIRCLEQ_INSERT_TAIL(head, jump, entries);
|
||||
list_add_tail(&jump->entries, head);
|
||||
}
|
||||
|
||||
if (i > 0) {
|
||||
@@ -573,7 +574,8 @@ static void get_prompt_str(struct gstr *r, struct property *prop,
|
||||
/*
|
||||
* head is optional and may be NULL
|
||||
*/
|
||||
void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head)
|
||||
void get_symbol_str(struct gstr *r, struct symbol *sym,
|
||||
struct list_head *head)
|
||||
{
|
||||
bool hit;
|
||||
struct property *prop;
|
||||
@@ -612,7 +614,7 @@ void get_symbol_str(struct gstr *r, struct symbol *sym, struct jk_head *head)
|
||||
str_append(r, "\n\n");
|
||||
}
|
||||
|
||||
struct gstr get_relations_str(struct symbol **sym_arr, struct jk_head *head)
|
||||
struct gstr get_relations_str(struct symbol **sym_arr, struct list_head *head)
|
||||
{
|
||||
struct symbol *sym;
|
||||
struct gstr res = str_new();
|
||||
|
||||
@@ -2079,7 +2079,6 @@ sub dump_function($$) {
|
||||
$prototype =~ s/^__inline +//;
|
||||
$prototype =~ s/^__always_inline +//;
|
||||
$prototype =~ s/^noinline +//;
|
||||
$prototype =~ s/__devinit +//;
|
||||
$prototype =~ s/__init +//;
|
||||
$prototype =~ s/__init_or_module +//;
|
||||
$prototype =~ s/__must_check +//;
|
||||
|
||||
+10
-14
@@ -858,25 +858,23 @@ static void check_section(const char *modname, struct elf_info *elf,
|
||||
|
||||
#define ALL_INIT_DATA_SECTIONS \
|
||||
".init.setup$", ".init.rodata$", \
|
||||
".devinit.rodata$", ".cpuinit.rodata$", ".meminit.rodata$", \
|
||||
".init.data$", ".devinit.data$", ".cpuinit.data$", ".meminit.data$"
|
||||
".cpuinit.rodata$", ".meminit.rodata$", \
|
||||
".init.data$", ".cpuinit.data$", ".meminit.data$"
|
||||
#define ALL_EXIT_DATA_SECTIONS \
|
||||
".exit.data$", ".devexit.data$", ".cpuexit.data$", ".memexit.data$"
|
||||
".exit.data$", ".cpuexit.data$", ".memexit.data$"
|
||||
|
||||
#define ALL_INIT_TEXT_SECTIONS \
|
||||
".init.text$", ".devinit.text$", ".cpuinit.text$", ".meminit.text$"
|
||||
".init.text$", ".cpuinit.text$", ".meminit.text$"
|
||||
#define ALL_EXIT_TEXT_SECTIONS \
|
||||
".exit.text$", ".devexit.text$", ".cpuexit.text$", ".memexit.text$"
|
||||
".exit.text$", ".cpuexit.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 DEV_INIT_SECTIONS, CPU_INIT_SECTIONS, \
|
||||
MEM_INIT_SECTIONS
|
||||
#define ALL_XXXEXIT_SECTIONS DEV_EXIT_SECTIONS, CPU_EXIT_SECTIONS, \
|
||||
MEM_EXIT_SECTIONS
|
||||
#define ALL_XXXINIT_SECTIONS CPU_INIT_SECTIONS, MEM_INIT_SECTIONS
|
||||
#define ALL_XXXEXIT_SECTIONS CPU_EXIT_SECTIONS, MEM_EXIT_SECTIONS
|
||||
|
||||
#define ALL_INIT_SECTIONS INIT_SECTIONS, ALL_XXXINIT_SECTIONS
|
||||
#define ALL_EXIT_SECTIONS EXIT_SECTIONS, ALL_XXXEXIT_SECTIONS
|
||||
@@ -885,12 +883,10 @@ static void check_section(const char *modname, struct elf_info *elf,
|
||||
#define TEXT_SECTIONS ".text$"
|
||||
|
||||
#define INIT_SECTIONS ".init.*"
|
||||
#define DEV_INIT_SECTIONS ".devinit.*"
|
||||
#define CPU_INIT_SECTIONS ".cpuinit.*"
|
||||
#define MEM_INIT_SECTIONS ".meminit.*"
|
||||
|
||||
#define EXIT_SECTIONS ".exit.*"
|
||||
#define DEV_EXIT_SECTIONS ".devexit.*"
|
||||
#define CPU_EXIT_SECTIONS ".cpuexit.*"
|
||||
#define MEM_EXIT_SECTIONS ".memexit.*"
|
||||
|
||||
@@ -979,7 +975,7 @@ const struct sectioncheck sectioncheck[] = {
|
||||
.mismatch = DATA_TO_ANY_EXIT,
|
||||
.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
|
||||
},
|
||||
/* Do not reference init code/data from devinit/cpuinit/meminit code/data */
|
||||
/* Do not reference init code/data from cpuinit/meminit code/data */
|
||||
{
|
||||
.fromsec = { ALL_XXXINIT_SECTIONS, NULL },
|
||||
.tosec = { INIT_SECTIONS, NULL },
|
||||
@@ -1000,7 +996,7 @@ const struct sectioncheck sectioncheck[] = {
|
||||
.mismatch = XXXINIT_TO_SOME_INIT,
|
||||
.symbol_white_list = { DEFAULT_SYMBOL_WHITE_LIST, NULL },
|
||||
},
|
||||
/* Do not reference exit code/data from devexit/cpuexit/memexit code/data */
|
||||
/* Do not reference exit code/data from cpuexit/memexit code/data */
|
||||
{
|
||||
.fromsec = { ALL_XXXEXIT_SECTIONS, NULL },
|
||||
.tosec = { EXIT_SECTIONS, NULL },
|
||||
@@ -1089,7 +1085,7 @@ 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 __devinit and we do not want to
|
||||
* 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
|
||||
|
||||
@@ -74,6 +74,7 @@ static unsigned int logo_height;
|
||||
static struct color **logo_data;
|
||||
static struct color logo_clut[MAX_LINUX_LOGO_COLORS];
|
||||
static unsigned int logo_clutsize;
|
||||
static int is_plain_pbm = 0;
|
||||
|
||||
static void die(const char *fmt, ...)
|
||||
__attribute__ ((noreturn)) __attribute ((format (printf, 1, 2)));
|
||||
@@ -103,6 +104,11 @@ static unsigned int get_number(FILE *fp)
|
||||
val = 0;
|
||||
while (isdigit(c)) {
|
||||
val = 10*val+c-'0';
|
||||
/* some PBM are 'broken'; GiMP for example exports a PBM without space
|
||||
* between the digits. This is Ok cause we know a PBM can only have a '1'
|
||||
* or a '0' for the digit. */
|
||||
if (is_plain_pbm)
|
||||
break;
|
||||
c = fgetc(fp);
|
||||
if (c == EOF)
|
||||
die("%s: end of file\n", filename);
|
||||
@@ -167,6 +173,7 @@ static void read_image(void)
|
||||
switch (magic) {
|
||||
case '1':
|
||||
/* Plain PBM */
|
||||
is_plain_pbm = 1;
|
||||
for (i = 0; i < logo_height; i++)
|
||||
for (j = 0; j < logo_width; j++)
|
||||
logo_data[i][j].red = logo_data[i][j].green =
|
||||
|
||||
+3
-3
@@ -156,12 +156,12 @@ sub asn1_extract($$@)
|
||||
|
||||
if ($l == 0x1) {
|
||||
$len = unpack("C", substr(${$cursor->[2]}, $cursor->[0], 1));
|
||||
} elsif ($l = 0x2) {
|
||||
} elsif ($l == 0x2) {
|
||||
$len = unpack("n", substr(${$cursor->[2]}, $cursor->[0], 2));
|
||||
} elsif ($l = 0x3) {
|
||||
} elsif ($l == 0x3) {
|
||||
$len = unpack("C", substr(${$cursor->[2]}, $cursor->[0], 1)) << 16;
|
||||
$len = unpack("n", substr(${$cursor->[2]}, $cursor->[0] + 1, 2));
|
||||
} elsif ($l = 0x4) {
|
||||
} elsif ($l == 0x4) {
|
||||
$len = unpack("N", substr(${$cursor->[2]}, $cursor->[0], 4));
|
||||
} else {
|
||||
die $x509, ": ", $cursor->[0], ": ASN.1 element too long (", $l, ")\n";
|
||||
|
||||
@@ -248,6 +248,7 @@ do_file(char const *const fname)
|
||||
case EM_S390:
|
||||
custom_sort = sort_relative_table;
|
||||
break;
|
||||
case EM_ARM:
|
||||
case EM_MIPS:
|
||||
break;
|
||||
} /* end switch */
|
||||
|
||||
+49
-8
@@ -48,13 +48,14 @@ find_arch_sources()
|
||||
for i in $archincludedir; do
|
||||
prune="$prune -wholename $i -prune -o"
|
||||
done
|
||||
find ${tree}arch/$1 $ignore $prune -name "$2" -print;
|
||||
find ${tree}arch/$1 $ignore $subarchprune $prune -name "$2" -print;
|
||||
}
|
||||
|
||||
# find sources in arch/$1/include
|
||||
find_arch_include_sources()
|
||||
{
|
||||
include=$(find ${tree}arch/$1/ -name include -type d);
|
||||
include=$(find ${tree}arch/$1/ $subarchprune \
|
||||
-name include -type d -print);
|
||||
if [ -n "$include" ]; then
|
||||
archincludedir="$archincludedir $include"
|
||||
find $include $ignore -name "$2" -print;
|
||||
@@ -95,6 +96,32 @@ all_sources()
|
||||
find_other_sources '*.[chS]'
|
||||
}
|
||||
|
||||
all_compiled_sources()
|
||||
{
|
||||
for i in $(all_sources); do
|
||||
case "$i" in
|
||||
*.[cS])
|
||||
j=${i/\.[cS]/\.o}
|
||||
if [ -e $j ]; then
|
||||
echo $i
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
echo $i
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
all_target_sources()
|
||||
{
|
||||
if [ -n "$COMPILED_SOURCE" ]; then
|
||||
all_compiled_sources
|
||||
else
|
||||
all_sources
|
||||
fi
|
||||
}
|
||||
|
||||
all_kconfigs()
|
||||
{
|
||||
for arch in $ALLSOURCE_ARCHS; do
|
||||
@@ -110,18 +137,18 @@ all_defconfigs()
|
||||
|
||||
docscope()
|
||||
{
|
||||
(echo \-k; echo \-q; all_sources) > cscope.files
|
||||
(echo \-k; echo \-q; all_target_sources) > cscope.files
|
||||
cscope -b -f cscope.out
|
||||
}
|
||||
|
||||
dogtags()
|
||||
{
|
||||
all_sources | gtags -i -f -
|
||||
all_target_sources | gtags -i -f -
|
||||
}
|
||||
|
||||
exuberant()
|
||||
{
|
||||
all_sources | xargs $1 -a \
|
||||
all_target_sources | xargs $1 -a \
|
||||
-I __initdata,__exitdata,__acquires,__releases \
|
||||
-I __read_mostly,____cacheline_aligned \
|
||||
-I ____cacheline_aligned_in_smp \
|
||||
@@ -173,7 +200,7 @@ exuberant()
|
||||
|
||||
emacs()
|
||||
{
|
||||
all_sources | xargs $1 -a \
|
||||
all_target_sources | xargs $1 -a \
|
||||
--regex='/^(ENTRY|_GLOBAL)(\([^)]*\)).*/\2/' \
|
||||
--regex='/^SYSCALL_DEFINE[0-9]?(\([^,)]*\).*/sys_\1/' \
|
||||
--regex='/^TRACE_EVENT(\([^,)]*\).*/trace_\1/' \
|
||||
@@ -220,11 +247,10 @@ xtags()
|
||||
elif $1 --version 2>&1 | grep -iq emacs; then
|
||||
emacs $1
|
||||
else
|
||||
all_sources | xargs $1 -a
|
||||
all_target_sources | xargs $1 -a
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
# Support um (which uses SUBARCH)
|
||||
if [ "${ARCH}" = "um" ]; then
|
||||
if [ "$SUBARCH" = "i386" ]; then
|
||||
@@ -234,6 +260,21 @@ if [ "${ARCH}" = "um" ]; then
|
||||
else
|
||||
archinclude=${SUBARCH}
|
||||
fi
|
||||
elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then
|
||||
subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \
|
||||
-name "plat-*" -type d);
|
||||
for i in $subarchdir; do
|
||||
case "$i" in
|
||||
*"mach-"${SUBARCH})
|
||||
;;
|
||||
*"plat-"${SUBARCH})
|
||||
;;
|
||||
*)
|
||||
subarchprune="$subarchprune \
|
||||
-wholename $i -prune -o"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
remove_structs=
|
||||
|
||||
Reference in New Issue
Block a user