Merge tag 'kbuild-misc-v4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild
Pull Kbuild misc updates from Masahiro Yamada: - Clean up and fix RPM package build - Fix a warning in DEB package build - Improve coccicheck script - Improve some semantic patches * tag 'kbuild-misc-v4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: docs: dev-tools: coccinelle: delete out of date wiki reference coccinelle: orplus: reorganize to improve performance coccinelle: use exists to improve efficiency builddeb: Pass the kernel:debarch substvar to dpkg-genchanges Coccinelle: use false positive annotation coccinelle: fix verbose message about .cocci file being run coccinelle: grep Options and Requires fields more precisely Coccinelle: make DEBUG_FILE option more useful coccinelle: api: detect identical chip data arrays coccinelle: Improve setup_timer.cocci matching Coccinelle: setup_timer: improve messages from setup_timer kbuild: rpm-pkg: do not force -jN in submake kbuild: rpm-pkg: keep spec file until make mrproper kbuild: rpm-pkg: fix jobserver unavailable warning kbuild: rpm-pkg: replace $RPM_BUILD_ROOT with %{buildroot} kbuild: rpm-pkg: fix build error when CONFIG_MODULES is disabled kbuild: rpm-pkg: refactor mkspec with here doc kbuild: rpm-pkg: clean up mkspec kbuild: rpm-pkg: install vmlinux.bz2 unconditionally kbuild: rpm-pkg: remove ppc64 specific image handling
This commit is contained in:
161
scripts/coccinelle/api/check_bq27xxx_data.cocci
Normal file
161
scripts/coccinelle/api/check_bq27xxx_data.cocci
Normal file
@@ -0,0 +1,161 @@
|
||||
/// Detect BQ27XXX_DATA structures with identical registers, dm registers or
|
||||
/// properties.
|
||||
//# Doesn't unfold macros used in register or property fields.
|
||||
//# Requires OCaml scripting
|
||||
///
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2017 Julia Lawall, Inria/LIP6, GPLv2.
|
||||
// URL: http://coccinelle.lip6.fr/
|
||||
// Requires: 1.0.7
|
||||
// Keywords: BQ27XXX_DATA
|
||||
|
||||
virtual report
|
||||
|
||||
@initialize:ocaml@
|
||||
@@
|
||||
|
||||
let print_report p msg =
|
||||
let p = List.hd p in
|
||||
Printf.printf "%s:%d:%d-%d: %s" p.file p.line p.col p.col_end msg
|
||||
|
||||
@str depends on report@
|
||||
type t;
|
||||
identifier i,i1,i2;
|
||||
expression e1,e2;
|
||||
@@
|
||||
|
||||
t i[] = {
|
||||
...,
|
||||
[e1] = BQ27XXX_DATA(i1,...),
|
||||
...,
|
||||
[e2] = BQ27XXX_DATA(i2,...),
|
||||
...,
|
||||
};
|
||||
|
||||
@script:ocaml tocheck@
|
||||
i1 << str.i1;
|
||||
i2 << str.i2;
|
||||
i1regs; i2regs;
|
||||
i1dmregs; i2dmregs;
|
||||
i1props; i2props;
|
||||
@@
|
||||
|
||||
if not(i1 = i2)
|
||||
then
|
||||
begin
|
||||
i1regs := make_ident (i1 ^ "_regs");
|
||||
i2regs := make_ident (i2 ^ "_regs");
|
||||
i1dmregs := make_ident (i1 ^ "_dm_regs");
|
||||
i2dmregs := make_ident (i2 ^ "_dm_regs");
|
||||
i1props := make_ident (i1 ^ "_props");
|
||||
i2props := make_ident (i2 ^ "_props")
|
||||
end
|
||||
|
||||
(* ---------------------------------------------------------------- *)
|
||||
|
||||
@getregs1@
|
||||
typedef u8;
|
||||
identifier tocheck.i1regs;
|
||||
initializer list i1regs_vals;
|
||||
position p1;
|
||||
@@
|
||||
|
||||
u8 i1regs@p1[...] = { i1regs_vals, };
|
||||
|
||||
@getregs2@
|
||||
identifier tocheck.i2regs;
|
||||
initializer list i2regs_vals;
|
||||
position p2;
|
||||
@@
|
||||
|
||||
u8 i2regs@p2[...] = { i2regs_vals, };
|
||||
|
||||
@script:ocaml@
|
||||
(_,i1regs_vals) << getregs1.i1regs_vals;
|
||||
(_,i2regs_vals) << getregs2.i2regs_vals;
|
||||
i1regs << tocheck.i1regs;
|
||||
i2regs << tocheck.i2regs;
|
||||
p1 << getregs1.p1;
|
||||
p2 << getregs2.p2;
|
||||
@@
|
||||
|
||||
if i1regs < i2regs &&
|
||||
List.sort compare i1regs_vals = List.sort compare i2regs_vals
|
||||
then
|
||||
let msg =
|
||||
Printf.sprintf
|
||||
"WARNING %s and %s (line %d) are identical\n"
|
||||
i1regs i2regs (List.hd p2).line in
|
||||
print_report p1 msg
|
||||
|
||||
(* ---------------------------------------------------------------- *)
|
||||
|
||||
@getdmregs1@
|
||||
identifier tocheck.i1dmregs;
|
||||
initializer list i1dmregs_vals;
|
||||
position p1;
|
||||
@@
|
||||
|
||||
struct bq27xxx_dm_reg i1dmregs@p1[] = { i1dmregs_vals, };
|
||||
|
||||
@getdmregs2@
|
||||
identifier tocheck.i2dmregs;
|
||||
initializer list i2dmregs_vals;
|
||||
position p2;
|
||||
@@
|
||||
|
||||
struct bq27xxx_dm_reg i2dmregs@p2[] = { i2dmregs_vals, };
|
||||
|
||||
@script:ocaml@
|
||||
(_,i1dmregs_vals) << getdmregs1.i1dmregs_vals;
|
||||
(_,i2dmregs_vals) << getdmregs2.i2dmregs_vals;
|
||||
i1dmregs << tocheck.i1dmregs;
|
||||
i2dmregs << tocheck.i2dmregs;
|
||||
p1 << getdmregs1.p1;
|
||||
p2 << getdmregs2.p2;
|
||||
@@
|
||||
|
||||
if i1dmregs < i2dmregs &&
|
||||
List.sort compare i1dmregs_vals = List.sort compare i2dmregs_vals
|
||||
then
|
||||
let msg =
|
||||
Printf.sprintf
|
||||
"WARNING %s and %s (line %d) are identical\n"
|
||||
i1dmregs i2dmregs (List.hd p2).line in
|
||||
print_report p1 msg
|
||||
|
||||
(* ---------------------------------------------------------------- *)
|
||||
|
||||
@getprops1@
|
||||
identifier tocheck.i1props;
|
||||
initializer list[n1] i1props_vals;
|
||||
position p1;
|
||||
@@
|
||||
|
||||
enum power_supply_property i1props@p1[] = { i1props_vals, };
|
||||
|
||||
@getprops2@
|
||||
identifier tocheck.i2props;
|
||||
initializer list[n2] i2props_vals;
|
||||
position p2;
|
||||
@@
|
||||
|
||||
enum power_supply_property i2props@p2[] = { i2props_vals, };
|
||||
|
||||
@script:ocaml@
|
||||
(_,i1props_vals) << getprops1.i1props_vals;
|
||||
(_,i2props_vals) << getprops2.i2props_vals;
|
||||
i1props << tocheck.i1props;
|
||||
i2props << tocheck.i2props;
|
||||
p1 << getprops1.p1;
|
||||
p2 << getprops2.p2;
|
||||
@@
|
||||
|
||||
if i1props < i2props &&
|
||||
List.sort compare i1props_vals = List.sort compare i2props_vals
|
||||
then
|
||||
let msg =
|
||||
Printf.sprintf
|
||||
"WARNING %s and %s (line %d) are identical\n"
|
||||
i1props i2props (List.hd p2).line in
|
||||
print_report p1 msg
|
@@ -2,6 +2,7 @@
|
||||
/// and data fields
|
||||
// Confidence: High
|
||||
// Copyright: (C) 2016 Vaishali Thakkar, Oracle. GPLv2
|
||||
// Copyright: (C) 2017 Kees Cook, Google. GPLv2
|
||||
// Options: --no-includes --include-headers
|
||||
// Keywords: init_timer, setup_timer
|
||||
|
||||
@@ -10,60 +11,123 @@ virtual context
|
||||
virtual org
|
||||
virtual report
|
||||
|
||||
// Match the common cases first to avoid Coccinelle parsing loops with
|
||||
// "... when" clauses.
|
||||
|
||||
@match_immediate_function_data_after_init_timer
|
||||
depends on patch && !context && !org && !report@
|
||||
expression e, func, da;
|
||||
@@
|
||||
|
||||
-init_timer (&e);
|
||||
+setup_timer (&e, func, da);
|
||||
-init_timer
|
||||
+setup_timer
|
||||
( \(&e\|e\)
|
||||
+, func, da
|
||||
);
|
||||
(
|
||||
-\(e.function\|e->function\) = func;
|
||||
-\(e.data\|e->data\) = da;
|
||||
|
|
||||
-\(e.data\|e->data\) = da;
|
||||
-\(e.function\|e->function\) = func;
|
||||
)
|
||||
|
||||
@match_immediate_function_data_before_init_timer
|
||||
depends on patch && !context && !org && !report@
|
||||
expression e, func, da;
|
||||
@@
|
||||
|
||||
(
|
||||
-e.function = func;
|
||||
-e.data = da;
|
||||
-\(e.function\|e->function\) = func;
|
||||
-\(e.data\|e->data\) = da;
|
||||
|
|
||||
-e.data = da;
|
||||
-e.function = func;
|
||||
-\(e.data\|e->data\) = da;
|
||||
-\(e.function\|e->function\) = func;
|
||||
)
|
||||
-init_timer
|
||||
+setup_timer
|
||||
( \(&e\|e\)
|
||||
+, func, da
|
||||
);
|
||||
|
||||
@match_function_and_data_after_init_timer
|
||||
depends on patch && !context && !org && !report@
|
||||
expression e1, e2, e3, e4, e5, a, b;
|
||||
expression e, e2, e3, e4, e5, func, da;
|
||||
@@
|
||||
|
||||
-init_timer (&e1);
|
||||
+setup_timer (&e1, a, b);
|
||||
|
||||
... when != a = e2
|
||||
when != b = e3
|
||||
-init_timer
|
||||
+setup_timer
|
||||
( \(&e\|e\)
|
||||
+, func, da
|
||||
);
|
||||
... when != func = e2
|
||||
when != da = e3
|
||||
(
|
||||
-e1.function = a;
|
||||
... when != b = e4
|
||||
-e1.data = b;
|
||||
-e.function = func;
|
||||
... when != da = e4
|
||||
-e.data = da;
|
||||
|
|
||||
-e1.data = b;
|
||||
... when != a = e5
|
||||
-e1.function = a;
|
||||
-e->function = func;
|
||||
... when != da = e4
|
||||
-e->data = da;
|
||||
|
|
||||
-e.data = da;
|
||||
... when != func = e5
|
||||
-e.function = func;
|
||||
|
|
||||
-e->data = da;
|
||||
... when != func = e5
|
||||
-e->function = func;
|
||||
)
|
||||
|
||||
@match_function_and_data_before_init_timer
|
||||
depends on patch && !context && !org && !report@
|
||||
expression e, e2, e3, e4, e5, func, da;
|
||||
@@
|
||||
(
|
||||
-e.function = func;
|
||||
... when != da = e4
|
||||
-e.data = da;
|
||||
|
|
||||
-e->function = func;
|
||||
... when != da = e4
|
||||
-e->data = da;
|
||||
|
|
||||
-e.data = da;
|
||||
... when != func = e5
|
||||
-e.function = func;
|
||||
|
|
||||
-e->data = da;
|
||||
... when != func = e5
|
||||
-e->function = func;
|
||||
)
|
||||
... when != func = e2
|
||||
when != da = e3
|
||||
-init_timer
|
||||
+setup_timer
|
||||
( \(&e\|e\)
|
||||
+, func, da
|
||||
);
|
||||
|
||||
@r1 exists@
|
||||
expression t;
|
||||
identifier f;
|
||||
position p;
|
||||
@@
|
||||
|
||||
f(...) { ... when any
|
||||
init_timer@p(...)
|
||||
init_timer@p(\(&t\|t\))
|
||||
... when any
|
||||
}
|
||||
|
||||
@r2 exists@
|
||||
expression r1.t;
|
||||
identifier g != r1.f;
|
||||
struct timer_list t;
|
||||
expression e8;
|
||||
@@
|
||||
|
||||
g(...) { ... when any
|
||||
t.data = e8
|
||||
\(t.data\|t->data\) = e8
|
||||
... when any
|
||||
}
|
||||
|
||||
@@ -77,14 +141,31 @@ p << r1.p;
|
||||
cocci.include_match(False)
|
||||
|
||||
@r3 depends on patch && !context && !org && !report@
|
||||
expression e6, e7, c;
|
||||
expression r1.t, func, e7;
|
||||
position r1.p;
|
||||
@@
|
||||
|
||||
-init_timer@p (&e6);
|
||||
+setup_timer (&e6, c, 0UL);
|
||||
... when != c = e7
|
||||
-e6.function = c;
|
||||
(
|
||||
-init_timer@p(&t);
|
||||
+setup_timer(&t, func, 0UL);
|
||||
... when != func = e7
|
||||
-t.function = func;
|
||||
|
|
||||
-t.function = func;
|
||||
... when != func = e7
|
||||
-init_timer@p(&t);
|
||||
+setup_timer(&t, func, 0UL);
|
||||
|
|
||||
-init_timer@p(t);
|
||||
+setup_timer(t, func, 0UL);
|
||||
... when != func = e7
|
||||
-t->function = func;
|
||||
|
|
||||
-t->function = func;
|
||||
... when != func = e7
|
||||
-init_timer@p(t);
|
||||
+setup_timer(t, func, 0UL);
|
||||
)
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
@@ -104,11 +185,9 @@ position j0, j1, j2;
|
||||
)
|
||||
|
||||
@match_function_and_data_after_init_timer_context
|
||||
depends on !patch &&
|
||||
!match_immediate_function_data_after_init_timer_context &&
|
||||
(context || org || report)@
|
||||
depends on !patch && (context || org || report)@
|
||||
expression a, b, e1, e2, e3, e4, e5;
|
||||
position j0, j1, j2;
|
||||
position j0 != match_immediate_function_data_after_init_timer_context.j0,j1,j2;
|
||||
@@
|
||||
|
||||
* init_timer@j0 (&e1);
|
||||
@@ -124,13 +203,12 @@ position j0, j1, j2;
|
||||
* e1@j2.function = a;
|
||||
)
|
||||
|
||||
@r3_context depends on !patch &&
|
||||
!match_immediate_function_data_after_init_timer_context &&
|
||||
!match_function_and_data_after_init_timer_context &&
|
||||
(context || org || report)@
|
||||
@r3_context depends on !patch && (context || org || report)@
|
||||
expression c, e6, e7;
|
||||
position r1.p;
|
||||
position j0, j1;
|
||||
position j0 !=
|
||||
{match_immediate_function_data_after_init_timer_context.j0,
|
||||
match_function_and_data_after_init_timer_context.j0}, j1;
|
||||
@@
|
||||
|
||||
* init_timer@j0@p (&e6);
|
||||
|
Reference in New Issue
Block a user