aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rw-r--r--scripts/Kbuild.include51
-rw-r--r--scripts/Kconfig.include9
-rw-r--r--scripts/Makefile5
-rw-r--r--scripts/Makefile.build11
-rw-r--r--scripts/Makefile.extrawarn24
-rw-r--r--scripts/Makefile.headersinst134
-rw-r--r--scripts/Makefile.host16
-rw-r--r--scripts/Makefile.kcov1
-rw-r--r--scripts/Makefile.lib54
-rw-r--r--scripts/Makefile.modbuiltin2
-rwxr-xr-xscripts/adjust_autoksyms.sh4
-rw-r--r--scripts/asn1_compiler.c6
-rwxr-xr-xscripts/atomic/check-atomics.sh2
-rw-r--r--scripts/basic/Makefile1
-rw-r--r--scripts/basic/fixdep.c51
-rwxr-xr-xscripts/bootgraph.pl16
-rwxr-xr-xscripts/checkkconfigsymbols.py2
-rwxr-xr-xscripts/checkpatch.pl12
-rwxr-xr-xscripts/checkstack.pl2
-rw-r--r--scripts/coccinelle/api/alloc/alloc_cast.cocci5
-rw-r--r--scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci3
-rw-r--r--scripts/coccinelle/api/alloc/zalloc-simple.cocci7
-rw-r--r--scripts/coccinelle/api/check_bq27xxx_data.cocci3
-rw-r--r--scripts/coccinelle/api/err_cast.cocci7
-rw-r--r--scripts/coccinelle/api/kstrdup.cocci15
-rw-r--r--scripts/coccinelle/api/memdup.cocci7
-rw-r--r--scripts/coccinelle/api/memdup_user.cocci7
-rw-r--r--scripts/coccinelle/api/platform_no_drv_owner.cocci3
-rw-r--r--scripts/coccinelle/api/pm_runtime.cocci3
-rw-r--r--scripts/coccinelle/api/ptr_ret.cocci5
-rw-r--r--scripts/coccinelle/api/resource_size.cocci7
-rw-r--r--scripts/coccinelle/api/stream_open.cocci8
-rw-r--r--scripts/coccinelle/free/clk_put.cocci5
-rw-r--r--scripts/coccinelle/free/devm_free.cocci7
-rw-r--r--scripts/coccinelle/free/ifnullfree.cocci3
-rw-r--r--scripts/coccinelle/free/iounmap.cocci5
-rw-r--r--scripts/coccinelle/free/kfree.cocci7
-rw-r--r--scripts/coccinelle/free/kfreeaddr.cocci3
-rw-r--r--scripts/coccinelle/free/pci_free_consistent.cocci3
-rw-r--r--scripts/coccinelle/free/put_device.cocci11
-rw-r--r--scripts/coccinelle/iterators/device_node_continue.cocci3
-rw-r--r--scripts/coccinelle/iterators/fen.cocci7
-rw-r--r--scripts/coccinelle/iterators/itnull.cocci7
-rw-r--r--scripts/coccinelle/iterators/list_entry_update.cocci7
-rw-r--r--scripts/coccinelle/iterators/use_after_iter.cocci5
-rw-r--r--scripts/coccinelle/locks/call_kern.cocci7
-rw-r--r--scripts/coccinelle/locks/double_lock.cocci7
-rw-r--r--scripts/coccinelle/locks/flags.cocci7
-rw-r--r--scripts/coccinelle/locks/mini_lock.cocci7
-rw-r--r--scripts/coccinelle/misc/array_size.cocci3
-rw-r--r--scripts/coccinelle/misc/badty.cocci3
-rw-r--r--scripts/coccinelle/misc/boolconv.cocci3
-rw-r--r--scripts/coccinelle/misc/boolinit.cocci5
-rw-r--r--scripts/coccinelle/misc/bugon.cocci3
-rw-r--r--scripts/coccinelle/misc/cond_no_effect.cocci3
-rw-r--r--scripts/coccinelle/misc/cstptr.cocci5
-rw-r--r--scripts/coccinelle/misc/doubleinit.cocci7
-rw-r--r--scripts/coccinelle/misc/ifaddr.cocci5
-rw-r--r--scripts/coccinelle/misc/ifcol.cocci7
-rw-r--r--scripts/coccinelle/misc/noderef.cocci5
-rw-r--r--scripts/coccinelle/misc/orplus.cocci5
-rw-r--r--scripts/coccinelle/misc/returnvar.cocci3
-rw-r--r--scripts/coccinelle/misc/semicolon.cocci3
-rw-r--r--scripts/coccinelle/misc/warn.cocci5
-rw-r--r--scripts/coccinelle/null/badzero.cocci5
-rw-r--r--scripts/coccinelle/null/deref_null.cocci7
-rw-r--r--scripts/coccinelle/null/eno.cocci7
-rw-r--r--scripts/coccinelle/null/kmerr.cocci7
-rw-r--r--scripts/coccinelle/tests/doublebitand.cocci7
-rw-r--r--scripts/coccinelle/tests/doubletest.cocci7
-rw-r--r--scripts/coccinelle/tests/odd_ptr_err.cocci5
-rw-r--r--scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci3
-rw-r--r--scripts/conmakehash.c5
-rwxr-xr-xscripts/decode_stacktrace.sh6
-rwxr-xr-xscripts/documentation-file-ref-check58
-rw-r--r--scripts/dtc/Makefile6
-rw-r--r--scripts/dtc/Makefile.dtc1
-rw-r--r--scripts/dtc/checks.c72
-rw-r--r--scripts/dtc/data.c17
-rwxr-xr-xscripts/dtc/dt_to_config3
-rw-r--r--scripts/dtc/dtc-lexer.l17
-rw-r--r--scripts/dtc/dtc-parser.y17
-rw-r--r--scripts/dtc/dtc.c17
-rw-r--r--scripts/dtc/dtc.h20
-rwxr-xr-xscripts/dtc/dtx_diff4
-rw-r--r--scripts/dtc/fdtget.c16
-rw-r--r--scripts/dtc/fdtput.c16
-rw-r--r--scripts/dtc/flattree.c19
-rw-r--r--scripts/dtc/fstree.c17
-rw-r--r--scripts/dtc/libfdt/Makefile.libfdt3
-rw-r--r--scripts/dtc/libfdt/fdt.c47
-rw-r--r--scripts/dtc/libfdt/fdt.h47
-rw-r--r--scripts/dtc/libfdt/fdt_addresses.c94
-rw-r--r--scripts/dtc/libfdt/fdt_empty_tree.c47
-rw-r--r--scripts/dtc/libfdt/fdt_overlay.c57
-rw-r--r--scripts/dtc/libfdt/fdt_ro.c97
-rw-r--r--scripts/dtc/libfdt/fdt_rw.c69
-rw-r--r--scripts/dtc/libfdt/fdt_strerror.c47
-rw-r--r--scripts/dtc/libfdt/fdt_sw.c125
-rw-r--r--scripts/dtc/libfdt/fdt_wip.c47
-rw-r--r--scripts/dtc/libfdt/libfdt.h205
-rw-r--r--scripts/dtc/libfdt/libfdt_env.h48
-rw-r--r--scripts/dtc/libfdt/libfdt_internal.h47
-rw-r--r--scripts/dtc/livetree.c37
-rw-r--r--scripts/dtc/srcpos.c16
-rw-r--r--scripts/dtc/srcpos.h16
-rw-r--r--scripts/dtc/treesource.c17
-rw-r--r--scripts/dtc/util.c16
-rw-r--r--scripts/dtc/util.h20
-rw-r--r--scripts/dtc/version_gen.h2
-rw-r--r--scripts/dtc/yamltree.c16
-rwxr-xr-xscripts/export_report.pl2
-rwxr-xr-xscripts/extract-vmlinux2
-rwxr-xr-xscripts/extract_xc3028.pl2
-rw-r--r--scripts/gcc-plugins/Kconfig1
-rw-r--r--scripts/gcc-plugins/gcc-common.h4
-rw-r--r--scripts/gdb/Makefile1
-rw-r--r--scripts/gdb/linux/Makefile2
-rw-r--r--scripts/gdb/linux/clk.py76
-rw-r--r--scripts/gdb/linux/config.py44
-rw-r--r--scripts/gdb/linux/constants.py.in18
-rw-r--r--scripts/gdb/linux/cpus.py1
-rw-r--r--scripts/gdb/linux/lists.py26
-rw-r--r--scripts/gdb/linux/proc.py10
-rw-r--r--scripts/gdb/linux/rbtree.py177
-rw-r--r--scripts/gdb/linux/symbols.py6
-rw-r--r--scripts/gdb/linux/tasks.py2
-rw-r--r--scripts/gdb/linux/timerlist.py219
-rw-r--r--scripts/gdb/linux/utils.py7
-rw-r--r--scripts/gdb/vmlinux-gdb.py4
-rw-r--r--scripts/genksyms/Makefile4
-rw-r--r--scripts/genksyms/genksyms.c15
-rw-r--r--scripts/genksyms/genksyms.h15
-rw-r--r--scripts/genksyms/keywords.c5
-rw-r--r--scripts/genksyms/parse.y2
-rwxr-xr-xscripts/get_abi.pl468
-rwxr-xr-xscripts/get_dvb_firmware15
-rwxr-xr-xscripts/gfp-translate2
-rwxr-xr-xscripts/headers.sh29
-rwxr-xr-xscripts/headers_install.sh48
-rw-r--r--scripts/kallsyms.c3
-rw-r--r--scripts/kconfig/Makefile12
-rw-r--r--scripts/kconfig/conf.c10
-rw-r--r--scripts/kconfig/confdata.c157
-rw-r--r--scripts/kconfig/gconf.c2
-rw-r--r--scripts/kconfig/lexer.l3
-rw-r--r--scripts/kconfig/lkc.h2
-rw-r--r--scripts/kconfig/lkc_proto.h3
-rw-r--r--scripts/kconfig/lxdialog/BIG.FAT.WARNING2
-rw-r--r--scripts/kconfig/mconf.c12
-rwxr-xr-x[-rw-r--r--]scripts/kconfig/nconf-cfg.sh0
-rw-r--r--scripts/kconfig/nconf.c13
-rw-r--r--scripts/kconfig/preprocess.c3
-rw-r--r--scripts/kconfig/qconf.cc2
-rw-r--r--scripts/kconfig/symbol.c4
-rw-r--r--scripts/kconfig/tests/err_recursive_dep/expected_stderr14
-rw-r--r--scripts/kconfig/tests/err_recursive_inc/Kconfig1
-rw-r--r--scripts/kconfig/tests/err_recursive_inc/Kconfig.inc11
-rw-r--r--scripts/kconfig/tests/err_recursive_inc/Kconfig.inc21
-rw-r--r--scripts/kconfig/tests/err_recursive_inc/Kconfig.inc31
-rw-r--r--scripts/kconfig/tests/err_recursive_inc/expected_stderr6
-rwxr-xr-xscripts/kernel-doc18
-rwxr-xr-xscripts/leaking_addresses.pl2
-rwxr-xr-xscripts/markup_oops.pl5
-rwxr-xr-xscripts/modules-check.sh16
-rwxr-xr-xscripts/objdiff2
-rw-r--r--scripts/package/Makefile3
-rwxr-xr-xscripts/package/builddeb2
-rwxr-xr-xscripts/package/mkspec2
-rw-r--r--scripts/recordmcount.c2
-rw-r--r--scripts/recordmcount.h3
-rwxr-xr-xscripts/recordmcount.pl2
-rw-r--r--scripts/selinux/Makefile1
-rw-r--r--scripts/selinux/mdp/mdp.c15
-rwxr-xr-xscripts/show_delta2
-rw-r--r--scripts/sortextable.c2
-rw-r--r--scripts/sortextable.h4
-rwxr-xr-xscripts/spdxcheck.py7
-rw-r--r--scripts/spelling.txt36
-rwxr-xr-xscripts/sphinx-pre-install154
-rwxr-xr-xscripts/tags.sh44
-rwxr-xr-xscripts/tracing/draw_functrace.py2
182 files changed, 2298 insertions, 1613 deletions
diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include
index 7484b9d8272f..73e80b917f12 100644
--- a/scripts/Kbuild.include
+++ b/scripts/Kbuild.include
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0
1#### 2####
2# kbuild: Generic definitions 3# kbuild: Generic definitions
3 4
@@ -67,14 +68,19 @@ endef
67 68
68###### 69######
69# gcc support functions 70# gcc support functions
70# See documentation in Documentation/kbuild/makefiles.txt 71# See documentation in Documentation/kbuild/makefiles.rst
71 72
72# cc-cross-prefix 73# cc-cross-prefix
73# Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-) 74# Usage: CROSS_COMPILE := $(call cc-cross-prefix, m68k-linux-gnu- m68k-linux-)
74# Return first <prefix> where a <prefix>gcc is found in PATH. 75# Return first <prefix> where a <prefix>gcc is found in PATH.
75# If no gcc found in PATH with listed prefixes return nothing 76# If no gcc found in PATH with listed prefixes return nothing
76cc-cross-prefix = $(firstword $(foreach c, $(filter-out -%, $(1)), \ 77#
77 $(if $(shell which $(c)gcc), $(c)))) 78# Note: '2>/dev/null' is here to force Make to invoke a shell. Otherwise, it
79# would try to directly execute the shell builtin 'command'. This workaround
80# should be kept for a long time since this issue was fixed only after the
81# GNU Make 4.2.1 release.
82cc-cross-prefix = $(firstword $(foreach c, $(1), \
83 $(if $(shell command -v -- $(c)gcc 2>/dev/null), $(c))))
78 84
79# output directory for tests below 85# output directory for tests below
80TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/) 86TMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)
@@ -138,11 +144,6 @@ cc-disable-warning = $(call try-run,\
138# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1) 144# Usage: EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
139cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4)) 145cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4))
140 146
141# cc-ldoption
142# Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
143cc-ldoption = $(call try-run,\
144 $(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
145
146# ld-option 147# ld-option
147# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y) 148# Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
148ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3)) 149ld-option = $(call try-run, $(LD) $(KBUILD_LDFLAGS) $(1) -v,$(1),$(2),$(3))
@@ -186,20 +187,6 @@ dtbinst := -f $(srctree)/scripts/Makefile.dtbinst obj
186# $(Q)$(MAKE) $(clean)=dir 187# $(Q)$(MAKE) $(clean)=dir
187clean := -f $(srctree)/scripts/Makefile.clean obj 188clean := -f $(srctree)/scripts/Makefile.clean obj
188 189
189###
190# Shorthand for $(Q)$(MAKE) -f scripts/Makefile.headersinst obj=
191# Usage:
192# $(Q)$(MAKE) $(hdr-inst)=dir
193hdr-inst := -f $(srctree)/scripts/Makefile.headersinst obj
194
195# Prefix -I with $(srctree) if it is not an absolute path.
196# skip if -I has no parameter
197addtree = $(if $(patsubst -I%,%,$(1)), \
198$(if $(filter-out -I/% -I./% -I../%,$(1)),$(patsubst -I%,-I$(srctree)/%,$(1)),$(1)),$(1))
199
200# Find all -I options and call addtree
201flags = $(foreach o,$($(1)),$(if $(filter -I%,$(o)),$(call addtree,$(o)),$(o)))
202
203# echo command. 190# echo command.
204# Short version is used, if $(quiet) equals `quiet_', otherwise full one. 191# Short version is used, if $(quiet) equals `quiet_', otherwise full one.
205echo-cmd = $(if $($(quiet)cmd_$(1)),\ 192echo-cmd = $(if $($(quiet)cmd_$(1)),\
@@ -217,15 +204,15 @@ objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o)))
217# if_changed_dep - as if_changed, but uses fixdep to reveal dependencies 204# if_changed_dep - as if_changed, but uses fixdep to reveal dependencies
218# including used config symbols 205# including used config symbols
219# if_changed_rule - as if_changed but execute rule instead 206# if_changed_rule - as if_changed but execute rule instead
220# See Documentation/kbuild/makefiles.txt for more info 207# See Documentation/kbuild/makefiles.rst for more info
221 208
222ifneq ($(KBUILD_NOCMDDEP),1) 209ifneq ($(KBUILD_NOCMDDEP),1)
223# Check if both arguments are the same including their order. Result is empty 210# Check if both commands are the same including their order. Result is empty
224# string if equal. User may override this check using make KBUILD_NOCMDDEP=1 211# string if equal. User may override this check using make KBUILD_NOCMDDEP=1
225arg-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \ 212cmd-check = $(filter-out $(subst $(space),$(space_escape),$(strip $(cmd_$@))), \
226 $(subst $(space),$(space_escape),$(strip $(cmd_$1)))) 213 $(subst $(space),$(space_escape),$(strip $(cmd_$1))))
227else 214else
228arg-check = $(if $(strip $(cmd_$@)),,1) 215cmd-check = $(if $(strip $(cmd_$@)),,1)
229endif 216endif
230 217
231# Replace >$< with >$$< to preserve $ when reloading the .cmd file 218# Replace >$< with >$$< to preserve $ when reloading the .cmd file
@@ -238,15 +225,15 @@ make-cmd = $(call escsq,$(subst $(pound),$$(pound),$(subst $$,$$$$,$(cmd_$(1))))
238 225
239# Find any prerequisites that is newer than target or that does not exist. 226# Find any prerequisites that is newer than target or that does not exist.
240# PHONY targets skipped in both cases. 227# PHONY targets skipped in both cases.
241any-prereq = $(filter-out $(PHONY),$?) $(filter-out $(PHONY) $(wildcard $^),$^) 228any-prereq = $(filter-out $(PHONY),$?)$(filter-out $(PHONY) $(wildcard $^),$^)
242 229
243# Execute command if command has changed or prerequisite(s) are updated. 230# Execute command if command has changed or prerequisite(s) are updated.
244if_changed = $(if $(strip $(any-prereq) $(arg-check)), \ 231if_changed = $(if $(any-prereq)$(cmd-check), \
245 $(cmd); \ 232 $(cmd); \
246 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) 233 printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
247 234
248# Execute the command and also postprocess generated .d dependencies file. 235# Execute the command and also postprocess generated .d dependencies file.
249if_changed_dep = $(if $(strip $(any-prereq) $(arg-check)),$(cmd_and_fixdep),@:) 236if_changed_dep = $(if $(any-prereq)$(cmd-check),$(cmd_and_fixdep),@:)
250 237
251cmd_and_fixdep = \ 238cmd_and_fixdep = \
252 $(cmd); \ 239 $(cmd); \
@@ -256,7 +243,7 @@ cmd_and_fixdep = \
256# Usage: $(call if_changed_rule,foo) 243# Usage: $(call if_changed_rule,foo)
257# Will check if $(cmd_foo) or any of the prerequisites changed, 244# Will check if $(cmd_foo) or any of the prerequisites changed,
258# and if so will execute $(rule_foo). 245# and if so will execute $(rule_foo).
259if_changed_rule = $(if $(strip $(any-prereq) $(arg-check)),$(rule_$(1)),@:) 246if_changed_rule = $(if $(any-prereq)$(cmd-check),$(rule_$(1)),@:)
260 247
261### 248###
262# why - tell why a target got built 249# why - tell why a target got built
@@ -281,8 +268,8 @@ ifeq ($(KBUILD_VERBOSE),2)
281why = \ 268why = \
282 $(if $(filter $@, $(PHONY)),- due to target is PHONY, \ 269 $(if $(filter $@, $(PHONY)),- due to target is PHONY, \
283 $(if $(wildcard $@), \ 270 $(if $(wildcard $@), \
284 $(if $(strip $(any-prereq)),- due to: $(any-prereq), \ 271 $(if $(any-prereq),- due to: $(any-prereq), \
285 $(if $(arg-check), \ 272 $(if $(cmd-check), \
286 $(if $(cmd_$@),- due to command line change, \ 273 $(if $(cmd_$@),- due to command line change, \
287 $(if $(filter $@, $(targets)), \ 274 $(if $(filter $@, $(targets)), \
288 - due to missing .cmd file, \ 275 - due to missing .cmd file, \
diff --git a/scripts/Kconfig.include b/scripts/Kconfig.include
index 87ff1dcc6bd5..8a5c4d645eb1 100644
--- a/scripts/Kconfig.include
+++ b/scripts/Kconfig.include
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0-only
1# Kconfig helper macros 2# Kconfig helper macros
2 3
3# Convenient variables 4# Convenient variables
@@ -18,6 +19,10 @@ if-success = $(shell,{ $(1); } >/dev/null 2>&1 && echo "$(2)" || echo "$(3)")
18# Return y if <command> exits with 0, n otherwise 19# Return y if <command> exits with 0, n otherwise
19success = $(if-success,$(1),y,n) 20success = $(if-success,$(1),y,n)
20 21
22# $(failure,<command>)
23# Return n if <command> exits with 0, y otherwise
24failure = $(if-success,$(1),n,y)
25
21# $(cc-option,<flag>) 26# $(cc-option,<flag>)
22# Return y if the compiler supports <flag>, n otherwise 27# Return y if the compiler supports <flag>, n otherwise
23cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null) 28cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null)
@@ -26,5 +31,9 @@ cc-option = $(success,$(CC) -Werror $(1) -E -x c /dev/null -o /dev/null)
26# Return y if the linker supports <flag>, n otherwise 31# Return y if the linker supports <flag>, n otherwise
27ld-option = $(success,$(LD) -v $(1)) 32ld-option = $(success,$(LD) -v $(1))
28 33
34# check if $(CC) and $(LD) exist
35$(error-if,$(failure,command -v $(CC)),compiler '$(CC)' not found)
36$(error-if,$(failure,command -v $(LD)),linker '$(LD)' not found)
37
29# gcc version including patch level 38# gcc version including patch level
30gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh $(CC)) 39gcc-version := $(shell,$(srctree)/scripts/gcc-version.sh $(CC))
diff --git a/scripts/Makefile b/scripts/Makefile
index 9d442ee050bd..16bcb8087899 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -31,11 +31,6 @@ always := $(hostprogs-y) $(hostprogs-m)
31# The following hostprogs-y programs are only build on demand 31# The following hostprogs-y programs are only build on demand
32hostprogs-y += unifdef 32hostprogs-y += unifdef
33 33
34# These targets are used internally to avoid "is up to date" messages
35PHONY += build_unifdef
36build_unifdef: $(obj)/unifdef
37 @:
38
39subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins 34subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
40subdir-$(CONFIG_MODVERSIONS) += genksyms 35subdir-$(CONFIG_MODVERSIONS) += genksyms
41subdir-$(CONFIG_SECURITY_SELINUX) += selinux 36subdir-$(CONFIG_SECURITY_SELINUX) += selinux
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index ae9cf740633e..be38198d98b2 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -294,6 +294,15 @@ quiet_cmd_cc_lst_c = MKLST $@
294$(obj)/%.lst: $(src)/%.c FORCE 294$(obj)/%.lst: $(src)/%.c FORCE
295 $(call if_changed_dep,cc_lst_c) 295 $(call if_changed_dep,cc_lst_c)
296 296
297# header test (header-test-y target)
298# ---------------------------------------------------------------------------
299
300quiet_cmd_cc_s_h = CC $@
301 cmd_cc_s_h = $(CC) $(c_flags) -S -o $@ -x c /dev/null -include $<
302
303$(obj)/%.h.s: $(src)/%.h FORCE
304 $(call if_changed_dep,cc_s_h)
305
297# Compile assembler sources (.S) 306# Compile assembler sources (.S)
298# --------------------------------------------------------------------------- 307# ---------------------------------------------------------------------------
299 308
@@ -504,7 +513,7 @@ existing-targets := $(wildcard $(sort $(targets)))
504 513
505-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd) 514-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
506 515
507ifneq ($(srctree),.) 516ifdef building_out_of_srctree
508# Create directories for object files if they do not exist 517# Create directories for object files if they do not exist
509obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets)))) 518obj-dirs := $(sort $(obj) $(patsubst %/,%, $(dir $(targets))))
510# If targets exist, their directories apparently exist. Skip mkdir. 519# If targets exist, their directories apparently exist. Skip mkdir.
diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
index 768306add591..a74ce2e3c33e 100644
--- a/scripts/Makefile.extrawarn
+++ b/scripts/Makefile.extrawarn
@@ -23,24 +23,24 @@ warning- := $(empty)
23warning-1 := -Wextra -Wunused -Wno-unused-parameter 23warning-1 := -Wextra -Wunused -Wno-unused-parameter
24warning-1 += -Wmissing-declarations 24warning-1 += -Wmissing-declarations
25warning-1 += -Wmissing-format-attribute 25warning-1 += -Wmissing-format-attribute
26warning-1 += $(call cc-option, -Wmissing-prototypes) 26warning-1 += -Wmissing-prototypes
27warning-1 += -Wold-style-definition 27warning-1 += -Wold-style-definition
28warning-1 += $(call cc-option, -Wmissing-include-dirs) 28warning-1 += -Wmissing-include-dirs
29warning-1 += $(call cc-option, -Wunused-but-set-variable) 29warning-1 += $(call cc-option, -Wunused-but-set-variable)
30warning-1 += $(call cc-option, -Wunused-const-variable) 30warning-1 += $(call cc-option, -Wunused-const-variable)
31warning-1 += $(call cc-option, -Wpacked-not-aligned) 31warning-1 += $(call cc-option, -Wpacked-not-aligned)
32warning-1 += $(call cc-option, -Wstringop-truncation) 32warning-1 += $(call cc-option, -Wstringop-truncation)
33warning-1 += $(call cc-disable-warning, missing-field-initializers) 33# The following turn off the warnings enabled by -Wextra
34warning-1 += $(call cc-disable-warning, sign-compare) 34warning-1 += -Wno-missing-field-initializers
35warning-1 += -Wno-sign-compare
35 36
36warning-2 := -Waggregate-return
37warning-2 += -Wcast-align 37warning-2 += -Wcast-align
38warning-2 += -Wdisabled-optimization 38warning-2 += -Wdisabled-optimization
39warning-2 += -Wnested-externs 39warning-2 += -Wnested-externs
40warning-2 += -Wshadow 40warning-2 += -Wshadow
41warning-2 += $(call cc-option, -Wlogical-op) 41warning-2 += $(call cc-option, -Wlogical-op)
42warning-2 += $(call cc-option, -Wmissing-field-initializers) 42warning-2 += -Wmissing-field-initializers
43warning-2 += $(call cc-option, -Wsign-compare) 43warning-2 += -Wsign-compare
44warning-2 += $(call cc-option, -Wmaybe-uninitialized) 44warning-2 += $(call cc-option, -Wmaybe-uninitialized)
45warning-2 += $(call cc-option, -Wunused-macros) 45warning-2 += $(call cc-option, -Wunused-macros)
46 46
@@ -66,11 +66,9 @@ KBUILD_CFLAGS += $(warning)
66else 66else
67 67
68ifdef CONFIG_CC_IS_CLANG 68ifdef CONFIG_CC_IS_CLANG
69KBUILD_CFLAGS += $(call cc-disable-warning, initializer-overrides) 69KBUILD_CFLAGS += -Wno-initializer-overrides
70KBUILD_CFLAGS += $(call cc-disable-warning, unused-value) 70KBUILD_CFLAGS += -Wno-format
71KBUILD_CFLAGS += $(call cc-disable-warning, format) 71KBUILD_CFLAGS += -Wno-sign-compare
72KBUILD_CFLAGS += $(call cc-disable-warning, sign-compare) 72KBUILD_CFLAGS += -Wno-format-zero-length
73KBUILD_CFLAGS += $(call cc-disable-warning, format-zero-length)
74KBUILD_CFLAGS += $(call cc-disable-warning, uninitialized)
75endif 73endif
76endif 74endif
diff --git a/scripts/Makefile.headersinst b/scripts/Makefile.headersinst
index 3d1ebaabd1b6..1b405a7ed14f 100644
--- a/scripts/Makefile.headersinst
+++ b/scripts/Makefile.headersinst
@@ -14,109 +14,89 @@ __headers:
14 14
15include scripts/Kbuild.include 15include scripts/Kbuild.include
16 16
17srcdir := $(srctree)/$(obj) 17src := $(srctree)/$(obj)
18gen := $(objtree)/$(subst include/,include/generated/,$(obj))
19dst := usr/include
18 20
19# When make is run under a fakechroot environment, the function 21-include $(src)/Kbuild
20# $(wildcard $(srcdir)/*/.) doesn't only return directories, but also regular
21# files. So, we are using a combination of sort/dir/wildcard which works
22# with fakechroot.
23subdirs := $(patsubst $(srcdir)/%/,%,\
24 $(filter-out $(srcdir)/,\
25 $(sort $(dir $(wildcard $(srcdir)/*/)))))
26 22
27# Recursion 23# $(filter %/, ...) is a workaround for GNU Make <= 4.2.1, where
28__headers: $(subdirs) 24# $(wildcard $(src)/*/) contains not only directories but also regular files.
25src-subdirs := $(patsubst $(src)/%/,%,$(filter %/, $(wildcard $(src)/*/)))
26gen-subdirs := $(patsubst $(gen)/%/,%,$(filter %/, $(wildcard $(gen)/*/)))
27all-subdirs := $(sort $(src-subdirs) $(gen-subdirs))
29 28
30PHONY += $(subdirs) 29src-headers := $(if $(src-subdirs), $(shell cd $(src) && find $(src-subdirs) -name '*.h'))
31$(subdirs): 30src-headers := $(filter-out $(no-export-headers), $(src-headers))
32 $(Q)$(MAKE) $(hdr-inst)=$(obj)/$@ dst=$(dst)/$@ 31gen-headers := $(if $(gen-subdirs), $(shell cd $(gen) && find $(gen-subdirs) -name '*.h'))
32gen-headers := $(filter-out $(no-export-headers), $(gen-headers))
33 33
34# Skip header install/check for include/uapi and arch/$(SRCARCH)/include/uapi. 34# If the same header is exported from source and generated directories,
35# We have only sub-directories there. 35# the former takes precedence, but this should be warned.
36skip-inst := $(if $(filter %/uapi,$(obj)),1) 36duplicated := $(filter $(gen-headers), $(src-headers))
37$(if $(duplicated), $(warning duplicated header export: $(duplicated)))
37 38
38ifeq ($(skip-inst),) 39gen-headers := $(filter-out $(duplicated), $(gen-headers))
39 40
40# Kbuild file is optional 41# Add dst path prefix
41kbuild-file := $(srctree)/$(obj)/Kbuild 42all-subdirs := $(addprefix $(dst)/, $(all-subdirs))
42-include $(kbuild-file) 43src-headers := $(addprefix $(dst)/, $(src-headers))
44gen-headers := $(addprefix $(dst)/, $(gen-headers))
45all-headers := $(src-headers) $(gen-headers)
43 46
44installdir := $(INSTALL_HDR_PATH)/$(dst) 47# Work out what needs to be removed
45gendir := $(objtree)/$(subst include/,include/generated/,$(obj)) 48old-subdirs := $(wildcard $(all-subdirs))
46header-files := $(notdir $(wildcard $(srcdir)/*.h)) 49old-headers := $(if $(old-subdirs),$(shell find $(old-subdirs) -name '*.h'))
47header-files := $(filter-out $(no-export-headers), $(header-files)) 50unwanted := $(filter-out $(all-headers), $(old-headers))
48genhdr-files := $(notdir $(wildcard $(gendir)/*.h))
49genhdr-files := $(filter-out $(header-files), $(genhdr-files))
50 51
51# files used to track state of install/check 52# Create directories
52install-file := $(installdir)/.install 53existing-dirs := $(sort $(dir $(old-headers)))
53check-file := $(installdir)/.check 54wanted-dirs := $(sort $(dir $(all-headers)))
55new-dirs := $(filter-out $(existing-dirs), $(wanted-dirs))
56$(if $(new-dirs), $(shell mkdir -p $(new-dirs)))
54 57
55# all headers files for this dir 58# Rules
56all-files := $(header-files) $(genhdr-files)
57output-files := $(addprefix $(installdir)/, $(all-files))
58 59
59# Work out what needs to be removed 60ifndef HDRCHECK
60oldheaders := $(patsubst $(installdir)/%,%,$(wildcard $(installdir)/*.h))
61unwanted := $(filter-out $(all-files),$(oldheaders))
62 61
63# Prefix unwanted with full paths to $(INSTALL_HDR_PATH) 62quiet_cmd_install = HDRINST $@
64unwanted-file := $(addprefix $(installdir)/, $(unwanted)) 63 cmd_install = $(CONFIG_SHELL) $(srctree)/scripts/headers_install.sh $< $@
65 64
66printdir = $(patsubst $(INSTALL_HDR_PATH)/%/,%,$(dir $@)) 65$(src-headers): $(dst)/%.h: $(src)/%.h $(srctree)/scripts/headers_install.sh FORCE
66 $(call if_changed,install)
67 67
68quiet_cmd_install = INSTALL $(printdir) ($(words $(all-files))\ 68$(gen-headers): $(dst)/%.h: $(gen)/%.h $(srctree)/scripts/headers_install.sh FORCE
69 file$(if $(word 2, $(all-files)),s)) 69 $(call if_changed,install)
70 cmd_install = \
71 $(CONFIG_SHELL) $< $(installdir) $(srcdir) $(header-files); \
72 $(CONFIG_SHELL) $< $(installdir) $(gendir) $(genhdr-files); \
73 touch $@
74 70
75quiet_cmd_remove = REMOVE $(unwanted) 71quiet_cmd_remove = REMOVE $(unwanted)
76 cmd_remove = rm -f $(unwanted-file) 72 cmd_remove = rm -f $(unwanted)
77
78quiet_cmd_check = CHECK $(printdir) ($(words $(all-files)) files)
79# Headers list can be pretty long, xargs helps to avoid
80# the "Argument list too long" error.
81 cmd_check = for f in $(all-files); do \
82 echo "$(installdir)/$${f}"; done \
83 | xargs \
84 $(PERL) $< $(INSTALL_HDR_PATH)/include $(SRCARCH); \
85 touch $@
86 73
87ifndef HDRCHECK 74__headers: $(all-headers)
88# Rules for installing headers 75ifneq ($(unwanted),)
89__headers: $(install-file) 76 $(call cmd,remove)
77endif
90 @: 78 @:
91 79
92targets += $(install-file) 80existing-headers := $(filter $(old-headers), $(all-headers))
93$(install-file): scripts/headers_install.sh \ 81
94 $(addprefix $(srcdir)/,$(header-files)) \ 82-include $(foreach f,$(existing-headers),$(dir $(f)).$(notdir $(f)).cmd)
95 $(addprefix $(gendir)/,$(genhdr-files)) FORCE
96 $(if $(unwanted),$(call cmd,remove),)
97 $(if $(wildcard $(dir $@)),,$(shell mkdir -p $(dir $@)))
98 $(call if_changed,install)
99 83
100else 84else
101__headers: $(check-file)
102 @:
103 85
104targets += $(check-file) 86quiet_cmd_check = HDRCHK $<
105$(check-file): scripts/headers_check.pl $(output-files) FORCE 87 cmd_check = $(PERL) $(srctree)/scripts/headers_check.pl $(dst) $(SRCARCH) $<; touch $@
106 $(call if_changed,check)
107 88
108endif 89check-files := $(addsuffix .chk, $(all-headers))
109 90
110cmd_files := $(wildcard \ 91$(check-files): $(dst)/%.chk : $(dst)/% $(srctree)/scripts/headers_check.pl
111 $(foreach f,$(sort $(targets)),$(dir $(f)).$(notdir $(f)).cmd)) 92 $(call cmd,check)
112 93
113ifneq ($(cmd_files),) 94__headers: $(check-files)
114 include $(cmd_files) 95 @:
115endif
116 96
117endif # skip-inst 97endif
118 98
119PHONY += FORCE 99PHONY += FORCE
120FORCE: ; 100FORCE:
121 101
122.PHONY: $(PHONY) 102.PHONY: $(PHONY)
diff --git a/scripts/Makefile.host b/scripts/Makefile.host
index 73b804197fca..2208ebbd8c4c 100644
--- a/scripts/Makefile.host
+++ b/scripts/Makefile.host
@@ -6,7 +6,7 @@
6# 6#
7# Both C and C++ are supported, but preferred language is C for such utilities. 7# Both C and C++ are supported, but preferred language is C for such utilities.
8# 8#
9# Sample syntax (see Documentation/kbuild/makefiles.txt for reference) 9# Sample syntax (see Documentation/kbuild/makefiles.rst for reference)
10# hostprogs-y := bin2hex 10# hostprogs-y := bin2hex
11# Will compile bin2hex.c and create an executable named bin2hex 11# Will compile bin2hex.c and create an executable named bin2hex
12# 12#
@@ -67,18 +67,16 @@ _hostc_flags = $(KBUILD_HOSTCFLAGS) $(HOST_EXTRACFLAGS) \
67_hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \ 67_hostcxx_flags = $(KBUILD_HOSTCXXFLAGS) $(HOST_EXTRACXXFLAGS) \
68 $(HOSTCXXFLAGS_$(basetarget).o) 68 $(HOSTCXXFLAGS_$(basetarget).o)
69 69
70__hostc_flags = $(_hostc_flags) 70# $(objtree)/$(obj) for including generated headers from checkin source files
71__hostcxx_flags = $(_hostcxx_flags)
72
73ifeq ($(KBUILD_EXTMOD),) 71ifeq ($(KBUILD_EXTMOD),)
74ifneq ($(srctree),.) 72ifdef building_out_of_srctree
75__hostc_flags = -I$(obj) $(call flags,_hostc_flags) 73_hostc_flags += -I $(objtree)/$(obj)
76__hostcxx_flags = -I$(obj) $(call flags,_hostcxx_flags) 74_hostcxx_flags += -I $(objtree)/$(obj)
77endif 75endif
78endif 76endif
79 77
80hostc_flags = -Wp,-MD,$(depfile) $(__hostc_flags) 78hostc_flags = -Wp,-MD,$(depfile) $(_hostc_flags)
81hostcxx_flags = -Wp,-MD,$(depfile) $(__hostcxx_flags) 79hostcxx_flags = -Wp,-MD,$(depfile) $(_hostcxx_flags)
82 80
83##### 81#####
84# Compile programs on the host 82# Compile programs on the host
diff --git a/scripts/Makefile.kcov b/scripts/Makefile.kcov
index 3d61c4bfcbee..52b113302443 100644
--- a/scripts/Makefile.kcov
+++ b/scripts/Makefile.kcov
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0-only
1ifdef CONFIG_KCOV 2ifdef CONFIG_KCOV
2 3
3kcov-flags-$(CONFIG_CC_HAS_SANCOV_TRACE_PC) += -fsanitize-coverage=trace-pc 4kcov-flags-$(CONFIG_CC_HAS_SANCOV_TRACE_PC) += -fsanitize-coverage=trace-pc
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 41e98fa66b91..6cb3aa5cbc79 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -66,6 +66,20 @@ extra-y += $(patsubst %.dtb,%.dt.yaml, $(dtb-y))
66extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-)) 66extra-$(CONFIG_OF_ALL_DTBS) += $(patsubst %.dtb,%.dt.yaml, $(dtb-))
67endif 67endif
68 68
69# Test self-contained headers
70
71# Wildcard searches in $(srctree)/$(src)/, but not in $(objtree)/$(obj)/.
72# Stale generated headers are often left over, so pattern matching should
73# be avoided. Please notice $(srctree)/$(src)/ and $(objtree)/$(obj) point
74# to the same location for in-tree building. So, header-test-pattern-y should
75# be used with care.
76header-test-y += $(filter-out $(header-test-), \
77 $(patsubst $(srctree)/$(src)/%, %, \
78 $(wildcard $(addprefix $(srctree)/$(src)/, \
79 $(header-test-pattern-y)))))
80
81extra-$(CONFIG_HEADER_TEST) += $(addsuffix .s, $(header-test-y))
82
69# Add subdir path 83# Add subdir path
70 84
71extra-y := $(addprefix $(obj)/,$(extra-y)) 85extra-y := $(addprefix $(obj)/,$(extra-y))
@@ -137,36 +151,26 @@ _c_flags += $(if $(patsubst n%,, \
137 $(CFLAGS_KCOV)) 151 $(CFLAGS_KCOV))
138endif 152endif
139 153
140__c_flags = $(_c_flags) 154# $(srctree)/$(src) for including checkin headers from generated source files
141__a_flags = $(_a_flags) 155# $(objtree)/$(obj) for including generated headers from checkin source files
142__cpp_flags = $(_cpp_flags)
143
144# If building the kernel in a separate objtree expand all occurrences
145# of -Idir to -I$(srctree)/dir except for absolute paths (starting with '/').
146ifeq ($(KBUILD_EXTMOD),) 156ifeq ($(KBUILD_EXTMOD),)
147ifneq ($(srctree),.) 157ifdef building_out_of_srctree
148 158_c_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
149# -I$(obj) locates generated .h files 159_a_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
150# $(call addtree,-I$(obj)) locates .h files in srctree, from generated .c files 160_cpp_flags += -I $(srctree)/$(src) -I $(objtree)/$(obj)
151# and locates generated .h files
152# FIXME: Replace both with specific CFLAGS* statements in the makefiles
153__c_flags = $(if $(obj),$(call addtree,-I$(src)) -I$(obj)) \
154 $(call flags,_c_flags)
155__a_flags = $(call flags,_a_flags)
156__cpp_flags = $(call flags,_cpp_flags)
157endif 161endif
158endif 162endif
159 163
160c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ 164c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
161 -include $(srctree)/include/linux/compiler_types.h \ 165 -include $(srctree)/include/linux/compiler_types.h \
162 $(__c_flags) $(modkern_cflags) \ 166 $(_c_flags) $(modkern_cflags) \
163 $(basename_flags) $(modname_flags) 167 $(basename_flags) $(modname_flags)
164 168
165a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ 169a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
166 $(__a_flags) $(modkern_aflags) 170 $(_a_flags) $(modkern_aflags)
167 171
168cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ 172cpp_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \
169 $(__cpp_flags) 173 $(_cpp_flags)
170 174
171ld_flags = $(KBUILD_LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F)) 175ld_flags = $(KBUILD_LDFLAGS) $(ldflags-y) $(LDFLAGS_$(@F))
172 176
@@ -308,7 +312,7 @@ DT_BINDING_DIR := Documentation/devicetree/bindings
308DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.yaml 312DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.yaml
309 313
310quiet_cmd_dtb_check = CHECK $@ 314quiet_cmd_dtb_check = CHECK $@
311 cmd_dtb_check = $(DT_CHECKER) -p $(DT_TMP_SCHEMA) $@ ; 315 cmd_dtb_check = $(DT_CHECKER) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ ;
312 316
313define rule_dtc_dt_yaml 317define rule_dtc_dt_yaml
314 $(call cmd_and_fixdep,dtc,yaml) 318 $(call cmd_and_fixdep,dtc,yaml)
@@ -341,19 +345,19 @@ printf "%08x\n" $$dec_size | \
341) 345)
342 346
343quiet_cmd_bzip2 = BZIP2 $@ 347quiet_cmd_bzip2 = BZIP2 $@
344 cmd_bzip2 = { cat $(real-prereqs) | bzip2 -9 && $(size_append); } > $@ 348 cmd_bzip2 = { cat $(real-prereqs) | bzip2 -9; $(size_append); } > $@
345 349
346# Lzma 350# Lzma
347# --------------------------------------------------------------------------- 351# ---------------------------------------------------------------------------
348 352
349quiet_cmd_lzma = LZMA $@ 353quiet_cmd_lzma = LZMA $@
350 cmd_lzma = { cat $(real-prereqs) | lzma -9 && $(size_append); } > $@ 354 cmd_lzma = { cat $(real-prereqs) | lzma -9; $(size_append); } > $@
351 355
352quiet_cmd_lzo = LZO $@ 356quiet_cmd_lzo = LZO $@
353 cmd_lzo = { cat $(real-prereqs) | lzop -9 && $(size_append); } > $@ 357 cmd_lzo = { cat $(real-prereqs) | lzop -9; $(size_append); } > $@
354 358
355quiet_cmd_lz4 = LZ4 $@ 359quiet_cmd_lz4 = LZ4 $@
356 cmd_lz4 = { cat $(real-prereqs) | lz4c -l -c1 stdin stdout && \ 360 cmd_lz4 = { cat $(real-prereqs) | lz4c -l -c1 stdin stdout; \
357 $(size_append); } > $@ 361 $(size_append); } > $@
358 362
359# U-Boot mkimage 363# U-Boot mkimage
@@ -396,7 +400,7 @@ quiet_cmd_uimage = UIMAGE $@
396# big dictionary would increase the memory usage too much in the multi-call 400# big dictionary would increase the memory usage too much in the multi-call
397# decompression mode. A BCJ filter isn't used either. 401# decompression mode. A BCJ filter isn't used either.
398quiet_cmd_xzkern = XZKERN $@ 402quiet_cmd_xzkern = XZKERN $@
399 cmd_xzkern = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh && \ 403 cmd_xzkern = { cat $(real-prereqs) | sh $(srctree)/scripts/xz_wrap.sh; \
400 $(size_append); } > $@ 404 $(size_append); } > $@
401 405
402quiet_cmd_xzmisc = XZMISC $@ 406quiet_cmd_xzmisc = XZMISC $@
diff --git a/scripts/Makefile.modbuiltin b/scripts/Makefile.modbuiltin
index ea90a90b41a0..50a9990760f3 100644
--- a/scripts/Makefile.modbuiltin
+++ b/scripts/Makefile.modbuiltin
@@ -15,7 +15,7 @@ include include/config/tristate.conf
15 15
16include scripts/Kbuild.include 16include scripts/Kbuild.include
17 17
18ifneq ($(srctree),.) 18ifdef building_out_of_srctree
19# Create output directory if not already present 19# Create output directory if not already present
20_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj)) 20_dummy := $(shell [ -d $(obj) ] || mkdir -p $(obj))
21endif 21endif
diff --git a/scripts/adjust_autoksyms.sh b/scripts/adjust_autoksyms.sh
index 84bf6b500815..aab4e299d7a2 100755
--- a/scripts/adjust_autoksyms.sh
+++ b/scripts/adjust_autoksyms.sh
@@ -1,13 +1,11 @@
1#!/bin/sh 1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3# Script to create/update include/generated/autoksyms.h and dependency files 4# Script to create/update include/generated/autoksyms.h and dependency files
4# 5#
5# Copyright: (C) 2016 Linaro Limited 6# Copyright: (C) 2016 Linaro Limited
6# Created by: Nicolas Pitre, January 2016 7# Created by: Nicolas Pitre, January 2016
7# 8#
8# This program is free software; you can redistribute it and/or modify
9# it under the terms of the GNU General Public License version 2 as
10# published by the Free Software Foundation.
11 9
12# Create/update the include/generated/autoksyms.h file from the list 10# Create/update the include/generated/autoksyms.h file from the list
13# of all module's needed symbols as recorded on the third line of 11# of all module's needed symbols as recorded on the third line of
diff --git a/scripts/asn1_compiler.c b/scripts/asn1_compiler.c
index 1b28787028d3..adabd4145264 100644
--- a/scripts/asn1_compiler.c
+++ b/scripts/asn1_compiler.c
@@ -1,12 +1,8 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* Simplified ASN.1 notation parser 2/* Simplified ASN.1 notation parser
2 * 3 *
3 * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved. 4 * Copyright (C) 2012 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com) 5 * Written by David Howells (dhowells@redhat.com)
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public Licence
8 * as published by the Free Software Foundation; either version
9 * 2 of the Licence, or (at your option) any later version.
10 */ 6 */
11 7
12#include <stdarg.h> 8#include <stdarg.h>
diff --git a/scripts/atomic/check-atomics.sh b/scripts/atomic/check-atomics.sh
index cfa0c2f71c84..8378c63a1e09 100755
--- a/scripts/atomic/check-atomics.sh
+++ b/scripts/atomic/check-atomics.sh
@@ -22,7 +22,7 @@ while read header; do
22 OLDSUM="$(tail -n 1 ${LINUXDIR}/include/${header})" 22 OLDSUM="$(tail -n 1 ${LINUXDIR}/include/${header})"
23 OLDSUM="${OLDSUM#// }" 23 OLDSUM="${OLDSUM#// }"
24 24
25 NEWSUM="$(head -n -1 ${LINUXDIR}/include/${header} | sha1sum)" 25 NEWSUM="$(sed '$d' ${LINUXDIR}/include/${header} | sha1sum)"
26 NEWSUM="${NEWSUM%% *}" 26 NEWSUM="${NEWSUM%% *}"
27 27
28 if [ "${OLDSUM}" != "${NEWSUM}" ]; then 28 if [ "${OLDSUM}" != "${NEWSUM}" ]; then
diff --git a/scripts/basic/Makefile b/scripts/basic/Makefile
index af49b446f17d..548aeb592806 100644
--- a/scripts/basic/Makefile
+++ b/scripts/basic/Makefile
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0-only
1### 2###
2# This Makefile lists the most basic programs used during the build process. 3# This Makefile lists the most basic programs used during the build process.
3# The programs listed herein are what are needed to do the basic stuff, 4# The programs listed herein are what are needed to do the basic stuff,
diff --git a/scripts/basic/fixdep.c b/scripts/basic/fixdep.c
index facbd603adf6..9ba47b0a47b9 100644
--- a/scripts/basic/fixdep.c
+++ b/scripts/basic/fixdep.c
@@ -99,6 +99,7 @@
99#include <unistd.h> 99#include <unistd.h>
100#include <fcntl.h> 100#include <fcntl.h>
101#include <string.h> 101#include <string.h>
102#include <stdarg.h>
102#include <stdlib.h> 103#include <stdlib.h>
103#include <stdio.h> 104#include <stdio.h>
104#include <ctype.h> 105#include <ctype.h>
@@ -110,13 +111,43 @@ static void usage(void)
110} 111}
111 112
112/* 113/*
114 * In the intended usage of this program, the stdout is redirected to .*.cmd
115 * files. The return value of printf() and putchar() must be checked to catch
116 * any error, e.g. "No space left on device".
117 */
118static void xprintf(const char *format, ...)
119{
120 va_list ap;
121 int ret;
122
123 va_start(ap, format);
124 ret = vprintf(format, ap);
125 if (ret < 0) {
126 perror("fixdep");
127 exit(1);
128 }
129 va_end(ap);
130}
131
132static void xputchar(int c)
133{
134 int ret;
135
136 ret = putchar(c);
137 if (ret == EOF) {
138 perror("fixdep");
139 exit(1);
140 }
141}
142
143/*
113 * Print out a dependency path from a symbol name 144 * Print out a dependency path from a symbol name
114 */ 145 */
115static void print_dep(const char *m, int slen, const char *dir) 146static void print_dep(const char *m, int slen, const char *dir)
116{ 147{
117 int c, prev_c = '/', i; 148 int c, prev_c = '/', i;
118 149
119 printf(" $(wildcard %s/", dir); 150 xprintf(" $(wildcard %s/", dir);
120 for (i = 0; i < slen; i++) { 151 for (i = 0; i < slen; i++) {
121 c = m[i]; 152 c = m[i];
122 if (c == '_') 153 if (c == '_')
@@ -124,10 +155,10 @@ static void print_dep(const char *m, int slen, const char *dir)
124 else 155 else
125 c = tolower(c); 156 c = tolower(c);
126 if (c != '/' || prev_c != '/') 157 if (c != '/' || prev_c != '/')
127 putchar(c); 158 xputchar(c);
128 prev_c = c; 159 prev_c = c;
129 } 160 }
130 printf(".h) \\\n"); 161 xprintf(".h) \\\n");
131} 162}
132 163
133struct item { 164struct item {
@@ -324,13 +355,13 @@ static void parse_dep_file(char *m, const char *target)
324 */ 355 */
325 if (!saw_any_target) { 356 if (!saw_any_target) {
326 saw_any_target = 1; 357 saw_any_target = 1;
327 printf("source_%s := %s\n\n", 358 xprintf("source_%s := %s\n\n",
328 target, m); 359 target, m);
329 printf("deps_%s := \\\n", target); 360 xprintf("deps_%s := \\\n", target);
330 } 361 }
331 is_first_dep = 0; 362 is_first_dep = 0;
332 } else { 363 } else {
333 printf(" %s \\\n", m); 364 xprintf(" %s \\\n", m);
334 } 365 }
335 366
336 buf = read_file(m); 367 buf = read_file(m);
@@ -353,8 +384,8 @@ static void parse_dep_file(char *m, const char *target)
353 exit(1); 384 exit(1);
354 } 385 }
355 386
356 printf("\n%s: $(deps_%s)\n\n", target, target); 387 xprintf("\n%s: $(deps_%s)\n\n", target, target);
357 printf("$(deps_%s):\n", target); 388 xprintf("$(deps_%s):\n", target);
358} 389}
359 390
360int main(int argc, char *argv[]) 391int main(int argc, char *argv[])
@@ -369,7 +400,7 @@ int main(int argc, char *argv[])
369 target = argv[2]; 400 target = argv[2];
370 cmdline = argv[3]; 401 cmdline = argv[3];
371 402
372 printf("cmd_%s := %s\n\n", target, cmdline); 403 xprintf("cmd_%s := %s\n\n", target, cmdline);
373 404
374 buf = read_file(depfile); 405 buf = read_file(depfile);
375 parse_dep_file(buf, target); 406 parse_dep_file(buf, target);
diff --git a/scripts/bootgraph.pl b/scripts/bootgraph.pl
index 594c55541b16..79c903292ae8 100755
--- a/scripts/bootgraph.pl
+++ b/scripts/bootgraph.pl
@@ -1,24 +1,10 @@
1#!/usr/bin/env perl 1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3# Copyright 2008, Intel Corporation 4# Copyright 2008, Intel Corporation
4# 5#
5# This file is part of the Linux kernel 6# This file is part of the Linux kernel
6# 7#
7# This program file is free software; you can redistribute it and/or modify it
8# under the terms of the GNU General Public License as published by the
9# Free Software Foundation; version 2 of the License.
10#
11# This program is distributed in the hope that it will be useful, but WITHOUT
12# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14# for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program in a file named COPYING; if not, write to the
18# Free Software Foundation, Inc.,
19# 51 Franklin Street, Fifth Floor,
20# Boston, MA 02110-1301 USA
21#
22# Authors: 8# Authors:
23# Arjan van de Ven <arjan@linux.intel.com> 9# Arjan van de Ven <arjan@linux.intel.com>
24 10
diff --git a/scripts/checkkconfigsymbols.py b/scripts/checkkconfigsymbols.py
index 8cd16c65d3c5..00a10a293f4f 100755
--- a/scripts/checkkconfigsymbols.py
+++ b/scripts/checkkconfigsymbols.py
@@ -1,11 +1,11 @@
1#!/usr/bin/env python3 1#!/usr/bin/env python3
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3"""Find Kconfig symbols that are referenced but not defined.""" 4"""Find Kconfig symbols that are referenced but not defined."""
4 5
5# (c) 2014-2017 Valentin Rothberg <valentinrothberg@gmail.com> 6# (c) 2014-2017 Valentin Rothberg <valentinrothberg@gmail.com>
6# (c) 2014 Stefan Hengelein <stefan.hengelein@fau.de> 7# (c) 2014 Stefan Hengelein <stefan.hengelein@fau.de>
7# 8#
8# Licensed under the terms of the GNU GPL License version 2
9 9
10 10
11import argparse 11import argparse
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index bb28b178d929..a6d436809bf5 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -3027,7 +3027,7 @@ sub process {
3027 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g; 3027 my @compats = $rawline =~ /\"([a-zA-Z0-9\-\,\.\+_]+)\"/g;
3028 3028
3029 my $dt_path = $root . "/Documentation/devicetree/bindings/"; 3029 my $dt_path = $root . "/Documentation/devicetree/bindings/";
3030 my $vp_file = $dt_path . "vendor-prefixes.txt"; 3030 my $vp_file = $dt_path . "vendor-prefixes.yaml";
3031 3031
3032 foreach my $compat (@compats) { 3032 foreach my $compat (@compats) {
3033 my $compat2 = $compat; 3033 my $compat2 = $compat;
@@ -3042,7 +3042,7 @@ sub process {
3042 3042
3043 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/; 3043 next if $compat !~ /^([a-zA-Z0-9\-]+)\,/;
3044 my $vendor = $1; 3044 my $vendor = $1;
3045 `grep -Eq "^$vendor\\b" $vp_file`; 3045 `grep -Eq "\\"\\^\Q$vendor\E,\\.\\*\\":" $vp_file`;
3046 if ( $? >> 8 ) { 3046 if ( $? >> 8 ) {
3047 WARN("UNDOCUMENTED_DT_STRING", 3047 WARN("UNDOCUMENTED_DT_STRING",
3048 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr); 3048 "DT compatible string vendor \"$vendor\" appears un-documented -- check $vp_file\n" . $herecurr);
@@ -5712,7 +5712,7 @@ sub process {
5712 # ignore udelay's < 10, however 5712 # ignore udelay's < 10, however
5713 if (! ($delay < 10) ) { 5713 if (! ($delay < 10) ) {
5714 CHK("USLEEP_RANGE", 5714 CHK("USLEEP_RANGE",
5715 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.txt\n" . $herecurr); 5715 "usleep_range is preferred over udelay; see Documentation/timers/timers-howto.rst\n" . $herecurr);
5716 } 5716 }
5717 if ($delay > 2000) { 5717 if ($delay > 2000) {
5718 WARN("LONG_UDELAY", 5718 WARN("LONG_UDELAY",
@@ -5724,7 +5724,7 @@ sub process {
5724 if ($line =~ /\bmsleep\s*\((\d+)\);/) { 5724 if ($line =~ /\bmsleep\s*\((\d+)\);/) {
5725 if ($1 < 20) { 5725 if ($1 < 20) {
5726 WARN("MSLEEP", 5726 WARN("MSLEEP",
5727 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.txt\n" . $herecurr); 5727 "msleep < 20ms can sleep for up to 20ms; see Documentation/timers/timers-howto.rst\n" . $herecurr);
5728 } 5728 }
5729 } 5729 }
5730 5730
@@ -6115,11 +6115,11 @@ sub process {
6115 my $max = $7; 6115 my $max = $7;
6116 if ($min eq $max) { 6116 if ($min eq $max) {
6117 WARN("USLEEP_RANGE", 6117 WARN("USLEEP_RANGE",
6118 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 6118 "usleep_range should not use min == max args; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
6119 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ && 6119 } elsif ($min =~ /^\d+$/ && $max =~ /^\d+$/ &&
6120 $min > $max) { 6120 $min > $max) {
6121 WARN("USLEEP_RANGE", 6121 WARN("USLEEP_RANGE",
6122 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.txt\n" . "$here\n$stat\n"); 6122 "usleep_range args reversed, use min then max; see Documentation/timers/timers-howto.rst\n" . "$here\n$stat\n");
6123 } 6123 }
6124 } 6124 }
6125 6125
diff --git a/scripts/checkstack.pl b/scripts/checkstack.pl
index 122aef5e4e14..371bd17a4983 100755
--- a/scripts/checkstack.pl
+++ b/scripts/checkstack.pl
@@ -46,7 +46,7 @@ my (@stack, $re, $dre, $x, $xs, $funcre);
46 $x = "[0-9a-f]"; # hex character 46 $x = "[0-9a-f]"; # hex character
47 $xs = "[0-9a-f ]"; # hex character or space 47 $xs = "[0-9a-f ]"; # hex character or space
48 $funcre = qr/^$x* <(.*)>:$/; 48 $funcre = qr/^$x* <(.*)>:$/;
49 if ($arch eq 'aarch64') { 49 if ($arch =~ '^(aarch|arm)64$') {
50 #ffffffc0006325cc: a9bb7bfd stp x29, x30, [sp, #-80]! 50 #ffffffc0006325cc: a9bb7bfd stp x29, x30, [sp, #-80]!
51 #a110: d11643ff sub sp, sp, #0x590 51 #a110: d11643ff sub sp, sp, #0x590
52 $re = qr/^.*stp.*sp, \#-([0-9]{1,8})\]\!/o; 52 $re = qr/^.*stp.*sp, \#-([0-9]{1,8})\]\!/o;
diff --git a/scripts/coccinelle/api/alloc/alloc_cast.cocci b/scripts/coccinelle/api/alloc/alloc_cast.cocci
index 18fedf7c60ed..f6f0ccdb6409 100644
--- a/scripts/coccinelle/api/alloc/alloc_cast.cocci
+++ b/scripts/coccinelle/api/alloc/alloc_cast.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Remove casting the values returned by memory allocation functions 2/// Remove casting the values returned by memory allocation functions
2/// like kmalloc, kzalloc, kmem_cache_alloc, kmem_cache_zalloc etc. 3/// like kmalloc, kzalloc, kmem_cache_alloc, kmem_cache_zalloc etc.
3/// 4///
@@ -8,8 +9,8 @@
8//# need some reformatting. 9//# need some reformatting.
9// 10//
10// Confidence: High 11// Confidence: High
11// Copyright: (C) 2014 Himangi Saraogi GPLv2. 12// Copyright: (C) 2014 Himangi Saraogi
12// Copyright: (C) 2017 Himanshu Jha GPLv2. 13// Copyright: (C) 2017 Himanshu Jha
13// Comments: 14// Comments:
14// Options: --no-includes --include-headers 15// Options: --no-includes --include-headers
15// 16//
diff --git a/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci b/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci
index 9b7eb321a025..9c61a23b34db 100644
--- a/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci
+++ b/scripts/coccinelle/api/alloc/pool_zalloc-simple.cocci
@@ -1,7 +1,8 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// 2///
2/// Use *_pool_zalloc rather than *_pool_alloc followed by memset with 0 3/// Use *_pool_zalloc rather than *_pool_alloc followed by memset with 0
3/// 4///
4// Copyright: (C) 2015 Intel Corp. GPLv2. 5// Copyright: (C) 2015 Intel Corp.
5// Options: --no-includes --include-headers 6// Options: --no-includes --include-headers
6// 7//
7// Keywords: dma_pool_zalloc, pci_pool_zalloc 8// Keywords: dma_pool_zalloc, pci_pool_zalloc
diff --git a/scripts/coccinelle/api/alloc/zalloc-simple.cocci b/scripts/coccinelle/api/alloc/zalloc-simple.cocci
index 5cd1991c582e..26cda3f48f01 100644
--- a/scripts/coccinelle/api/alloc/zalloc-simple.cocci
+++ b/scripts/coccinelle/api/alloc/zalloc-simple.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// 2///
2/// Use zeroing allocator rather than allocator followed by memset with 0 3/// Use zeroing allocator rather than allocator followed by memset with 0
3/// 4///
@@ -6,9 +7,9 @@
6/// matched code has to be contiguous 7/// matched code has to be contiguous
7/// 8///
8// Confidence: High 9// Confidence: High
9// Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU. GPLv2. 10// Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU.
10// Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6. GPLv2. 11// Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6.
11// Copyright: (C) 2017 Himanshu Jha GPLv2. 12// Copyright: (C) 2017 Himanshu Jha
12// URL: http://coccinelle.lip6.fr/rules/kzalloc.html 13// URL: http://coccinelle.lip6.fr/rules/kzalloc.html
13// Options: --no-includes --include-headers 14// Options: --no-includes --include-headers
14// 15//
diff --git a/scripts/coccinelle/api/check_bq27xxx_data.cocci b/scripts/coccinelle/api/check_bq27xxx_data.cocci
index 9212b85169d2..fae539ef0ce5 100644
--- a/scripts/coccinelle/api/check_bq27xxx_data.cocci
+++ b/scripts/coccinelle/api/check_bq27xxx_data.cocci
@@ -1,10 +1,11 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Detect BQ27XXX_DATA structures with identical registers, dm registers or 2/// Detect BQ27XXX_DATA structures with identical registers, dm registers or
2/// properties. 3/// properties.
3//# Doesn't unfold macros used in register or property fields. 4//# Doesn't unfold macros used in register or property fields.
4//# Requires OCaml scripting 5//# Requires OCaml scripting
5/// 6///
6// Confidence: High 7// Confidence: High
7// Copyright: (C) 2017 Julia Lawall, Inria/LIP6, GPLv2. 8// Copyright: (C) 2017 Julia Lawall, Inria/LIP6,
8// URL: http://coccinelle.lip6.fr/ 9// URL: http://coccinelle.lip6.fr/
9// Requires: 1.0.7 10// Requires: 1.0.7
10// Keywords: BQ27XXX_DATA 11// Keywords: BQ27XXX_DATA
diff --git a/scripts/coccinelle/api/err_cast.cocci b/scripts/coccinelle/api/err_cast.cocci
index 2ce115000af6..0e661c8d8d6f 100644
--- a/scripts/coccinelle/api/err_cast.cocci
+++ b/scripts/coccinelle/api/err_cast.cocci
@@ -1,10 +1,11 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// 2///
2/// Use ERR_CAST inlined function instead of ERR_PTR(PTR_ERR(...)) 3/// Use ERR_CAST inlined function instead of ERR_PTR(PTR_ERR(...))
3/// 4///
4// Confidence: High 5// Confidence: High
5// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU. GPLv2. 6// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU.
6// Copyright: (C) 2009, 2010 Julia Lawall, DIKU. GPLv2. 7// Copyright: (C) 2009, 2010 Julia Lawall, DIKU.
7// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6. GPLv2. 8// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6.
8// URL: http://coccinelle.lip6.fr/ 9// URL: http://coccinelle.lip6.fr/
9// Options: 10// Options:
10// 11//
diff --git a/scripts/coccinelle/api/kstrdup.cocci b/scripts/coccinelle/api/kstrdup.cocci
index 09cba54ed0cf..19f2645e6076 100644
--- a/scripts/coccinelle/api/kstrdup.cocci
+++ b/scripts/coccinelle/api/kstrdup.cocci
@@ -1,9 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Use kstrdup rather than duplicating its implementation 2/// Use kstrdup rather than duplicating its implementation
2/// 3///
3// Confidence: High 4// Confidence: High
4// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 5// Copyright: (C) 2010-2012 Nicolas Palix.
5// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
6// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 7// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
7// URL: http://coccinelle.lip6.fr/ 8// URL: http://coccinelle.lip6.fr/
8// Comments: 9// Comments:
9// Options: --no-includes --include-headers 10// Options: --no-includes --include-headers
@@ -76,7 +77,7 @@ p1 << r1.p1;
76p2 << r1.p2; 77p2 << r1.p2;
77@@ 78@@
78 79
79cocci.print_main("WARNING opportunity for kstrdep",p1) 80cocci.print_main("WARNING opportunity for kstrdup",p1)
80cocci.print_secs("strcpy",p2) 81cocci.print_secs("strcpy",p2)
81 82
82@script:python depends on org@ 83@script:python depends on org@
@@ -84,7 +85,7 @@ p1 << r2.p1;
84p2 << r2.p2; 85p2 << r2.p2;
85@@ 86@@
86 87
87cocci.print_main("WARNING opportunity for kstrdep",p1) 88cocci.print_main("WARNING opportunity for kstrdup",p1)
88cocci.print_secs("memcpy",p2) 89cocci.print_secs("memcpy",p2)
89 90
90@script:python depends on report@ 91@script:python depends on report@
@@ -92,7 +93,7 @@ p1 << r1.p1;
92p2 << r1.p2; 93p2 << r1.p2;
93@@ 94@@
94 95
95msg = "WARNING opportunity for kstrdep (strcpy on line %s)" % (p2[0].line) 96msg = "WARNING opportunity for kstrdup (strcpy on line %s)" % (p2[0].line)
96coccilib.report.print_report(p1[0], msg) 97coccilib.report.print_report(p1[0], msg)
97 98
98@script:python depends on report@ 99@script:python depends on report@
@@ -100,5 +101,5 @@ p1 << r2.p1;
100p2 << r2.p2; 101p2 << r2.p2;
101@@ 102@@
102 103
103msg = "WARNING opportunity for kstrdep (memcpy on line %s)" % (p2[0].line) 104msg = "WARNING opportunity for kstrdup (memcpy on line %s)" % (p2[0].line)
104coccilib.report.print_report(p1[0], msg) 105coccilib.report.print_report(p1[0], msg)
diff --git a/scripts/coccinelle/api/memdup.cocci b/scripts/coccinelle/api/memdup.cocci
index 8fd6437beda8..30b15df734e5 100644
--- a/scripts/coccinelle/api/memdup.cocci
+++ b/scripts/coccinelle/api/memdup.cocci
@@ -1,9 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Use kmemdup rather than duplicating its implementation 2/// Use kmemdup rather than duplicating its implementation
2/// 3///
3// Confidence: High 4// Confidence: High
4// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 5// Copyright: (C) 2010-2012 Nicolas Palix.
5// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
6// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 7// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
7// URL: http://coccinelle.lip6.fr/ 8// URL: http://coccinelle.lip6.fr/
8// Comments: 9// Comments:
9// Options: --no-includes --include-headers 10// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/api/memdup_user.cocci b/scripts/coccinelle/api/memdup_user.cocci
index 2a5aea8e8487..c809ab10bbce 100644
--- a/scripts/coccinelle/api/memdup_user.cocci
+++ b/scripts/coccinelle/api/memdup_user.cocci
@@ -1,10 +1,11 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Use memdup_user rather than duplicating its implementation 2/// Use memdup_user rather than duplicating its implementation
2/// This is a little bit restricted to reduce false positives 3/// This is a little bit restricted to reduce false positives
3/// 4///
4// Confidence: High 5// Confidence: High
5// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 6// Copyright: (C) 2010-2012 Nicolas Palix.
6// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 7// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
7// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 8// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
8// URL: http://coccinelle.lip6.fr/ 9// URL: http://coccinelle.lip6.fr/
9// Comments: 10// Comments:
10// Options: --no-includes --include-headers 11// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/api/platform_no_drv_owner.cocci b/scripts/coccinelle/api/platform_no_drv_owner.cocci
index c5e3f73f2054..8fa050eeb7e5 100644
--- a/scripts/coccinelle/api/platform_no_drv_owner.cocci
+++ b/scripts/coccinelle/api/platform_no_drv_owner.cocci
@@ -1,7 +1,8 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Remove .owner field if calls are used which set it automatically 2/// Remove .owner field if calls are used which set it automatically
2/// 3///
3// Confidence: High 4// Confidence: High
4// Copyright: (C) 2014 Wolfram Sang. GPL v2. 5// Copyright: (C) 2014 Wolfram Sang.
5 6
6virtual patch 7virtual patch
7virtual context 8virtual context
diff --git a/scripts/coccinelle/api/pm_runtime.cocci b/scripts/coccinelle/api/pm_runtime.cocci
index d67ccf5f8227..1ccce3fd00b8 100644
--- a/scripts/coccinelle/api/pm_runtime.cocci
+++ b/scripts/coccinelle/api/pm_runtime.cocci
@@ -1,8 +1,9 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE 2/// Make sure pm_runtime_* calls does not use unnecessary IS_ERR_VALUE
2/// 3///
3// Keywords: pm_runtime 4// Keywords: pm_runtime
4// Confidence: Medium 5// Confidence: Medium
5// Copyright (C) 2013 Texas Instruments Incorporated - GPLv2. 6// Copyright (C) 2013 Texas Instruments Incorporated -
6// URL: http://coccinelle.lip6.fr/ 7// URL: http://coccinelle.lip6.fr/
7// Options: --include-headers 8// Options: --include-headers
8 9
diff --git a/scripts/coccinelle/api/ptr_ret.cocci b/scripts/coccinelle/api/ptr_ret.cocci
index dd58dab5d411..e76cd5d90a8a 100644
--- a/scripts/coccinelle/api/ptr_ret.cocci
+++ b/scripts/coccinelle/api/ptr_ret.cocci
@@ -1,9 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// 2///
2/// Use PTR_ERR_OR_ZERO rather than if(IS_ERR(...)) + PTR_ERR 3/// Use PTR_ERR_OR_ZERO rather than if(IS_ERR(...)) + PTR_ERR
3/// 4///
4// Confidence: High 5// Confidence: High
5// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
6// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 7// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
7// URL: http://coccinelle.lip6.fr/ 8// URL: http://coccinelle.lip6.fr/
8// Options: --no-includes --include-headers 9// Options: --no-includes --include-headers
9// 10//
diff --git a/scripts/coccinelle/api/resource_size.cocci b/scripts/coccinelle/api/resource_size.cocci
index 1935a58b39d9..a9a571ac04ce 100644
--- a/scripts/coccinelle/api/resource_size.cocci
+++ b/scripts/coccinelle/api/resource_size.cocci
@@ -1,11 +1,12 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// 2///
2/// Use resource_size function on resource object 3/// Use resource_size function on resource object
3/// instead of explicit computation. 4/// instead of explicit computation.
4/// 5///
5// Confidence: High 6// Confidence: High
6// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU. GPLv2. 7// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU.
7// Copyright: (C) 2009, 2010 Julia Lawall, DIKU. GPLv2. 8// Copyright: (C) 2009, 2010 Julia Lawall, DIKU.
8// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6. GPLv2. 9// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6.
9// URL: http://coccinelle.lip6.fr/ 10// URL: http://coccinelle.lip6.fr/
10// Options: 11// Options:
11// 12//
diff --git a/scripts/coccinelle/api/stream_open.cocci b/scripts/coccinelle/api/stream_open.cocci
index 350145da7669..12ce18fa6b74 100644
--- a/scripts/coccinelle/api/stream_open.cocci
+++ b/scripts/coccinelle/api/stream_open.cocci
@@ -35,11 +35,11 @@ type loff_t;
35// a function that blocks 35// a function that blocks
36@ blocks @ 36@ blocks @
37identifier block_f; 37identifier block_f;
38identifier wait_event =~ "^wait_event_.*"; 38identifier wait =~ "^wait_.*";
39@@ 39@@
40 block_f(...) { 40 block_f(...) {
41 ... when exists 41 ... when exists
42 wait_event(...) 42 wait(...)
43 ... when exists 43 ... when exists
44 } 44 }
45 45
@@ -49,12 +49,12 @@ identifier wait_event =~ "^wait_event_.*";
49// XXX currently reader_blocks supports only direct and 1-level indirect cases. 49// XXX currently reader_blocks supports only direct and 1-level indirect cases.
50@ reader_blocks_direct @ 50@ reader_blocks_direct @
51identifier stream_reader.readstream; 51identifier stream_reader.readstream;
52identifier wait_event =~ "^wait_event_.*"; 52identifier wait =~ "^wait_.*";
53@@ 53@@
54 readstream(...) 54 readstream(...)
55 { 55 {
56 ... when exists 56 ... when exists
57 wait_event(...) 57 wait(...)
58 ... when exists 58 ... when exists
59 } 59 }
60 60
diff --git a/scripts/coccinelle/free/clk_put.cocci b/scripts/coccinelle/free/clk_put.cocci
index 46747adfd20a..7237b49496f6 100644
--- a/scripts/coccinelle/free/clk_put.cocci
+++ b/scripts/coccinelle/free/clk_put.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find missing clk_puts. 2/// Find missing clk_puts.
2/// 3///
3//# This only signals a missing clk_put when there is a clk_put later 4//# This only signals a missing clk_put when there is a clk_put later
@@ -5,8 +6,8 @@
5//# False positives can be due to loops. 6//# False positives can be due to loops.
6// 7//
7// Confidence: Moderate 8// Confidence: Moderate
8// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 9// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
9// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 10// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
10// URL: http://coccinelle.lip6.fr/ 11// URL: http://coccinelle.lip6.fr/
11// Comments: 12// Comments:
12// Options: 13// Options:
diff --git a/scripts/coccinelle/free/devm_free.cocci b/scripts/coccinelle/free/devm_free.cocci
index b2a2cf8bf81f..fefd0331a2de 100644
--- a/scripts/coccinelle/free/devm_free.cocci
+++ b/scripts/coccinelle/free/devm_free.cocci
@@ -1,8 +1,9 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find uses of standard freeing functons on values allocated using devm_ 2/// Find uses of standard freeing functons on values allocated using devm_
2/// functions. Values allocated using the devm_functions are freed when 3/// functions. Values allocated using the devm_functions are freed when
3/// the device is detached, and thus the use of the standard freeing 4/// the device is detached, and thus the use of the standard freeing
4/// function would cause a double free. 5/// function would cause a double free.
5/// See Documentation/driver-model/devres.txt for more information. 6/// See Documentation/driver-model/devres.rst for more information.
6/// 7///
7/// A difficulty of detecting this problem is that the standard freeing 8/// A difficulty of detecting this problem is that the standard freeing
8/// function might be called from a different function than the one 9/// function might be called from a different function than the one
@@ -14,8 +15,8 @@
14/// less reliable in these cases. 15/// less reliable in these cases.
15/// 16///
16// Confidence: Moderate 17// Confidence: Moderate
17// Copyright: (C) 2011 Julia Lawall, INRIA/LIP6. GPLv2. 18// Copyright: (C) 2011 Julia Lawall, INRIA/LIP6.
18// Copyright: (C) 2011 Gilles Muller, INRIA/LiP6. GPLv2. 19// Copyright: (C) 2011 Gilles Muller, INRIA/LiP6.
19// URL: http://coccinelle.lip6.fr/ 20// URL: http://coccinelle.lip6.fr/
20// Comments: 21// Comments:
21// Options: --no-includes --include-headers 22// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/free/ifnullfree.cocci b/scripts/coccinelle/free/ifnullfree.cocci
index a70e123cb12b..b3290c4ee239 100644
--- a/scripts/coccinelle/free/ifnullfree.cocci
+++ b/scripts/coccinelle/free/ifnullfree.cocci
@@ -1,10 +1,11 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// NULL check before some freeing functions is not needed. 2/// NULL check before some freeing functions is not needed.
2/// 3///
3/// Based on checkpatch warning 4/// Based on checkpatch warning
4/// "kfree(NULL) is safe this check is probably not required" 5/// "kfree(NULL) is safe this check is probably not required"
5/// and kfreeaddr.cocci by Julia Lawall. 6/// and kfreeaddr.cocci by Julia Lawall.
6/// 7///
7// Copyright: (C) 2014 Fabian Frederick. GPLv2. 8// Copyright: (C) 2014 Fabian Frederick.
8// Comments: - 9// Comments: -
9// Options: --no-includes --include-headers 10// Options: --no-includes --include-headers
10 11
diff --git a/scripts/coccinelle/free/iounmap.cocci b/scripts/coccinelle/free/iounmap.cocci
index 5384f4ba1192..0e60e1113a1d 100644
--- a/scripts/coccinelle/free/iounmap.cocci
+++ b/scripts/coccinelle/free/iounmap.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find missing iounmaps. 2/// Find missing iounmaps.
2/// 3///
3//# This only signals a missing iounmap when there is an iounmap later 4//# This only signals a missing iounmap when there is an iounmap later
@@ -5,8 +6,8 @@
5//# False positives can be due to loops. 6//# False positives can be due to loops.
6// 7//
7// Confidence: Moderate 8// Confidence: Moderate
8// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 9// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
9// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 10// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
10// URL: http://coccinelle.lip6.fr/ 11// URL: http://coccinelle.lip6.fr/
11// Comments: 12// Comments:
12// Options: 13// Options:
diff --git a/scripts/coccinelle/free/kfree.cocci b/scripts/coccinelle/free/kfree.cocci
index ac438da4fd7b..e9d50e718e46 100644
--- a/scripts/coccinelle/free/kfree.cocci
+++ b/scripts/coccinelle/free/kfree.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find a use after free. 2/// Find a use after free.
2//# Values of variables may imply that some 3//# Values of variables may imply that some
3//# execution paths are not possible, resulting in false positives. 4//# execution paths are not possible, resulting in false positives.
@@ -5,9 +6,9 @@
5//# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument 6//# SCTP_DBG_OBJCNT_DEC that do not actually evaluate their argument
6/// 7///
7// Confidence: Moderate 8// Confidence: Moderate
8// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 9// Copyright: (C) 2010-2012 Nicolas Palix.
9// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 10// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
10// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 11// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
11// URL: http://coccinelle.lip6.fr/ 12// URL: http://coccinelle.lip6.fr/
12// Comments: 13// Comments:
13// Options: --no-includes --include-headers 14// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/free/kfreeaddr.cocci b/scripts/coccinelle/free/kfreeaddr.cocci
index d46063b1db8b..cfaf308328d8 100644
--- a/scripts/coccinelle/free/kfreeaddr.cocci
+++ b/scripts/coccinelle/free/kfreeaddr.cocci
@@ -1,7 +1,8 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Free of a structure field 2/// Free of a structure field
2/// 3///
3// Confidence: High 4// Confidence: High
4// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6. GPLv2. 5// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6.
5// URL: http://coccinelle.lip6.fr/ 6// URL: http://coccinelle.lip6.fr/
6// Comments: 7// Comments:
7// Options: --no-includes --include-headers 8// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/free/pci_free_consistent.cocci b/scripts/coccinelle/free/pci_free_consistent.cocci
index 43600ccb62a8..d51e92556b42 100644
--- a/scripts/coccinelle/free/pci_free_consistent.cocci
+++ b/scripts/coccinelle/free/pci_free_consistent.cocci
@@ -1,7 +1,8 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find missing pci_free_consistent for every pci_alloc_consistent. 2/// Find missing pci_free_consistent for every pci_alloc_consistent.
2/// 3///
3// Confidence: Moderate 4// Confidence: Moderate
4// Copyright: (C) 2013 Petr Strnad. GPLv2. 5// Copyright: (C) 2013 Petr Strnad.
5// URL: http://coccinelle.lip6.fr/ 6// URL: http://coccinelle.lip6.fr/
6// Keywords: pci_free_consistent, pci_alloc_consistent 7// Keywords: pci_free_consistent, pci_alloc_consistent
7// Options: --no-includes --include-headers 8// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/free/put_device.cocci b/scripts/coccinelle/free/put_device.cocci
index c9f071b0a0ab..120921366e84 100644
--- a/scripts/coccinelle/free/put_device.cocci
+++ b/scripts/coccinelle/free/put_device.cocci
@@ -24,7 +24,7 @@ if (id == NULL || ...) { ... return ...; }
24 when != of_dev_put(id) 24 when != of_dev_put(id)
25 when != if (id) { ... put_device(&id->dev) ... } 25 when != if (id) { ... put_device(&id->dev) ... }
26 when != e1 = (T)id 26 when != e1 = (T)id
27 when != e1 = &id->dev 27 when != e1 = (T)(&id->dev)
28 when != e1 = get_device(&id->dev) 28 when != e1 = get_device(&id->dev)
29 when != e1 = (T1)platform_get_drvdata(id) 29 when != e1 = (T1)platform_get_drvdata(id)
30( 30(
@@ -42,11 +42,10 @@ p1 << search.p1;
42p2 << search.p2; 42p2 << search.p2;
43@@ 43@@
44 44
45coccilib.report.print_report(p2[0], "ERROR: missing put_device; " 45coccilib.report.print_report(p2[0],
46 + "call of_find_device_by_node on line " 46 "ERROR: missing put_device; call of_find_device_by_node on line "
47 + p1[0].line 47 + p1[0].line
48 + ", but without a corresponding object release " 48 + ", but without a corresponding object release within this function.")
49 + "within this function.")
50 49
51@script:python depends on org@ 50@script:python depends on org@
52p1 << search.p1; 51p1 << search.p1;
diff --git a/scripts/coccinelle/iterators/device_node_continue.cocci b/scripts/coccinelle/iterators/device_node_continue.cocci
index a36c16db171b..f8cd14dfa604 100644
--- a/scripts/coccinelle/iterators/device_node_continue.cocci
+++ b/scripts/coccinelle/iterators/device_node_continue.cocci
@@ -1,8 +1,9 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Device node iterators put the previous value of the index variable, so an 2/// Device node iterators put the previous value of the index variable, so an
2/// explicit put causes a double put. 3/// explicit put causes a double put.
3/// 4///
4// Confidence: High 5// Confidence: High
5// Copyright: (C) 2015 Julia Lawall, Inria. GPLv2. 6// Copyright: (C) 2015 Julia Lawall, Inria.
6// URL: http://coccinelle.lip6.fr/ 7// URL: http://coccinelle.lip6.fr/
7// Options: --no-includes --include-headers 8// Options: --no-includes --include-headers
8// Requires: 1.0.4 9// Requires: 1.0.4
diff --git a/scripts/coccinelle/iterators/fen.cocci b/scripts/coccinelle/iterators/fen.cocci
index 48c152f224e1..b69f9665f4fb 100644
--- a/scripts/coccinelle/iterators/fen.cocci
+++ b/scripts/coccinelle/iterators/fen.cocci
@@ -1,10 +1,11 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// These iterators only exit normally when the loop cursor is NULL, so there 2/// These iterators only exit normally when the loop cursor is NULL, so there
2/// is no point to call of_node_put on the final value. 3/// is no point to call of_node_put on the final value.
3/// 4///
4// Confidence: High 5// Confidence: High
5// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 6// Copyright: (C) 2010-2012 Nicolas Palix.
6// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 7// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
7// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 8// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
8// URL: http://coccinelle.lip6.fr/ 9// URL: http://coccinelle.lip6.fr/
9// Comments: 10// Comments:
10// Options: --no-includes --include-headers 11// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/iterators/itnull.cocci b/scripts/coccinelle/iterators/itnull.cocci
index f58732b56a40..9b362b98d7a1 100644
--- a/scripts/coccinelle/iterators/itnull.cocci
+++ b/scripts/coccinelle/iterators/itnull.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Many iterators have the property that the first argument is always bound 2/// Many iterators have the property that the first argument is always bound
2/// to a real list element, never NULL. 3/// to a real list element, never NULL.
3//# False positives arise for some iterators that do not have this property, 4//# False positives arise for some iterators that do not have this property,
@@ -6,9 +7,9 @@
6//# or return). 7//# or return).
7/// 8///
8// Confidence: Moderate 9// Confidence: Moderate
9// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 10// Copyright: (C) 2010-2012 Nicolas Palix.
10// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 11// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
11// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 12// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
12// URL: http://coccinelle.lip6.fr/ 13// URL: http://coccinelle.lip6.fr/
13// Comments: 14// Comments:
14// Options: --no-includes --include-headers 15// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/iterators/list_entry_update.cocci b/scripts/coccinelle/iterators/list_entry_update.cocci
index be6f9f1abb34..d62e8a16085f 100644
--- a/scripts/coccinelle/iterators/list_entry_update.cocci
+++ b/scripts/coccinelle/iterators/list_entry_update.cocci
@@ -1,12 +1,13 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// list_for_each_entry uses its first argument to get from one element of 2/// list_for_each_entry uses its first argument to get from one element of
2/// the list to the next, so it is usually not a good idea to reassign it. 3/// the list to the next, so it is usually not a good idea to reassign it.
3/// The first rule finds such a reassignment and the second rule checks 4/// The first rule finds such a reassignment and the second rule checks
4/// that there is a path from the reassignment back to the top of the loop. 5/// that there is a path from the reassignment back to the top of the loop.
5/// 6///
6// Confidence: High 7// Confidence: High
7// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 8// Copyright: (C) 2010 Nicolas Palix, DIKU.
8// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 9// Copyright: (C) 2010 Julia Lawall, DIKU.
9// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 10// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
10// URL: http://coccinelle.lip6.fr/ 11// URL: http://coccinelle.lip6.fr/
11// Comments: 12// Comments:
12// Options: --no-includes --include-headers 13// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/iterators/use_after_iter.cocci b/scripts/coccinelle/iterators/use_after_iter.cocci
index 66a1140474c8..9be48b520879 100644
--- a/scripts/coccinelle/iterators/use_after_iter.cocci
+++ b/scripts/coccinelle/iterators/use_after_iter.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// If list_for_each_entry, etc complete a traversal of the list, the iterator 2/// If list_for_each_entry, etc complete a traversal of the list, the iterator
2/// variable ends up pointing to an address at an offset from the list head, 3/// variable ends up pointing to an address at an offset from the list head,
3/// and not a meaningful structure. Thus this value should not be used after 4/// and not a meaningful structure. Thus this value should not be used after
@@ -7,8 +8,8 @@
7//#may also cause a report to be a false positive. 8//#may also cause a report to be a false positive.
8/// 9///
9// Confidence: Moderate 10// Confidence: Moderate
10// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 11// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
11// Copyright: (C) 2012 Gilles Muller, INRIA/LIP6. GPLv2. 12// Copyright: (C) 2012 Gilles Muller, INRIA/LIP6.
12// URL: http://coccinelle.lip6.fr/ 13// URL: http://coccinelle.lip6.fr/
13// Comments: 14// Comments:
14// Options: --no-includes --include-headers 15// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/locks/call_kern.cocci b/scripts/coccinelle/locks/call_kern.cocci
index 669b24436248..5ca0d81b0015 100644
--- a/scripts/coccinelle/locks/call_kern.cocci
+++ b/scripts/coccinelle/locks/call_kern.cocci
@@ -1,12 +1,13 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find functions that refer to GFP_KERNEL but are called with locks held. 2/// Find functions that refer to GFP_KERNEL but are called with locks held.
2//# The proposed change of converting the GFP_KERNEL is not necessarily the 3//# The proposed change of converting the GFP_KERNEL is not necessarily the
3//# correct one. It may be desired to unlock the lock, or to not call the 4//# correct one. It may be desired to unlock the lock, or to not call the
4//# function under the lock in the first place. 5//# function under the lock in the first place.
5/// 6///
6// Confidence: Moderate 7// Confidence: Moderate
7// Copyright: (C) 2012 Nicolas Palix. GPLv2. 8// Copyright: (C) 2012 Nicolas Palix.
8// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 9// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
9// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 10// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
10// URL: http://coccinelle.lip6.fr/ 11// URL: http://coccinelle.lip6.fr/
11// Comments: 12// Comments:
12// Options: --no-includes --include-headers 13// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/locks/double_lock.cocci b/scripts/coccinelle/locks/double_lock.cocci
index 002752f97dca..9e88a578957c 100644
--- a/scripts/coccinelle/locks/double_lock.cocci
+++ b/scripts/coccinelle/locks/double_lock.cocci
@@ -1,11 +1,12 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find double locks. False positives may occur when some paths cannot 2/// Find double locks. False positives may occur when some paths cannot
2/// occur at execution, due to the values of variables, and when there is 3/// occur at execution, due to the values of variables, and when there is
3/// an intervening function call that releases the lock. 4/// an intervening function call that releases the lock.
4/// 5///
5// Confidence: Moderate 6// Confidence: Moderate
6// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 7// Copyright: (C) 2010 Nicolas Palix, DIKU.
7// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 8// Copyright: (C) 2010 Julia Lawall, DIKU.
8// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 9// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
9// URL: http://coccinelle.lip6.fr/ 10// URL: http://coccinelle.lip6.fr/
10// Comments: 11// Comments:
11// Options: --no-includes --include-headers 12// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/locks/flags.cocci b/scripts/coccinelle/locks/flags.cocci
index debd70e46267..7f990cd55f5a 100644
--- a/scripts/coccinelle/locks/flags.cocci
+++ b/scripts/coccinelle/locks/flags.cocci
@@ -1,9 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find nested lock+irqsave functions that use the same flags variables 2/// Find nested lock+irqsave functions that use the same flags variables
2/// 3///
3// Confidence: High 4// Confidence: High
4// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 5// Copyright: (C) 2010-2012 Nicolas Palix.
5// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
6// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 7// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
7// URL: http://coccinelle.lip6.fr/ 8// URL: http://coccinelle.lip6.fr/
8// Comments: 9// Comments:
9// Options: --no-includes --include-headers 10// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/locks/mini_lock.cocci b/scripts/coccinelle/locks/mini_lock.cocci
index 19c6ee5b986b..c3ad098f4a5b 100644
--- a/scripts/coccinelle/locks/mini_lock.cocci
+++ b/scripts/coccinelle/locks/mini_lock.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find missing unlocks. This semantic match considers the specific case 2/// Find missing unlocks. This semantic match considers the specific case
2/// where the unlock is missing from an if branch, and there is a lock 3/// where the unlock is missing from an if branch, and there is a lock
3/// before the if and an unlock after the if. False positives are due to 4/// before the if and an unlock after the if. False positives are due to
@@ -6,9 +7,9 @@
6/// function call that releases the lock. 7/// function call that releases the lock.
7/// 8///
8// Confidence: Moderate 9// Confidence: Moderate
9// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 10// Copyright: (C) 2010-2012 Nicolas Palix.
10// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 11// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
11// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 12// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
12// URL: http://coccinelle.lip6.fr/ 13// URL: http://coccinelle.lip6.fr/
13// Comments: 14// Comments:
14// Options: --no-includes --include-headers 15// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/misc/array_size.cocci b/scripts/coccinelle/misc/array_size.cocci
index 09520f0941f0..4d2518749696 100644
--- a/scripts/coccinelle/misc/array_size.cocci
+++ b/scripts/coccinelle/misc/array_size.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Use ARRAY_SIZE instead of dividing sizeof array with sizeof an element 2/// Use ARRAY_SIZE instead of dividing sizeof array with sizeof an element
2/// 3///
3//# This makes an effort to find cases where ARRAY_SIZE can be used such as 4//# This makes an effort to find cases where ARRAY_SIZE can be used such as
@@ -6,7 +7,7 @@
6//# division of the two sizeofs by ARRAY_SIZE. 7//# division of the two sizeofs by ARRAY_SIZE.
7// 8//
8// Confidence: High 9// Confidence: High
9// Copyright: (C) 2014 Himangi Saraogi. GPLv2. 10// Copyright: (C) 2014 Himangi Saraogi.
10// Comments: 11// Comments:
11// Options: --no-includes --include-headers 12// Options: --no-includes --include-headers
12 13
diff --git a/scripts/coccinelle/misc/badty.cocci b/scripts/coccinelle/misc/badty.cocci
index 08470362199c..ed3e0b8f3b1a 100644
--- a/scripts/coccinelle/misc/badty.cocci
+++ b/scripts/coccinelle/misc/badty.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Correct the size argument to alloc functions 2/// Correct the size argument to alloc functions
2/// 3///
3//# This makes an effort to find cases where the argument to sizeof is wrong 4//# This makes an effort to find cases where the argument to sizeof is wrong
@@ -8,7 +9,7 @@
8//# may need some reformatting. 9//# may need some reformatting.
9// 10//
10// Confidence: Moderate 11// Confidence: Moderate
11// Copyright: (C) 2014 Himangi Saraogi. GPLv2. 12// Copyright: (C) 2014 Himangi Saraogi.
12// Comments: 13// Comments:
13// Options: 14// Options:
14 15
diff --git a/scripts/coccinelle/misc/boolconv.cocci b/scripts/coccinelle/misc/boolconv.cocci
index 33c464d6bc71..392994e93a19 100644
--- a/scripts/coccinelle/misc/boolconv.cocci
+++ b/scripts/coccinelle/misc/boolconv.cocci
@@ -1,9 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Remove unneeded conversion to bool 2/// Remove unneeded conversion to bool
2/// 3///
3//# Relational and logical operators evaluate to bool, 4//# Relational and logical operators evaluate to bool,
4//# explicit conversion is overly verbose and unneeded. 5//# explicit conversion is overly verbose and unneeded.
5// 6//
6// Copyright: (C) 2016 Andrew F. Davis <afd@ti.com> GPLv2. 7// Copyright: (C) 2016 Andrew F. Davis <afd@ti.com>
7 8
8virtual patch 9virtual patch
9virtual context 10virtual context
diff --git a/scripts/coccinelle/misc/boolinit.cocci b/scripts/coccinelle/misc/boolinit.cocci
index aabb581fab5c..fed6126e2b9d 100644
--- a/scripts/coccinelle/misc/boolinit.cocci
+++ b/scripts/coccinelle/misc/boolinit.cocci
@@ -1,10 +1,11 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Bool initializations should use true and false. Bool tests don't need 2/// Bool initializations should use true and false. Bool tests don't need
2/// comparisons. Based on contributions from Joe Perches, Rusty Russell 3/// comparisons. Based on contributions from Joe Perches, Rusty Russell
3/// and Bruce W Allan. 4/// and Bruce W Allan.
4/// 5///
5// Confidence: High 6// Confidence: High
6// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 7// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
7// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 8// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
8// URL: http://coccinelle.lip6.fr/ 9// URL: http://coccinelle.lip6.fr/
9// Options: --include-headers 10// Options: --include-headers
10 11
diff --git a/scripts/coccinelle/misc/bugon.cocci b/scripts/coccinelle/misc/bugon.cocci
index 741586094abe..8d595c358408 100644
--- a/scripts/coccinelle/misc/bugon.cocci
+++ b/scripts/coccinelle/misc/bugon.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Use BUG_ON instead of a if condition followed by BUG. 2/// Use BUG_ON instead of a if condition followed by BUG.
2/// 3///
3//# This makes an effort to find cases where BUG() follows an if 4//# This makes an effort to find cases where BUG() follows an if
@@ -6,7 +7,7 @@
6//# as argument. 7//# as argument.
7// 8//
8// Confidence: High 9// Confidence: High
9// Copyright: (C) 2014 Himangi Saraogi. GPLv2. 10// Copyright: (C) 2014 Himangi Saraogi.
10// Comments: 11// Comments:
11// Options: --no-includes --include-headers 12// Options: --no-includes --include-headers
12 13
diff --git a/scripts/coccinelle/misc/cond_no_effect.cocci b/scripts/coccinelle/misc/cond_no_effect.cocci
index 8467dbd1c465..91d16a81d1da 100644
--- a/scripts/coccinelle/misc/cond_no_effect.cocci
+++ b/scripts/coccinelle/misc/cond_no_effect.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1///Find conditions where if and else branch are functionally 2///Find conditions where if and else branch are functionally
2// identical. 3// identical.
3// 4//
@@ -37,7 +38,7 @@
37// All other cases look like bugs or at least lack of documentation 38// All other cases look like bugs or at least lack of documentation
38// 39//
39// Confidence: Moderate 40// Confidence: Moderate
40// Copyright: (C) 2016 Nicholas Mc Guire, OSADL. GPLv2. 41// Copyright: (C) 2016 Nicholas Mc Guire, OSADL.
41// Comments: 42// Comments:
42// Options: --no-includes --include-headers 43// Options: --no-includes --include-headers
43 44
diff --git a/scripts/coccinelle/misc/cstptr.cocci b/scripts/coccinelle/misc/cstptr.cocci
index f0368b3d4563..c52e3c8ca9b3 100644
--- a/scripts/coccinelle/misc/cstptr.cocci
+++ b/scripts/coccinelle/misc/cstptr.cocci
@@ -1,9 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// PTR_ERR should be applied before its argument is reassigned, typically 2/// PTR_ERR should be applied before its argument is reassigned, typically
2/// to NULL 3/// to NULL
3/// 4///
4// Confidence: High 5// Confidence: High
5// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
6// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 7// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
7// URL: http://coccinelle.lip6.fr/ 8// URL: http://coccinelle.lip6.fr/
8// Comments: 9// Comments:
9// Options: --no-includes --include-headers 10// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/misc/doubleinit.cocci b/scripts/coccinelle/misc/doubleinit.cocci
index c0c3371d25e0..2f80d3ab38dd 100644
--- a/scripts/coccinelle/misc/doubleinit.cocci
+++ b/scripts/coccinelle/misc/doubleinit.cocci
@@ -1,11 +1,12 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find duplicate field initializations. This has a high rate of false 2/// Find duplicate field initializations. This has a high rate of false
2/// positives due to #ifdefs, which Coccinelle is not aware of in a structure 3/// positives due to #ifdefs, which Coccinelle is not aware of in a structure
3/// initialization. 4/// initialization.
4/// 5///
5// Confidence: Low 6// Confidence: Low
6// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 7// Copyright: (C) 2010-2012 Nicolas Palix.
7// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 8// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
8// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 9// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
9// URL: http://coccinelle.lip6.fr/ 10// URL: http://coccinelle.lip6.fr/
10// Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise 11// Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise
11// Options: --no-includes --include-headers 12// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/misc/ifaddr.cocci b/scripts/coccinelle/misc/ifaddr.cocci
index c2663c677ac1..fc92e8fcbfcb 100644
--- a/scripts/coccinelle/misc/ifaddr.cocci
+++ b/scripts/coccinelle/misc/ifaddr.cocci
@@ -1,8 +1,9 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// The address of a variable or field is likely always to be non-zero. 2/// The address of a variable or field is likely always to be non-zero.
2/// 3///
3// Confidence: High 4// Confidence: High
4// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 5// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
5// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 6// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
6// URL: http://coccinelle.lip6.fr/ 7// URL: http://coccinelle.lip6.fr/
7// Comments: 8// Comments:
8// Options: --no-includes --include-headers 9// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/misc/ifcol.cocci b/scripts/coccinelle/misc/ifcol.cocci
index ffe75407c5d2..da0351ed5740 100644
--- a/scripts/coccinelle/misc/ifcol.cocci
+++ b/scripts/coccinelle/misc/ifcol.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find confusingly indented code in or after an if. An if branch should 2/// Find confusingly indented code in or after an if. An if branch should
2/// be indented. The code following an if should not be indented. 3/// be indented. The code following an if should not be indented.
3/// Sometimes, code after an if that is indented is actually intended to be 4/// Sometimes, code after an if that is indented is actually intended to be
@@ -8,9 +9,9 @@
8//# is not visually aligned may be considered to be in the same column. 9//# is not visually aligned may be considered to be in the same column.
9// 10//
10// Confidence: Low 11// Confidence: Low
11// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 12// Copyright: (C) 2010 Nicolas Palix, DIKU.
12// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 13// Copyright: (C) 2010 Julia Lawall, DIKU.
13// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 14// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
14// URL: http://coccinelle.lip6.fr/ 15// URL: http://coccinelle.lip6.fr/
15// Comments: 16// Comments:
16// Options: --no-includes --include-headers 17// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/misc/noderef.cocci b/scripts/coccinelle/misc/noderef.cocci
index 007f0de0c715..72de62a77a44 100644
--- a/scripts/coccinelle/misc/noderef.cocci
+++ b/scripts/coccinelle/misc/noderef.cocci
@@ -1,9 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// sizeof when applied to a pointer typed expression gives the size of 2/// sizeof when applied to a pointer typed expression gives the size of
2/// the pointer 3/// the pointer
3/// 4///
4// Confidence: High 5// Confidence: High
5// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
6// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 7// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
7// URL: http://coccinelle.lip6.fr/ 8// URL: http://coccinelle.lip6.fr/
8// Comments: 9// Comments:
9// Options: --no-includes --include-headers 10// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/misc/orplus.cocci b/scripts/coccinelle/misc/orplus.cocci
index 08de5be73693..52203dc2ca4b 100644
--- a/scripts/coccinelle/misc/orplus.cocci
+++ b/scripts/coccinelle/misc/orplus.cocci
@@ -1,10 +1,11 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Check for constants that are added but are used elsewhere as bitmasks 2/// Check for constants that are added but are used elsewhere as bitmasks
2/// The results should be checked manually to ensure that the nonzero 3/// The results should be checked manually to ensure that the nonzero
3/// bits in the two constants are actually disjoint. 4/// bits in the two constants are actually disjoint.
4/// 5///
5// Confidence: Moderate 6// Confidence: Moderate
6// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6. GPLv2. 7// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6.
7// Copyright: (C) 2013 Gilles Muller, INRIA/LIP6. GPLv2. 8// Copyright: (C) 2013 Gilles Muller, INRIA/LIP6.
8// URL: http://coccinelle.lip6.fr/ 9// URL: http://coccinelle.lip6.fr/
9// Comments: 10// Comments:
10// Options: --no-includes --include-headers 11// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/misc/returnvar.cocci b/scripts/coccinelle/misc/returnvar.cocci
index d8286ef5307f..ce0d9eebc7e1 100644
--- a/scripts/coccinelle/misc/returnvar.cocci
+++ b/scripts/coccinelle/misc/returnvar.cocci
@@ -1,8 +1,9 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// 2///
2/// Remove unneeded variable used to store return value. 3/// Remove unneeded variable used to store return value.
3/// 4///
4// Confidence: Moderate 5// Confidence: Moderate
5// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.
6// URL: http://coccinelle.lip6.fr/ 7// URL: http://coccinelle.lip6.fr/
7// Comments: Comments on code can be deleted if near code that is removed. 8// Comments: Comments on code can be deleted if near code that is removed.
8// "when strict" can be removed to get more hits, but adds false 9// "when strict" can be removed to get more hits, but adds false
diff --git a/scripts/coccinelle/misc/semicolon.cocci b/scripts/coccinelle/misc/semicolon.cocci
index 6740c659a2b3..a53edb026dad 100644
--- a/scripts/coccinelle/misc/semicolon.cocci
+++ b/scripts/coccinelle/misc/semicolon.cocci
@@ -1,8 +1,9 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// 2///
2/// Remove unneeded semicolon. 3/// Remove unneeded semicolon.
3/// 4///
4// Confidence: Moderate 5// Confidence: Moderate
5// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.
6// URL: http://coccinelle.lip6.fr/ 7// URL: http://coccinelle.lip6.fr/
7// Comments: Some false positives on empty default cases in switch statements. 8// Comments: Some false positives on empty default cases in switch statements.
8// Options: --no-includes --include-headers 9// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/misc/warn.cocci b/scripts/coccinelle/misc/warn.cocci
index d2e5b6cedb84..e379661e240d 100644
--- a/scripts/coccinelle/misc/warn.cocci
+++ b/scripts/coccinelle/misc/warn.cocci
@@ -1,8 +1,9 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Use WARN(1,...) rather than printk followed by WARN_ON(1) 2/// Use WARN(1,...) rather than printk followed by WARN_ON(1)
2/// 3///
3// Confidence: High 4// Confidence: High
4// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 5// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
5// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 6// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
6// URL: http://coccinelle.lip6.fr/ 7// URL: http://coccinelle.lip6.fr/
7// Comments: 8// Comments:
8// Options: --no-includes --include-headers 9// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/null/badzero.cocci b/scripts/coccinelle/null/badzero.cocci
index f597c8007b76..882dd65313ab 100644
--- a/scripts/coccinelle/null/badzero.cocci
+++ b/scripts/coccinelle/null/badzero.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Compare pointer-typed values to NULL rather than 0 2/// Compare pointer-typed values to NULL rather than 0
2/// 3///
3//# This makes an effort to choose between !x and x == NULL. !x is used 4//# This makes an effort to choose between !x and x == NULL. !x is used
@@ -7,8 +8,8 @@
7//# include path. 8//# include path.
8// 9//
9// Confidence: High 10// Confidence: High
10// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. GPLv2. 11// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
11// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. GPLv2. 12// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
12// URL: http://coccinelle.lip6.fr/ 13// URL: http://coccinelle.lip6.fr/
13// Requires: 1.0.0 14// Requires: 1.0.0
14// Options: 15// Options:
diff --git a/scripts/coccinelle/null/deref_null.cocci b/scripts/coccinelle/null/deref_null.cocci
index cbc6184e69ef..98f1e7faf503 100644
--- a/scripts/coccinelle/null/deref_null.cocci
+++ b/scripts/coccinelle/null/deref_null.cocci
@@ -1,11 +1,12 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// 2///
2/// A variable is dereferenced under a NULL test. 3/// A variable is dereferenced under a NULL test.
3/// Even though it is known to be NULL. 4/// Even though it is known to be NULL.
4/// 5///
5// Confidence: Moderate 6// Confidence: Moderate
6// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 7// Copyright: (C) 2010 Nicolas Palix, DIKU.
7// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 8// Copyright: (C) 2010 Julia Lawall, DIKU.
8// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 9// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
9// URL: http://coccinelle.lip6.fr/ 10// URL: http://coccinelle.lip6.fr/
10// Comments: -I ... -all_includes can give more complete results 11// Comments: -I ... -all_includes can give more complete results
11// Options: 12// Options:
diff --git a/scripts/coccinelle/null/eno.cocci b/scripts/coccinelle/null/eno.cocci
index 9bd29aa83399..81584ff87956 100644
--- a/scripts/coccinelle/null/eno.cocci
+++ b/scripts/coccinelle/null/eno.cocci
@@ -1,9 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// The various basic memory allocation functions don't return ERR_PTR 2/// The various basic memory allocation functions don't return ERR_PTR
2/// 3///
3// Confidence: High 4// Confidence: High
4// Copyright: (C) 2010-2012 Nicolas Palix. GPLv2. 5// Copyright: (C) 2010-2012 Nicolas Palix.
5// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. GPLv2. 6// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
6// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. GPLv2. 7// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
7// URL: http://coccinelle.lip6.fr/ 8// URL: http://coccinelle.lip6.fr/
8// Comments: 9// Comments:
9// Options: --no-includes --include-headers 10// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/null/kmerr.cocci b/scripts/coccinelle/null/kmerr.cocci
index 5354a7903ccb..d0e004d4e130 100644
--- a/scripts/coccinelle/null/kmerr.cocci
+++ b/scripts/coccinelle/null/kmerr.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// This semantic patch looks for kmalloc etc that are not followed by a 2/// This semantic patch looks for kmalloc etc that are not followed by a
2/// NULL check. It only gives a report in the case where there is some 3/// NULL check. It only gives a report in the case where there is some
3/// error handling code later in the function, which may be helpful 4/// error handling code later in the function, which may be helpful
@@ -5,9 +6,9 @@
5/// should be. 6/// should be.
6/// 7///
7// Confidence: High 8// Confidence: High
8// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 9// Copyright: (C) 2010 Nicolas Palix, DIKU.
9// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 10// Copyright: (C) 2010 Julia Lawall, DIKU.
10// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 11// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
11// URL: http://coccinelle.lip6.fr/ 12// URL: http://coccinelle.lip6.fr/
12// Comments: 13// Comments:
13// Options: --no-includes --include-headers 14// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/tests/doublebitand.cocci b/scripts/coccinelle/tests/doublebitand.cocci
index 72f1572aaec3..0f0b94e7debd 100644
--- a/scripts/coccinelle/tests/doublebitand.cocci
+++ b/scripts/coccinelle/tests/doublebitand.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find bit operations that include the same argument more than once 2/// Find bit operations that include the same argument more than once
2//# One source of false positives is when the argument performs a side 3//# One source of false positives is when the argument performs a side
3//# effect. Another source of false positives is when a neutral value 4//# effect. Another source of false positives is when a neutral value
@@ -5,9 +6,9 @@
5//# same structure as other similar expressions 6//# same structure as other similar expressions
6/// 7///
7// Confidence: Moderate 8// Confidence: Moderate
8// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 9// Copyright: (C) 2010 Nicolas Palix, DIKU.
9// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 10// Copyright: (C) 2010 Julia Lawall, DIKU.
10// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 11// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
11// URL: http://coccinelle.lip6.fr/ 12// URL: http://coccinelle.lip6.fr/
12// Comments: 13// Comments:
13// Options: --no-includes --include-headers 14// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/tests/doubletest.cocci b/scripts/coccinelle/tests/doubletest.cocci
index 7af2ce7eb9bf..b35519cddb13 100644
--- a/scripts/coccinelle/tests/doubletest.cocci
+++ b/scripts/coccinelle/tests/doubletest.cocci
@@ -1,12 +1,13 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Find &&/|| operations that include the same argument more than once 2/// Find &&/|| operations that include the same argument more than once
2//# A common source of false positives is when the expression, or 3//# A common source of false positives is when the expression, or
3//# another expresssion in the same && or || operation, performs a 4//# another expresssion in the same && or || operation, performs a
4//# side effect. 5//# side effect.
5/// 6///
6// Confidence: Moderate 7// Confidence: Moderate
7// Copyright: (C) 2010 Nicolas Palix, DIKU. GPLv2. 8// Copyright: (C) 2010 Nicolas Palix, DIKU.
8// Copyright: (C) 2010 Julia Lawall, DIKU. GPLv2. 9// Copyright: (C) 2010 Julia Lawall, DIKU.
9// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. GPLv2. 10// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
10// URL: http://coccinelle.lip6.fr/ 11// URL: http://coccinelle.lip6.fr/
11// Comments: 12// Comments:
12// Options: --no-includes --include-headers 13// Options: --no-includes --include-headers
diff --git a/scripts/coccinelle/tests/odd_ptr_err.cocci b/scripts/coccinelle/tests/odd_ptr_err.cocci
index dfc6b40c2969..11d4e2b6deb8 100644
--- a/scripts/coccinelle/tests/odd_ptr_err.cocci
+++ b/scripts/coccinelle/tests/odd_ptr_err.cocci
@@ -1,10 +1,11 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// PTR_ERR should access the value just tested by IS_ERR 2/// PTR_ERR should access the value just tested by IS_ERR
2//# There can be false positives in the patch case, where it is the call to 3//# There can be false positives in the patch case, where it is the call to
3//# IS_ERR that is wrong. 4//# IS_ERR that is wrong.
4/// 5///
5// Confidence: High 6// Confidence: High
6// Copyright: (C) 2012, 2015 Julia Lawall, INRIA. GPLv2. 7// Copyright: (C) 2012, 2015 Julia Lawall, INRIA.
7// Copyright: (C) 2012, 2015 Gilles Muller, INRIA. GPLv2. 8// Copyright: (C) 2012, 2015 Gilles Muller, INRIA.
8// URL: http://coccinelle.lip6.fr/ 9// URL: http://coccinelle.lip6.fr/
9// Options: --no-includes --include-headers 10// Options: --no-includes --include-headers
10 11
diff --git a/scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci b/scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci
index 8fa5a3c7b784..91e286ace54c 100644
--- a/scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci
+++ b/scripts/coccinelle/tests/unsigned_lesser_than_zero.cocci
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/// Unsigned expressions cannot be lesser than zero. Presence of 2/// Unsigned expressions cannot be lesser than zero. Presence of
2/// comparisons 'unsigned (<|<=|>|>=) 0' often indicates a bug, 3/// comparisons 'unsigned (<|<=|>|>=) 0' often indicates a bug,
3/// usually wrong type of variable. 4/// usually wrong type of variable.
@@ -11,7 +12,7 @@
11/// result is used to avoid false positives difficult to detect by other ways 12/// result is used to avoid false positives difficult to detect by other ways
12/// 13///
13// Confidence: Average 14// Confidence: Average
14// Copyright: (C) 2015 Andrzej Hajda, Samsung Electronics Co., Ltd. GPLv2. 15// Copyright: (C) 2015 Andrzej Hajda, Samsung Electronics Co., Ltd.
15// URL: http://coccinelle.lip6.fr/ 16// URL: http://coccinelle.lip6.fr/
16// Options: --all-includes 17// Options: --all-includes
17 18
diff --git a/scripts/conmakehash.c b/scripts/conmakehash.c
index 61bbda54cf13..cddd789fe46e 100644
--- a/scripts/conmakehash.c
+++ b/scripts/conmakehash.c
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * conmakehash.c 3 * conmakehash.c
3 * 4 *
@@ -8,10 +9,6 @@
8 * just for this seems like massive overkill. 9 * just for this seems like massive overkill.
9 * 10 *
10 * Copyright (C) 1995-1997 H. Peter Anvin 11 * Copyright (C) 1995-1997 H. Peter Anvin
11 *
12 * This program is a part of the Linux kernel, and may be freely
13 * copied under the terms of the GNU General Public License (GPL),
14 * version 2, or at your option any later version.
15 */ 12 */
16 13
17#include <stdio.h> 14#include <stdio.h>
diff --git a/scripts/decode_stacktrace.sh b/scripts/decode_stacktrace.sh
index bcdd45df3f51..13e5fbafdf2f 100755
--- a/scripts/decode_stacktrace.sh
+++ b/scripts/decode_stacktrace.sh
@@ -28,7 +28,7 @@ parse_symbol() {
28 local objfile=${modcache[$module]} 28 local objfile=${modcache[$module]}
29 else 29 else
30 [[ $modpath == "" ]] && return 30 [[ $modpath == "" ]] && return
31 local objfile=$(find "$modpath" -name $module.ko -print -quit) 31 local objfile=$(find "$modpath" -name "${module//_/[-_]}.ko*" -print -quit)
32 [[ $objfile == "" ]] && return 32 [[ $objfile == "" ]] && return
33 modcache[$module]=$objfile 33 modcache[$module]=$objfile
34 fi 34 fi
@@ -73,7 +73,7 @@ parse_symbol() {
73 if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then 73 if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then
74 local code=${cache[$module,$address]} 74 local code=${cache[$module,$address]}
75 else 75 else
76 local code=$(addr2line -i -e "$objfile" "$address") 76 local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address")
77 cache[$module,$address]=$code 77 cache[$module,$address]=$code
78 fi 78 fi
79 79
@@ -85,7 +85,7 @@ parse_symbol() {
85 fi 85 fi
86 86
87 # Strip out the base of the path 87 # Strip out the base of the path
88 code=${code//^$basepath/""} 88 code=${code#$basepath/}
89 89
90 # In the case of inlines, move everything to same line 90 # In the case of inlines, move everything to same line
91 code=${code//$'\n'/' '} 91 code=${code//$'\n'/' '}
diff --git a/scripts/documentation-file-ref-check b/scripts/documentation-file-ref-check
index 63e9542656f1..7784c54aa38b 100755
--- a/scripts/documentation-file-ref-check
+++ b/scripts/documentation-file-ref-check
@@ -8,15 +8,30 @@ use warnings;
8use strict; 8use strict;
9use Getopt::Long qw(:config no_auto_abbrev); 9use Getopt::Long qw(:config no_auto_abbrev);
10 10
11# NOTE: only add things here when the file was gone, but the text wants
12# to mention a past documentation file, for example, to give credits for
13# the original work.
14my %false_positives = (
15 "Documentation/scsi/scsi_mid_low_api.txt" => "Documentation/Configure.help",
16 "drivers/vhost/vhost.c" => "Documentation/virtual/lguest/lguest.c",
17);
18
11my $scriptname = $0; 19my $scriptname = $0;
12$scriptname =~ s,.*/([^/]+/),$1,; 20$scriptname =~ s,.*/([^/]+/),$1,;
13 21
14# Parse arguments 22# Parse arguments
15my $help = 0; 23my $help = 0;
16my $fix = 0; 24my $fix = 0;
25my $warn = 0;
26
27if (! -d ".git") {
28 printf "Warning: can't check if file exists, as this is not a git tree";
29 exit 0;
30}
17 31
18GetOptions( 32GetOptions(
19 'fix' => \$fix, 33 'fix' => \$fix,
34 'warn' => \$warn,
20 'h|help|usage' => \$help, 35 'h|help|usage' => \$help,
21); 36);
22 37
@@ -75,6 +90,9 @@ while (<IN>) {
75 # Skip this script 90 # Skip this script
76 next if ($f eq $scriptname); 91 next if ($f eq $scriptname);
77 92
93 # Ignore the dir where documentation will be built
94 next if ($ln =~ m,\b(\S*)Documentation/output,);
95
78 if ($ln =~ m,\b(\S*)(Documentation/[A-Za-z0-9\_\.\,\~/\*\[\]\?+-]*)(.*),) { 96 if ($ln =~ m,\b(\S*)(Documentation/[A-Za-z0-9\_\.\,\~/\*\[\]\?+-]*)(.*),) {
79 my $prefix = $1; 97 my $prefix = $1;
80 my $ref = $2; 98 my $ref = $2;
@@ -109,7 +127,7 @@ while (<IN>) {
109 # Remove sched-pelt false-positive 127 # Remove sched-pelt false-positive
110 next if ($fulref =~ m,^Documentation/scheduler/sched-pelt$,); 128 next if ($fulref =~ m,^Documentation/scheduler/sched-pelt$,);
111 129
112 # Discard some build examples from Documentation/target/tcm_mod_builder.txt 130 # Discard some build examples from Documentation/target/tcm_mod_builder.rst
113 next if ($fulref =~ m,mnt/sdb/lio-core-2.6.git/Documentation/target,); 131 next if ($fulref =~ m,mnt/sdb/lio-core-2.6.git/Documentation/target,);
114 132
115 # Check if exists, evaluating wildcards 133 # Check if exists, evaluating wildcards
@@ -119,13 +137,20 @@ while (<IN>) {
119 if ($f =~ m/tools/) { 137 if ($f =~ m/tools/) {
120 my $path = $f; 138 my $path = $f;
121 $path =~ s,(.*)/.*,$1,; 139 $path =~ s,(.*)/.*,$1,;
122 next if (grep -e, glob("$path/$ref $path/$fulref")); 140 next if (grep -e, glob("$path/$ref $path/../$ref $path/$fulref"));
141 }
142
143 # Discard known false-positives
144 if (defined($false_positives{$f})) {
145 next if ($false_positives{$f} eq $fulref);
123 } 146 }
124 147
125 if ($fix) { 148 if ($fix) {
126 if (!($ref =~ m/(scripts|Kconfig|Kbuild)/)) { 149 if (!($ref =~ m/(scripts|Kconfig|Kbuild)/)) {
127 $broken_ref{$ref}++; 150 $broken_ref{$ref}++;
128 } 151 }
152 } elsif ($warn) {
153 print STDERR "Warning: $f references a file that doesn't exist: $fulref\n";
129 } else { 154 } else {
130 print STDERR "$f: $fulref\n"; 155 print STDERR "$f: $fulref\n";
131 } 156 }
@@ -141,6 +166,10 @@ print "Auto-fixing broken references. Please double-check the results\n";
141foreach my $ref (keys %broken_ref) { 166foreach my $ref (keys %broken_ref) {
142 my $new =$ref; 167 my $new =$ref;
143 168
169 my $basedir = ".";
170 # On translations, only seek inside the translations directory
171 $basedir = $1 if ($ref =~ m,(Documentation/translations/[^/]+),);
172
144 # get just the basename 173 # get just the basename
145 $new =~ s,.*/,,; 174 $new =~ s,.*/,,;
146 175
@@ -148,31 +177,40 @@ foreach my $ref (keys %broken_ref) {
148 177
149 # usual reason for breakage: DT file moved around 178 # usual reason for breakage: DT file moved around
150 if ($ref =~ /devicetree/) { 179 if ($ref =~ /devicetree/) {
151 my $search = $new; 180 # usual reason for breakage: DT file renamed to .yaml
152 $search =~ s,^.*/,,; 181 if (!$f) {
153 $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search); 182 my $new_ref = $ref;
183 $new_ref =~ s/\.txt$/.yaml/;
184 $f=$new_ref if (-f $new_ref);
185 }
186
154 if (!$f) { 187 if (!$f) {
155 # Manufacturer name may have changed 188 my $search = $new;
156 $search =~ s/^.*,//; 189 $search =~ s,^.*/,,;
157 $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search); 190 $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search);
191 if (!$f) {
192 # Manufacturer name may have changed
193 $search =~ s/^.*,//;
194 $f = qx(find Documentation/devicetree/ -iname "*$search*") if ($search);
195 }
158 } 196 }
159 } 197 }
160 198
161 # usual reason for breakage: file renamed to .rst 199 # usual reason for breakage: file renamed to .rst
162 if (!$f) { 200 if (!$f) {
163 $new =~ s/\.txt$/.rst/; 201 $new =~ s/\.txt$/.rst/;
164 $f=qx(find . -iname $new) if ($new); 202 $f=qx(find $basedir -iname $new) if ($new);
165 } 203 }
166 204
167 # usual reason for breakage: use dash or underline 205 # usual reason for breakage: use dash or underline
168 if (!$f) { 206 if (!$f) {
169 $new =~ s/[-_]/[-_]/g; 207 $new =~ s/[-_]/[-_]/g;
170 $f=qx(find . -iname $new) if ($new); 208 $f=qx(find $basedir -iname $new) if ($new);
171 } 209 }
172 210
173 # Wild guess: seek for the same name on another place 211 # Wild guess: seek for the same name on another place
174 if (!$f) { 212 if (!$f) {
175 $f = qx(find . -iname $new) if ($new); 213 $f = qx(find $basedir -iname $new) if ($new);
176 } 214 }
177 215
178 my @find = split /\s+/, $f; 216 my @find = split /\s+/, $f;
diff --git a/scripts/dtc/Makefile b/scripts/dtc/Makefile
index 5f227d8d39d8..82160808765c 100644
--- a/scripts/dtc/Makefile
+++ b/scripts/dtc/Makefile
@@ -9,7 +9,7 @@ dtc-objs := dtc.o flattree.o fstree.o data.o livetree.o treesource.o \
9dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o 9dtc-objs += dtc-lexer.lex.o dtc-parser.tab.o
10 10
11# Source files need to get at the userspace version of libfdt_env.h to compile 11# Source files need to get at the userspace version of libfdt_env.h to compile
12HOST_EXTRACFLAGS := -I$(src)/libfdt 12HOST_EXTRACFLAGS := -I $(srctree)/$(src)/libfdt
13 13
14ifeq ($(wildcard /usr/include/yaml.h),) 14ifeq ($(wildcard /usr/include/yaml.h),)
15ifneq ($(CHECK_DTBS),) 15ifneq ($(CHECK_DTBS),)
@@ -23,8 +23,8 @@ HOSTLDLIBS_dtc := -lyaml
23endif 23endif
24 24
25# Generated files need one more search path to include headers in source tree 25# Generated files need one more search path to include headers in source tree
26HOSTCFLAGS_dtc-lexer.lex.o := -I$(src) 26HOSTCFLAGS_dtc-lexer.lex.o := -I $(srctree)/$(src)
27HOSTCFLAGS_dtc-parser.tab.o := -I$(src) 27HOSTCFLAGS_dtc-parser.tab.o := -I $(srctree)/$(src)
28 28
29# dependencies on generated files need to be listed explicitly 29# dependencies on generated files need to be listed explicitly
30$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h 30$(obj)/dtc-lexer.lex.o: $(obj)/dtc-parser.tab.h
diff --git a/scripts/dtc/Makefile.dtc b/scripts/dtc/Makefile.dtc
index d4375630a7f7..9c467b096f03 100644
--- a/scripts/dtc/Makefile.dtc
+++ b/scripts/dtc/Makefile.dtc
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0-or-later
1# Makefile.dtc 2# Makefile.dtc
2# 3#
3# This is not a complete Makefile of itself. Instead, it is designed to 4# This is not a complete Makefile of itself. Instead, it is designed to
diff --git a/scripts/dtc/checks.c b/scripts/dtc/checks.c
index 4834e44b37b2..d7986ee18012 100644
--- a/scripts/dtc/checks.c
+++ b/scripts/dtc/checks.c
@@ -1,21 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2007. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2007.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20 5
21#include "dtc.h" 6#include "dtc.h"
@@ -660,6 +645,8 @@ ERROR(path_references, fixup_path_references, NULL, &duplicate_node_names);
660static void fixup_omit_unused_nodes(struct check *c, struct dt_info *dti, 645static void fixup_omit_unused_nodes(struct check *c, struct dt_info *dti,
661 struct node *node) 646 struct node *node)
662{ 647{
648 if (generate_symbols && node->labels)
649 return;
663 if (node->omit_if_unused && !node->is_referenced) 650 if (node->omit_if_unused && !node->is_referenced)
664 delete_node(node); 651 delete_node(node);
665} 652}
@@ -1212,8 +1199,24 @@ static void check_avoid_unnecessary_addr_size(struct check *c, struct dt_info *d
1212} 1199}
1213WARNING(avoid_unnecessary_addr_size, check_avoid_unnecessary_addr_size, NULL, &avoid_default_addr_size); 1200WARNING(avoid_unnecessary_addr_size, check_avoid_unnecessary_addr_size, NULL, &avoid_default_addr_size);
1214 1201
1215static void check_unique_unit_address(struct check *c, struct dt_info *dti, 1202static bool node_is_disabled(struct node *node)
1216 struct node *node) 1203{
1204 struct property *prop;
1205
1206 prop = get_property(node, "status");
1207 if (prop) {
1208 char *str = prop->val.val;
1209 if (streq("disabled", str))
1210 return true;
1211 }
1212
1213 return false;
1214}
1215
1216static void check_unique_unit_address_common(struct check *c,
1217 struct dt_info *dti,
1218 struct node *node,
1219 bool disable_check)
1217{ 1220{
1218 struct node *childa; 1221 struct node *childa;
1219 1222
@@ -1230,18 +1233,38 @@ static void check_unique_unit_address(struct check *c, struct dt_info *dti,
1230 if (!strlen(addr_a)) 1233 if (!strlen(addr_a))
1231 continue; 1234 continue;
1232 1235
1236 if (disable_check && node_is_disabled(childa))
1237 continue;
1238
1233 for_each_child(node, childb) { 1239 for_each_child(node, childb) {
1234 const char *addr_b = get_unitname(childb); 1240 const char *addr_b = get_unitname(childb);
1235 if (childa == childb) 1241 if (childa == childb)
1236 break; 1242 break;
1237 1243
1244 if (disable_check && node_is_disabled(childb))
1245 continue;
1246
1238 if (streq(addr_a, addr_b)) 1247 if (streq(addr_a, addr_b))
1239 FAIL(c, dti, childb, "duplicate unit-address (also used in node %s)", childa->fullpath); 1248 FAIL(c, dti, childb, "duplicate unit-address (also used in node %s)", childa->fullpath);
1240 } 1249 }
1241 } 1250 }
1242} 1251}
1252
1253static void check_unique_unit_address(struct check *c, struct dt_info *dti,
1254 struct node *node)
1255{
1256 check_unique_unit_address_common(c, dti, node, false);
1257}
1243WARNING(unique_unit_address, check_unique_unit_address, NULL, &avoid_default_addr_size); 1258WARNING(unique_unit_address, check_unique_unit_address, NULL, &avoid_default_addr_size);
1244 1259
1260static void check_unique_unit_address_if_enabled(struct check *c, struct dt_info *dti,
1261 struct node *node)
1262{
1263 check_unique_unit_address_common(c, dti, node, true);
1264}
1265CHECK_ENTRY(unique_unit_address_if_enabled, check_unique_unit_address_if_enabled,
1266 NULL, false, false, &avoid_default_addr_size);
1267
1245static void check_obsolete_chosen_interrupt_controller(struct check *c, 1268static void check_obsolete_chosen_interrupt_controller(struct check *c,
1246 struct dt_info *dti, 1269 struct dt_info *dti,
1247 struct node *node) 1270 struct node *node)
@@ -1542,10 +1565,14 @@ static void check_interrupts_property(struct check *c,
1542 prop = get_property(parent, "interrupt-parent"); 1565 prop = get_property(parent, "interrupt-parent");
1543 if (prop) { 1566 if (prop) {
1544 phandle = propval_cell(prop); 1567 phandle = propval_cell(prop);
1545 /* Give up if this is an overlay with external references */ 1568 if ((phandle == 0) || (phandle == -1)) {
1546 if ((phandle == 0 || phandle == -1) && 1569 /* Give up if this is an overlay with
1547 (dti->dtsflags & DTSF_PLUGIN)) 1570 * external references */
1571 if (dti->dtsflags & DTSF_PLUGIN)
1548 return; 1572 return;
1573 FAIL_PROP(c, dti, parent, prop, "Invalid phandle");
1574 continue;
1575 }
1549 1576
1550 irq_node = get_node_by_phandle(root, phandle); 1577 irq_node = get_node_by_phandle(root, phandle);
1551 if (!irq_node) { 1578 if (!irq_node) {
@@ -1714,7 +1741,7 @@ static void check_graph_endpoint(struct check *c, struct dt_info *dti,
1714 return; 1741 return;
1715 1742
1716 if (!strprefixeq(node->name, node->basenamelen, "endpoint")) 1743 if (!strprefixeq(node->name, node->basenamelen, "endpoint"))
1717 FAIL(c, dti, node, "graph endpont node name should be 'endpoint'"); 1744 FAIL(c, dti, node, "graph endpoint node name should be 'endpoint'");
1718 1745
1719 check_graph_reg(c, dti, node); 1746 check_graph_reg(c, dti, node);
1720 1747
@@ -1769,6 +1796,7 @@ static struct check *check_table[] = {
1769 &avoid_default_addr_size, 1796 &avoid_default_addr_size,
1770 &avoid_unnecessary_addr_size, 1797 &avoid_unnecessary_addr_size,
1771 &unique_unit_address, 1798 &unique_unit_address,
1799 &unique_unit_address_if_enabled,
1772 &obsolete_chosen_interrupt_controller, 1800 &obsolete_chosen_interrupt_controller,
1773 &chosen_node_is_root, &chosen_node_bootargs, &chosen_node_stdout_path, 1801 &chosen_node_is_root, &chosen_node_bootargs, &chosen_node_stdout_path,
1774 1802
diff --git a/scripts/dtc/data.c b/scripts/dtc/data.c
index 4a204145cc7b..0a43b6de3264 100644
--- a/scripts/dtc/data.c
+++ b/scripts/dtc/data.c
@@ -1,21 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20 5
21#include "dtc.h" 6#include "dtc.h"
diff --git a/scripts/dtc/dt_to_config b/scripts/dtc/dt_to_config
index 5dfd1bff351f..299d1c2b20d7 100755
--- a/scripts/dtc/dt_to_config
+++ b/scripts/dtc/dt_to_config
@@ -1,10 +1,9 @@
1#!/usr/bin/env perl 1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3# Copyright 2016 by Frank Rowand 4# Copyright 2016 by Frank Rowand
4# Copyright 2016 by Gaurav Minocha 5# Copyright 2016 by Gaurav Minocha
5# 6#
6# This file is subject to the terms and conditions of the GNU General Public
7# License v2.
8 7
9use strict 'refs'; 8use strict 'refs';
10use strict subs; 9use strict subs;
diff --git a/scripts/dtc/dtc-lexer.l b/scripts/dtc/dtc-lexer.l
index 06c040902444..5c6c3fd557d7 100644
--- a/scripts/dtc/dtc-lexer.l
+++ b/scripts/dtc/dtc-lexer.l
@@ -1,21 +1,6 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20 5
21%option noyywrap nounput noinput never-interactive 6%option noyywrap nounput noinput never-interactive
diff --git a/scripts/dtc/dtc-parser.y b/scripts/dtc/dtc-parser.y
index 2ec981e86111..2ed4dc1f07fd 100644
--- a/scripts/dtc/dtc-parser.y
+++ b/scripts/dtc/dtc-parser.y
@@ -1,21 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20%{ 5%{
21#include <stdio.h> 6#include <stdio.h>
diff --git a/scripts/dtc/dtc.c b/scripts/dtc/dtc.c
index 695e1f789fc7..bdb3f5945699 100644
--- a/scripts/dtc/dtc.c
+++ b/scripts/dtc/dtc.c
@@ -1,21 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20 5
21#include <sys/stat.h> 6#include <sys/stat.h>
diff --git a/scripts/dtc/dtc.h b/scripts/dtc/dtc.h
index 789e0b1bc057..6e74ecea55a3 100644
--- a/scripts/dtc/dtc.h
+++ b/scripts/dtc/dtc.h
@@ -1,24 +1,9 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
1#ifndef DTC_H 2#ifndef DTC_H
2#define DTC_H 3#define DTC_H
3 4
4/* 5/*
5 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 6 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
6 *
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21 * USA
22 */ 7 */
23 8
24#include <stdio.h> 9#include <stdio.h>
@@ -231,7 +216,8 @@ void add_child(struct node *parent, struct node *child);
231void delete_node_by_name(struct node *parent, char *name); 216void delete_node_by_name(struct node *parent, char *name);
232void delete_node(struct node *node); 217void delete_node(struct node *node);
233void append_to_property(struct node *node, 218void append_to_property(struct node *node,
234 char *name, const void *data, int len); 219 char *name, const void *data, int len,
220 enum markertype type);
235 221
236const char *get_unitname(struct node *node); 222const char *get_unitname(struct node *node);
237struct property *get_property(struct node *node, const char *propname); 223struct property *get_property(struct node *node, const char *propname);
diff --git a/scripts/dtc/dtx_diff b/scripts/dtc/dtx_diff
index 0d8572008729..00fd4738a587 100755
--- a/scripts/dtc/dtx_diff
+++ b/scripts/dtc/dtx_diff
@@ -1,10 +1,8 @@
1#! /bin/bash 1#! /bin/bash
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3# Copyright (C) 2015 Frank Rowand 4# Copyright (C) 2015 Frank Rowand
4# 5#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; version 2 of the License.
8 6
9 7
10usage() { 8usage() {
diff --git a/scripts/dtc/fdtget.c b/scripts/dtc/fdtget.c
index c2fbab2a5476..c922f82246c6 100644
--- a/scripts/dtc/fdtget.c
+++ b/scripts/dtc/fdtget.c
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 3 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
3 * 4 *
@@ -6,21 +7,6 @@
6 * Based on code written by: 7 * Based on code written by:
7 * Pantelis Antoniou <pantelis.antoniou@gmail.com> and 8 * Pantelis Antoniou <pantelis.antoniou@gmail.com> and
8 * Matthew McClintock <msm@freescale.com> 9 * Matthew McClintock <msm@freescale.com>
9 *
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of
13 * the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
23 * MA 02111-1307 USA
24 */ 10 */
25 11
26#include <assert.h> 12#include <assert.h>
diff --git a/scripts/dtc/fdtput.c b/scripts/dtc/fdtput.c
index f2197f51930b..a363c3cabc59 100644
--- a/scripts/dtc/fdtput.c
+++ b/scripts/dtc/fdtput.c
@@ -1,20 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 3 * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of
7 * the License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
17 * MA 02111-1307 USA
18 */ 4 */
19 5
20#include <assert.h> 6#include <assert.h>
diff --git a/scripts/dtc/flattree.c b/scripts/dtc/flattree.c
index acf04c30669f..bd6977eedcb8 100644
--- a/scripts/dtc/flattree.c
+++ b/scripts/dtc/flattree.c
@@ -1,21 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20 5
21#include "dtc.h" 6#include "dtc.h"
@@ -525,7 +510,7 @@ void dt_to_asm(FILE *f, struct dt_info *dti, int version)
525 fprintf(f, "/* Memory reserve map from source file */\n"); 510 fprintf(f, "/* Memory reserve map from source file */\n");
526 511
527 /* 512 /*
528 * Use .long on high and low halfs of u64s to avoid .quad 513 * Use .long on high and low halves of u64s to avoid .quad
529 * as it appears .quad isn't available in some assemblers. 514 * as it appears .quad isn't available in some assemblers.
530 */ 515 */
531 for (re = dti->reservelist; re; re = re->next) { 516 for (re = dti->reservelist; re; re = re->next) {
diff --git a/scripts/dtc/fstree.c b/scripts/dtc/fstree.c
index 1e7eeba47ff6..9871689b4afb 100644
--- a/scripts/dtc/fstree.c
+++ b/scripts/dtc/fstree.c
@@ -1,21 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20 5
21#include "dtc.h" 6#include "dtc.h"
diff --git a/scripts/dtc/libfdt/Makefile.libfdt b/scripts/dtc/libfdt/Makefile.libfdt
index 3af3656df801..e54639738c8e 100644
--- a/scripts/dtc/libfdt/Makefile.libfdt
+++ b/scripts/dtc/libfdt/Makefile.libfdt
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1# Makefile.libfdt 2# Makefile.libfdt
2# 3#
3# This is not a complete Makefile of itself. Instead, it is designed to 4# This is not a complete Makefile of itself. Instead, it is designed to
@@ -9,7 +10,9 @@ LIBFDT_VERSION = version.lds
9LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c fdt_empty_tree.c \ 10LIBFDT_SRCS = fdt.c fdt_ro.c fdt_wip.c fdt_sw.c fdt_rw.c fdt_strerror.c fdt_empty_tree.c \
10 fdt_addresses.c fdt_overlay.c 11 fdt_addresses.c fdt_overlay.c
11LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o) 12LIBFDT_OBJS = $(LIBFDT_SRCS:%.c=%.o)
13LIBFDT_LIB = libfdt-$(DTC_VERSION).$(SHAREDLIB_EXT)
12 14
13libfdt_clean: 15libfdt_clean:
14 @$(VECHO) CLEAN "(libfdt)" 16 @$(VECHO) CLEAN "(libfdt)"
15 rm -f $(STD_CLEANFILES:%=$(LIBFDT_dir)/%) 17 rm -f $(STD_CLEANFILES:%=$(LIBFDT_dir)/%)
18 rm -f $(LIBFDT_dir)/$(LIBFDT_soname)
diff --git a/scripts/dtc/libfdt/fdt.c b/scripts/dtc/libfdt/fdt.c
index ae03b1112961..179168ec63e9 100644
--- a/scripts/dtc/libfdt/fdt.c
+++ b/scripts/dtc/libfdt/fdt.c
@@ -1,52 +1,7 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2006 David Gibson, IBM Corporation. 4 * Copyright (C) 2006 David Gibson, IBM Corporation.
4 *
5 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 *
8 * a) This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 * MA 02110-1301 USA
22 *
23 * Alternatively,
24 *
25 * b) Redistribution and use in source and binary forms, with or
26 * without modification, are permitted provided that the following
27 * conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer.
32 * 2. Redistributions in binary form must reproduce the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer in the documentation and/or other materials
35 * provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 */ 5 */
51#include "libfdt_env.h" 6#include "libfdt_env.h"
52 7
diff --git a/scripts/dtc/libfdt/fdt.h b/scripts/dtc/libfdt/fdt.h
index 74961f9026d1..f2e68807f277 100644
--- a/scripts/dtc/libfdt/fdt.h
+++ b/scripts/dtc/libfdt/fdt.h
@@ -1,55 +1,10 @@
1/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */
1#ifndef FDT_H 2#ifndef FDT_H
2#define FDT_H 3#define FDT_H
3/* 4/*
4 * libfdt - Flat Device Tree manipulation 5 * libfdt - Flat Device Tree manipulation
5 * Copyright (C) 2006 David Gibson, IBM Corporation. 6 * Copyright (C) 2006 David Gibson, IBM Corporation.
6 * Copyright 2012 Kim Phillips, Freescale Semiconductor. 7 * Copyright 2012 Kim Phillips, Freescale Semiconductor.
7 *
8 * libfdt is dual licensed: you can use it either under the terms of
9 * the GPL, or the BSD license, at your option.
10 *
11 * a) This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; either version 2 of the
14 * License, or (at your option) any later version.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public
22 * License along with this library; if not, write to the Free
23 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
24 * MA 02110-1301 USA
25 *
26 * Alternatively,
27 *
28 * b) Redistribution and use in source and binary forms, with or
29 * without modification, are permitted provided that the following
30 * conditions are met:
31 *
32 * 1. Redistributions of source code must retain the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer.
35 * 2. Redistributions in binary form must reproduce the above
36 * copyright notice, this list of conditions and the following
37 * disclaimer in the documentation and/or other materials
38 * provided with the distribution.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
41 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
42 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
43 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
45 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
47 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
48 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
50 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
51 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
52 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53 */ 8 */
54 9
55#ifndef __ASSEMBLY__ 10#ifndef __ASSEMBLY__
diff --git a/scripts/dtc/libfdt/fdt_addresses.c b/scripts/dtc/libfdt/fdt_addresses.c
index f13a87dfa068..d8ba8ec60c6c 100644
--- a/scripts/dtc/libfdt/fdt_addresses.c
+++ b/scripts/dtc/libfdt/fdt_addresses.c
@@ -1,53 +1,8 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2014 David Gibson <david@gibson.dropbear.id.au> 4 * Copyright (C) 2014 David Gibson <david@gibson.dropbear.id.au>
4 * Copyright (C) 2018 embedded brains GmbH 5 * Copyright (C) 2018 embedded brains GmbH
5 *
6 * libfdt is dual licensed: you can use it either under the terms of
7 * the GPL, or the BSD license, at your option.
8 *
9 * a) This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of the
12 * License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this library; if not, write to the Free
21 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
22 * MA 02110-1301 USA
23 *
24 * Alternatively,
25 *
26 * b) Redistribution and use in source and binary forms, with or
27 * without modification, are permitted provided that the following
28 * conditions are met:
29 *
30 * 1. Redistributions of source code must retain the above
31 * copyright notice, this list of conditions and the following
32 * disclaimer.
33 * 2. Redistributions in binary form must reproduce the above
34 * copyright notice, this list of conditions and the following
35 * disclaimer in the documentation and/or other materials
36 * provided with the distribution.
37 *
38 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
39 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
40 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
41 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
42 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
43 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
48 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
49 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
50 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 */ 6 */
52#include "libfdt_env.h" 7#include "libfdt_env.h"
53 8
@@ -95,3 +50,50 @@ int fdt_size_cells(const void *fdt, int nodeoffset)
95 return 1; 50 return 1;
96 return val; 51 return val;
97} 52}
53
54/* This function assumes that [address|size]_cells is 1 or 2 */
55int fdt_appendprop_addrrange(void *fdt, int parent, int nodeoffset,
56 const char *name, uint64_t addr, uint64_t size)
57{
58 int addr_cells, size_cells, ret;
59 uint8_t data[sizeof(fdt64_t) * 2], *prop;
60
61 ret = fdt_address_cells(fdt, parent);
62 if (ret < 0)
63 return ret;
64 addr_cells = ret;
65
66 ret = fdt_size_cells(fdt, parent);
67 if (ret < 0)
68 return ret;
69 size_cells = ret;
70
71 /* check validity of address */
72 prop = data;
73 if (addr_cells == 1) {
74 if ((addr > UINT32_MAX) || ((UINT32_MAX + 1 - addr) < size))
75 return -FDT_ERR_BADVALUE;
76
77 fdt32_st(prop, (uint32_t)addr);
78 } else if (addr_cells == 2) {
79 fdt64_st(prop, addr);
80 } else {
81 return -FDT_ERR_BADNCELLS;
82 }
83
84 /* check validity of size */
85 prop += addr_cells * sizeof(fdt32_t);
86 if (size_cells == 1) {
87 if (size > UINT32_MAX)
88 return -FDT_ERR_BADVALUE;
89
90 fdt32_st(prop, (uint32_t)size);
91 } else if (size_cells == 2) {
92 fdt64_st(prop, size);
93 } else {
94 return -FDT_ERR_BADNCELLS;
95 }
96
97 return fdt_appendprop(fdt, nodeoffset, name, data,
98 (addr_cells + size_cells) * sizeof(fdt32_t));
99}
diff --git a/scripts/dtc/libfdt/fdt_empty_tree.c b/scripts/dtc/libfdt/fdt_empty_tree.c
index f2ae9b77c285..49d54d44b8e7 100644
--- a/scripts/dtc/libfdt/fdt_empty_tree.c
+++ b/scripts/dtc/libfdt/fdt_empty_tree.c
@@ -1,52 +1,7 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2012 David Gibson, IBM Corporation. 4 * Copyright (C) 2012 David Gibson, IBM Corporation.
4 *
5 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 *
8 * a) This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 * MA 02110-1301 USA
22 *
23 * Alternatively,
24 *
25 * b) Redistribution and use in source and binary forms, with or
26 * without modification, are permitted provided that the following
27 * conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer.
32 * 2. Redistributions in binary form must reproduce the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer in the documentation and/or other materials
35 * provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 */ 5 */
51#include "libfdt_env.h" 6#include "libfdt_env.h"
52 7
diff --git a/scripts/dtc/libfdt/fdt_overlay.c b/scripts/dtc/libfdt/fdt_overlay.c
index 5fdab6c6371d..e97f12b1a780 100644
--- a/scripts/dtc/libfdt/fdt_overlay.c
+++ b/scripts/dtc/libfdt/fdt_overlay.c
@@ -1,53 +1,8 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2016 Free Electrons 4 * Copyright (C) 2016 Free Electrons
4 * Copyright (C) 2016 NextThing Co. 5 * Copyright (C) 2016 NextThing Co.
5 *
6 * libfdt is dual licensed: you can use it either under the terms of
7 * the GPL, or the BSD license, at your option.
8 *
9 * a) This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License as
11 * published by the Free Software Foundation; either version 2 of the
12 * License, or (at your option) any later version.
13 *
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public
20 * License along with this library; if not, write to the Free
21 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
22 * MA 02110-1301 USA
23 *
24 * Alternatively,
25 *
26 * b) Redistribution and use in source and binary forms, with or
27 * without modification, are permitted provided that the following
28 * conditions are met:
29 *
30 * 1. Redistributions of source code must retain the above
31 * copyright notice, this list of conditions and the following
32 * disclaimer.
33 * 2. Redistributions in binary form must reproduce the above
34 * copyright notice, this list of conditions and the following
35 * disclaimer in the documentation and/or other materials
36 * provided with the distribution.
37 *
38 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
39 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
40 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
41 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
42 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
43 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
48 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
49 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
50 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
51 */ 6 */
52#include "libfdt_env.h" 7#include "libfdt_env.h"
53 8
@@ -93,11 +48,11 @@ static uint32_t overlay_get_target_phandle(const void *fdto, int fragment)
93 * @pathp: pointer which receives the path of the target (or NULL) 48 * @pathp: pointer which receives the path of the target (or NULL)
94 * 49 *
95 * overlay_get_target() retrieves the target offset in the base 50 * overlay_get_target() retrieves the target offset in the base
96 * device tree of a fragment, no matter how the actual targetting is 51 * device tree of a fragment, no matter how the actual targeting is
97 * done (through a phandle or a path) 52 * done (through a phandle or a path)
98 * 53 *
99 * returns: 54 * returns:
100 * the targetted node offset in the base device tree 55 * the targeted node offset in the base device tree
101 * Negative error code on error 56 * Negative error code on error
102 */ 57 */
103static int overlay_get_target(const void *fdt, const void *fdto, 58static int overlay_get_target(const void *fdt, const void *fdto,
@@ -863,12 +818,16 @@ static int overlay_symbol_update(void *fdt, void *fdto)
863 818
864int fdt_overlay_apply(void *fdt, void *fdto) 819int fdt_overlay_apply(void *fdt, void *fdto)
865{ 820{
866 uint32_t delta = fdt_get_max_phandle(fdt); 821 uint32_t delta;
867 int ret; 822 int ret;
868 823
869 FDT_RO_PROBE(fdt); 824 FDT_RO_PROBE(fdt);
870 FDT_RO_PROBE(fdto); 825 FDT_RO_PROBE(fdto);
871 826
827 ret = fdt_find_max_phandle(fdt, &delta);
828 if (ret)
829 goto err;
830
872 ret = overlay_adjust_local_phandles(fdto, delta); 831 ret = overlay_adjust_local_phandles(fdto, delta);
873 if (ret) 832 if (ret)
874 goto err; 833 goto err;
diff --git a/scripts/dtc/libfdt/fdt_ro.c b/scripts/dtc/libfdt/fdt_ro.c
index eafc14282892..6fd9ec170dbe 100644
--- a/scripts/dtc/libfdt/fdt_ro.c
+++ b/scripts/dtc/libfdt/fdt_ro.c
@@ -1,52 +1,7 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2006 David Gibson, IBM Corporation. 4 * Copyright (C) 2006 David Gibson, IBM Corporation.
4 *
5 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 *
8 * a) This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 * MA 02110-1301 USA
22 *
23 * Alternatively,
24 *
25 * b) Redistribution and use in source and binary forms, with or
26 * without modification, are permitted provided that the following
27 * conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer.
32 * 2. Redistributions in binary form must reproduce the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer in the documentation and/or other materials
35 * provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 */ 5 */
51#include "libfdt_env.h" 6#include "libfdt_env.h"
52 7
@@ -144,29 +99,49 @@ static int fdt_string_eq_(const void *fdt, int stroffset,
144 return p && (slen == len) && (memcmp(p, s, len) == 0); 99 return p && (slen == len) && (memcmp(p, s, len) == 0);
145} 100}
146 101
147uint32_t fdt_get_max_phandle(const void *fdt) 102int fdt_find_max_phandle(const void *fdt, uint32_t *phandle)
148{ 103{
149 uint32_t max_phandle = 0; 104 uint32_t max = 0;
150 int offset; 105 int offset = -1;
151 106
152 for (offset = fdt_next_node(fdt, -1, NULL);; 107 while (true) {
153 offset = fdt_next_node(fdt, offset, NULL)) { 108 uint32_t value;
154 uint32_t phandle;
155 109
156 if (offset == -FDT_ERR_NOTFOUND) 110 offset = fdt_next_node(fdt, offset, NULL);
157 return max_phandle; 111 if (offset < 0) {
112 if (offset == -FDT_ERR_NOTFOUND)
113 break;
158 114
159 if (offset < 0) 115 return offset;
160 return (uint32_t)-1; 116 }
161 117
162 phandle = fdt_get_phandle(fdt, offset); 118 value = fdt_get_phandle(fdt, offset);
163 if (phandle == (uint32_t)-1)
164 continue;
165 119
166 if (phandle > max_phandle) 120 if (value > max)
167 max_phandle = phandle; 121 max = value;
168 } 122 }
169 123
124 if (phandle)
125 *phandle = max;
126
127 return 0;
128}
129
130int fdt_generate_phandle(const void *fdt, uint32_t *phandle)
131{
132 uint32_t max;
133 int err;
134
135 err = fdt_find_max_phandle(fdt, &max);
136 if (err < 0)
137 return err;
138
139 if (max == FDT_MAX_PHANDLE)
140 return -FDT_ERR_NOPHANDLES;
141
142 if (phandle)
143 *phandle = max + 1;
144
170 return 0; 145 return 0;
171} 146}
172 147
diff --git a/scripts/dtc/libfdt/fdt_rw.c b/scripts/dtc/libfdt/fdt_rw.c
index 2e49855d7cf8..8795947c00dd 100644
--- a/scripts/dtc/libfdt/fdt_rw.c
+++ b/scripts/dtc/libfdt/fdt_rw.c
@@ -1,52 +1,7 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2006 David Gibson, IBM Corporation. 4 * Copyright (C) 2006 David Gibson, IBM Corporation.
4 *
5 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 *
8 * a) This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 * MA 02110-1301 USA
22 *
23 * Alternatively,
24 *
25 * b) Redistribution and use in source and binary forms, with or
26 * without modification, are permitted provided that the following
27 * conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer.
32 * 2. Redistributions in binary form must reproduce the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer in the documentation and/or other materials
35 * provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 */ 5 */
51#include "libfdt_env.h" 6#include "libfdt_env.h"
52 7
@@ -136,6 +91,14 @@ static int fdt_splice_struct_(void *fdt, void *p,
136 return 0; 91 return 0;
137} 92}
138 93
94/* Must only be used to roll back in case of error */
95static void fdt_del_last_string_(void *fdt, const char *s)
96{
97 int newlen = strlen(s) + 1;
98
99 fdt_set_size_dt_strings(fdt, fdt_size_dt_strings(fdt) - newlen);
100}
101
139static int fdt_splice_string_(void *fdt, int newlen) 102static int fdt_splice_string_(void *fdt, int newlen)
140{ 103{
141 void *p = (char *)fdt 104 void *p = (char *)fdt
@@ -149,7 +112,7 @@ static int fdt_splice_string_(void *fdt, int newlen)
149 return 0; 112 return 0;
150} 113}
151 114
152static int fdt_find_add_string_(void *fdt, const char *s) 115static int fdt_find_add_string_(void *fdt, const char *s, int *allocated)
153{ 116{
154 char *strtab = (char *)fdt + fdt_off_dt_strings(fdt); 117 char *strtab = (char *)fdt + fdt_off_dt_strings(fdt);
155 const char *p; 118 const char *p;
@@ -157,6 +120,8 @@ static int fdt_find_add_string_(void *fdt, const char *s)
157 int len = strlen(s) + 1; 120 int len = strlen(s) + 1;
158 int err; 121 int err;
159 122
123 *allocated = 0;
124
160 p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s); 125 p = fdt_find_string_(strtab, fdt_size_dt_strings(fdt), s);
161 if (p) 126 if (p)
162 /* found it */ 127 /* found it */
@@ -167,6 +132,8 @@ static int fdt_find_add_string_(void *fdt, const char *s)
167 if (err) 132 if (err)
168 return err; 133 return err;
169 134
135 *allocated = 1;
136
170 memcpy(new, s, len); 137 memcpy(new, s, len);
171 return (new - strtab); 138 return (new - strtab);
172} 139}
@@ -225,11 +192,12 @@ static int fdt_add_property_(void *fdt, int nodeoffset, const char *name,
225 int nextoffset; 192 int nextoffset;
226 int namestroff; 193 int namestroff;
227 int err; 194 int err;
195 int allocated;
228 196
229 if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0) 197 if ((nextoffset = fdt_check_node_offset_(fdt, nodeoffset)) < 0)
230 return nextoffset; 198 return nextoffset;
231 199
232 namestroff = fdt_find_add_string_(fdt, name); 200 namestroff = fdt_find_add_string_(fdt, name, &allocated);
233 if (namestroff < 0) 201 if (namestroff < 0)
234 return namestroff; 202 return namestroff;
235 203
@@ -237,8 +205,11 @@ static int fdt_add_property_(void *fdt, int nodeoffset, const char *name,
237 proplen = sizeof(**prop) + FDT_TAGALIGN(len); 205 proplen = sizeof(**prop) + FDT_TAGALIGN(len);
238 206
239 err = fdt_splice_struct_(fdt, *prop, 0, proplen); 207 err = fdt_splice_struct_(fdt, *prop, 0, proplen);
240 if (err) 208 if (err) {
209 if (allocated)
210 fdt_del_last_string_(fdt, name);
241 return err; 211 return err;
212 }
242 213
243 (*prop)->tag = cpu_to_fdt32(FDT_PROP); 214 (*prop)->tag = cpu_to_fdt32(FDT_PROP);
244 (*prop)->nameoff = cpu_to_fdt32(namestroff); 215 (*prop)->nameoff = cpu_to_fdt32(namestroff);
diff --git a/scripts/dtc/libfdt/fdt_strerror.c b/scripts/dtc/libfdt/fdt_strerror.c
index 9677a1887e57..768db66eada5 100644
--- a/scripts/dtc/libfdt/fdt_strerror.c
+++ b/scripts/dtc/libfdt/fdt_strerror.c
@@ -1,51 +1,7 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2006 David Gibson, IBM Corporation. 4 * Copyright (C) 2006 David Gibson, IBM Corporation.
4 *
5 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 *
8 * a) This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 * MA 02110-1301 USA
22 *
23 * Alternatively,
24 *
25 * b) Redistribution and use in source and binary forms, with or
26 * without modification, are permitted provided that the following
27 * conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer.
32 * 2. Redistributions in binary form must reproduce the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer in the documentation and/or other materials
35 * provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 5 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 */ 6 */
51#include "libfdt_env.h" 7#include "libfdt_env.h"
@@ -82,6 +38,7 @@ static struct fdt_errtabent fdt_errtable[] = {
82 FDT_ERRTABENT(FDT_ERR_BADVALUE), 38 FDT_ERRTABENT(FDT_ERR_BADVALUE),
83 FDT_ERRTABENT(FDT_ERR_BADOVERLAY), 39 FDT_ERRTABENT(FDT_ERR_BADOVERLAY),
84 FDT_ERRTABENT(FDT_ERR_NOPHANDLES), 40 FDT_ERRTABENT(FDT_ERR_NOPHANDLES),
41 FDT_ERRTABENT(FDT_ERR_BADFLAGS),
85}; 42};
86#define FDT_ERRTABSIZE (sizeof(fdt_errtable) / sizeof(fdt_errtable[0])) 43#define FDT_ERRTABSIZE (sizeof(fdt_errtable) / sizeof(fdt_errtable[0]))
87 44
diff --git a/scripts/dtc/libfdt/fdt_sw.c b/scripts/dtc/libfdt/fdt_sw.c
index 9fa4a94d83c3..76bea22f734f 100644
--- a/scripts/dtc/libfdt/fdt_sw.c
+++ b/scripts/dtc/libfdt/fdt_sw.c
@@ -1,52 +1,7 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2006 David Gibson, IBM Corporation. 4 * Copyright (C) 2006 David Gibson, IBM Corporation.
4 *
5 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 *
8 * a) This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 * MA 02110-1301 USA
22 *
23 * Alternatively,
24 *
25 * b) Redistribution and use in source and binary forms, with or
26 * without modification, are permitted provided that the following
27 * conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer.
32 * 2. Redistributions in binary form must reproduce the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer in the documentation and/or other materials
35 * provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 */ 5 */
51#include "libfdt_env.h" 6#include "libfdt_env.h"
52 7
@@ -121,6 +76,12 @@ static int fdt_sw_probe_struct_(void *fdt)
121 return err; \ 76 return err; \
122 } 77 }
123 78
79static inline uint32_t sw_flags(void *fdt)
80{
81 /* assert: (fdt_magic(fdt) == FDT_SW_MAGIC) */
82 return fdt_last_comp_version(fdt);
83}
84
124/* 'complete' state: Enter this state after fdt_finish() 85/* 'complete' state: Enter this state after fdt_finish()
125 * 86 *
126 * Allowed functions: none 87 * Allowed functions: none
@@ -141,7 +102,7 @@ static void *fdt_grab_space_(void *fdt, size_t len)
141 return fdt_offset_ptr_w_(fdt, offset); 102 return fdt_offset_ptr_w_(fdt, offset);
142} 103}
143 104
144int fdt_create(void *buf, int bufsize) 105int fdt_create_with_flags(void *buf, int bufsize, uint32_t flags)
145{ 106{
146 const size_t hdrsize = FDT_ALIGN(sizeof(struct fdt_header), 107 const size_t hdrsize = FDT_ALIGN(sizeof(struct fdt_header),
147 sizeof(struct fdt_reserve_entry)); 108 sizeof(struct fdt_reserve_entry));
@@ -150,11 +111,22 @@ int fdt_create(void *buf, int bufsize)
150 if (bufsize < hdrsize) 111 if (bufsize < hdrsize)
151 return -FDT_ERR_NOSPACE; 112 return -FDT_ERR_NOSPACE;
152 113
114 if (flags & ~FDT_CREATE_FLAGS_ALL)
115 return -FDT_ERR_BADFLAGS;
116
153 memset(buf, 0, bufsize); 117 memset(buf, 0, bufsize);
154 118
119 /*
120 * magic and last_comp_version keep intermediate state during the fdt
121 * creation process, which is replaced with the proper FDT format by
122 * fdt_finish().
123 *
124 * flags should be accessed with sw_flags().
125 */
155 fdt_set_magic(fdt, FDT_SW_MAGIC); 126 fdt_set_magic(fdt, FDT_SW_MAGIC);
156 fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION); 127 fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION);
157 fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION); 128 fdt_set_last_comp_version(fdt, flags);
129
158 fdt_set_totalsize(fdt, bufsize); 130 fdt_set_totalsize(fdt, bufsize);
159 131
160 fdt_set_off_mem_rsvmap(fdt, hdrsize); 132 fdt_set_off_mem_rsvmap(fdt, hdrsize);
@@ -164,6 +136,11 @@ int fdt_create(void *buf, int bufsize)
164 return 0; 136 return 0;
165} 137}
166 138
139int fdt_create(void *buf, int bufsize)
140{
141 return fdt_create_with_flags(buf, bufsize, 0);
142}
143
167int fdt_resize(void *fdt, void *buf, int bufsize) 144int fdt_resize(void *fdt, void *buf, int bufsize)
168{ 145{
169 size_t headsize, tailsize; 146 size_t headsize, tailsize;
@@ -262,19 +239,13 @@ int fdt_end_node(void *fdt)
262 return 0; 239 return 0;
263} 240}
264 241
265static int fdt_find_add_string_(void *fdt, const char *s) 242static int fdt_add_string_(void *fdt, const char *s)
266{ 243{
267 char *strtab = (char *)fdt + fdt_totalsize(fdt); 244 char *strtab = (char *)fdt + fdt_totalsize(fdt);
268 const char *p;
269 int strtabsize = fdt_size_dt_strings(fdt); 245 int strtabsize = fdt_size_dt_strings(fdt);
270 int len = strlen(s) + 1; 246 int len = strlen(s) + 1;
271 int struct_top, offset; 247 int struct_top, offset;
272 248
273 p = fdt_find_string_(strtab - strtabsize, strtabsize, s);
274 if (p)
275 return p - strtab;
276
277 /* Add it */
278 offset = -strtabsize - len; 249 offset = -strtabsize - len;
279 struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt); 250 struct_top = fdt_off_dt_struct(fdt) + fdt_size_dt_struct(fdt);
280 if (fdt_totalsize(fdt) + offset < struct_top) 251 if (fdt_totalsize(fdt) + offset < struct_top)
@@ -285,20 +256,56 @@ static int fdt_find_add_string_(void *fdt, const char *s)
285 return offset; 256 return offset;
286} 257}
287 258
259/* Must only be used to roll back in case of error */
260static void fdt_del_last_string_(void *fdt, const char *s)
261{
262 int strtabsize = fdt_size_dt_strings(fdt);
263 int len = strlen(s) + 1;
264
265 fdt_set_size_dt_strings(fdt, strtabsize - len);
266}
267
268static int fdt_find_add_string_(void *fdt, const char *s, int *allocated)
269{
270 char *strtab = (char *)fdt + fdt_totalsize(fdt);
271 int strtabsize = fdt_size_dt_strings(fdt);
272 const char *p;
273
274 *allocated = 0;
275
276 p = fdt_find_string_(strtab - strtabsize, strtabsize, s);
277 if (p)
278 return p - strtab;
279
280 *allocated = 1;
281
282 return fdt_add_string_(fdt, s);
283}
284
288int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp) 285int fdt_property_placeholder(void *fdt, const char *name, int len, void **valp)
289{ 286{
290 struct fdt_property *prop; 287 struct fdt_property *prop;
291 int nameoff; 288 int nameoff;
289 int allocated;
292 290
293 FDT_SW_PROBE_STRUCT(fdt); 291 FDT_SW_PROBE_STRUCT(fdt);
294 292
295 nameoff = fdt_find_add_string_(fdt, name); 293 /* String de-duplication can be slow, _NO_NAME_DEDUP skips it */
294 if (sw_flags(fdt) & FDT_CREATE_FLAG_NO_NAME_DEDUP) {
295 allocated = 1;
296 nameoff = fdt_add_string_(fdt, name);
297 } else {
298 nameoff = fdt_find_add_string_(fdt, name, &allocated);
299 }
296 if (nameoff == 0) 300 if (nameoff == 0)
297 return -FDT_ERR_NOSPACE; 301 return -FDT_ERR_NOSPACE;
298 302
299 prop = fdt_grab_space_(fdt, sizeof(*prop) + FDT_TAGALIGN(len)); 303 prop = fdt_grab_space_(fdt, sizeof(*prop) + FDT_TAGALIGN(len));
300 if (! prop) 304 if (! prop) {
305 if (allocated)
306 fdt_del_last_string_(fdt, name);
301 return -FDT_ERR_NOSPACE; 307 return -FDT_ERR_NOSPACE;
308 }
302 309
303 prop->tag = cpu_to_fdt32(FDT_PROP); 310 prop->tag = cpu_to_fdt32(FDT_PROP);
304 prop->nameoff = cpu_to_fdt32(nameoff); 311 prop->nameoff = cpu_to_fdt32(nameoff);
@@ -360,6 +367,10 @@ int fdt_finish(void *fdt)
360 367
361 /* Finally, adjust the header */ 368 /* Finally, adjust the header */
362 fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt)); 369 fdt_set_totalsize(fdt, newstroffset + fdt_size_dt_strings(fdt));
370
371 /* And fix up fields that were keeping intermediate state. */
372 fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
363 fdt_set_magic(fdt, FDT_MAGIC); 373 fdt_set_magic(fdt, FDT_MAGIC);
374
364 return 0; 375 return 0;
365} 376}
diff --git a/scripts/dtc/libfdt/fdt_wip.c b/scripts/dtc/libfdt/fdt_wip.c
index 534c1cbbb2f3..f64139e0b3dc 100644
--- a/scripts/dtc/libfdt/fdt_wip.c
+++ b/scripts/dtc/libfdt/fdt_wip.c
@@ -1,52 +1,7 @@
1// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
1/* 2/*
2 * libfdt - Flat Device Tree manipulation 3 * libfdt - Flat Device Tree manipulation
3 * Copyright (C) 2006 David Gibson, IBM Corporation. 4 * Copyright (C) 2006 David Gibson, IBM Corporation.
4 *
5 * libfdt is dual licensed: you can use it either under the terms of
6 * the GPL, or the BSD license, at your option.
7 *
8 * a) This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public
19 * License along with this library; if not, write to the Free
20 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
21 * MA 02110-1301 USA
22 *
23 * Alternatively,
24 *
25 * b) Redistribution and use in source and binary forms, with or
26 * without modification, are permitted provided that the following
27 * conditions are met:
28 *
29 * 1. Redistributions of source code must retain the above
30 * copyright notice, this list of conditions and the following
31 * disclaimer.
32 * 2. Redistributions in binary form must reproduce the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer in the documentation and/or other materials
35 * provided with the distribution.
36 *
37 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
38 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
39 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
40 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
41 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
42 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
47 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
48 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
49 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
50 */ 5 */
51#include "libfdt_env.h" 6#include "libfdt_env.h"
52 7
diff --git a/scripts/dtc/libfdt/libfdt.h b/scripts/dtc/libfdt/libfdt.h
index 627da2e079c9..7b5ffd13a887 100644
--- a/scripts/dtc/libfdt/libfdt.h
+++ b/scripts/dtc/libfdt/libfdt.h
@@ -1,54 +1,9 @@
1/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */
1#ifndef LIBFDT_H 2#ifndef LIBFDT_H
2#define LIBFDT_H 3#define LIBFDT_H
3/* 4/*
4 * libfdt - Flat Device Tree manipulation 5 * libfdt - Flat Device Tree manipulation
5 * Copyright (C) 2006 David Gibson, IBM Corporation. 6 * Copyright (C) 2006 David Gibson, IBM Corporation.
6 *
7 * libfdt is dual licensed: you can use it either under the terms of
8 * the GPL, or the BSD license, at your option.
9 *
10 * a) This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of the
13 * License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public
21 * License along with this library; if not, write to the Free
22 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
23 * MA 02110-1301 USA
24 *
25 * Alternatively,
26 *
27 * b) Redistribution and use in source and binary forms, with or
28 * without modification, are permitted provided that the following
29 * conditions are met:
30 *
31 * 1. Redistributions of source code must retain the above
32 * copyright notice, this list of conditions and the following
33 * disclaimer.
34 * 2. Redistributions in binary form must reproduce the above
35 * copyright notice, this list of conditions and the following
36 * disclaimer in the documentation and/or other materials
37 * provided with the distribution.
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
40 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
41 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
42 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
43 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
44 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
49 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
50 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
51 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 */ 7 */
53 8
54#include "libfdt_env.h" 9#include "libfdt_env.h"
@@ -138,7 +93,15 @@
138 /* FDT_ERR_NOPHANDLES: The device tree doesn't have any 93 /* FDT_ERR_NOPHANDLES: The device tree doesn't have any
139 * phandle available anymore without causing an overflow */ 94 * phandle available anymore without causing an overflow */
140 95
141#define FDT_ERR_MAX 17 96#define FDT_ERR_BADFLAGS 18
97 /* FDT_ERR_BADFLAGS: The function was passed a flags field that
98 * contains invalid flags or an invalid combination of flags. */
99
100#define FDT_ERR_MAX 18
101
102/* constants */
103#define FDT_MAX_PHANDLE 0xfffffffe
104 /* Valid values for phandles range from 1 to 2^32-2. */
142 105
143/**********************************************************************/ 106/**********************************************************************/
144/* Low-level functions (you probably don't need these) */ 107/* Low-level functions (you probably don't need these) */
@@ -171,6 +134,16 @@ static inline uint32_t fdt32_ld(const fdt32_t *p)
171 | bp[3]; 134 | bp[3];
172} 135}
173 136
137static inline void fdt32_st(void *property, uint32_t value)
138{
139 uint8_t *bp = property;
140
141 bp[0] = value >> 24;
142 bp[1] = (value >> 16) & 0xff;
143 bp[2] = (value >> 8) & 0xff;
144 bp[3] = value & 0xff;
145}
146
174static inline uint64_t fdt64_ld(const fdt64_t *p) 147static inline uint64_t fdt64_ld(const fdt64_t *p)
175{ 148{
176 const uint8_t *bp = (const uint8_t *)p; 149 const uint8_t *bp = (const uint8_t *)p;
@@ -185,6 +158,20 @@ static inline uint64_t fdt64_ld(const fdt64_t *p)
185 | bp[7]; 158 | bp[7];
186} 159}
187 160
161static inline void fdt64_st(void *property, uint64_t value)
162{
163 uint8_t *bp = property;
164
165 bp[0] = value >> 56;
166 bp[1] = (value >> 48) & 0xff;
167 bp[2] = (value >> 40) & 0xff;
168 bp[3] = (value >> 32) & 0xff;
169 bp[4] = (value >> 24) & 0xff;
170 bp[5] = (value >> 16) & 0xff;
171 bp[6] = (value >> 8) & 0xff;
172 bp[7] = value & 0xff;
173}
174
188/**********************************************************************/ 175/**********************************************************************/
189/* Traversal functions */ 176/* Traversal functions */
190/**********************************************************************/ 177/**********************************************************************/
@@ -227,7 +214,7 @@ int fdt_next_subnode(const void *fdt, int offset);
227 * ... 214 * ...
228 * } 215 * }
229 * 216 *
230 * if ((node < 0) && (node != -FDT_ERR_NOT_FOUND)) { 217 * if ((node < 0) && (node != -FDT_ERR_NOTFOUND)) {
231 * Error handling 218 * Error handling
232 * } 219 * }
233 * 220 *
@@ -362,6 +349,20 @@ const char *fdt_get_string(const void *fdt, int stroffset, int *lenp);
362const char *fdt_string(const void *fdt, int stroffset); 349const char *fdt_string(const void *fdt, int stroffset);
363 350
364/** 351/**
352 * fdt_find_max_phandle - find and return the highest phandle in a tree
353 * @fdt: pointer to the device tree blob
354 * @phandle: return location for the highest phandle value found in the tree
355 *
356 * fdt_find_max_phandle() finds the highest phandle value in the given device
357 * tree. The value returned in @phandle is only valid if the function returns
358 * success.
359 *
360 * returns:
361 * 0 on success or a negative error code on failure
362 */
363int fdt_find_max_phandle(const void *fdt, uint32_t *phandle);
364
365/**
365 * fdt_get_max_phandle - retrieves the highest phandle in a tree 366 * fdt_get_max_phandle - retrieves the highest phandle in a tree
366 * @fdt: pointer to the device tree blob 367 * @fdt: pointer to the device tree blob
367 * 368 *
@@ -369,12 +370,39 @@ const char *fdt_string(const void *fdt, int stroffset);
369 * device tree. This will ignore badly formatted phandles, or phandles 370 * device tree. This will ignore badly formatted phandles, or phandles
370 * with a value of 0 or -1. 371 * with a value of 0 or -1.
371 * 372 *
373 * This function is deprecated in favour of fdt_find_max_phandle().
374 *
372 * returns: 375 * returns:
373 * the highest phandle on success 376 * the highest phandle on success
374 * 0, if no phandle was found in the device tree 377 * 0, if no phandle was found in the device tree
375 * -1, if an error occurred 378 * -1, if an error occurred
376 */ 379 */
377uint32_t fdt_get_max_phandle(const void *fdt); 380static inline uint32_t fdt_get_max_phandle(const void *fdt)
381{
382 uint32_t phandle;
383 int err;
384
385 err = fdt_find_max_phandle(fdt, &phandle);
386 if (err < 0)
387 return (uint32_t)-1;
388
389 return phandle;
390}
391
392/**
393 * fdt_generate_phandle - return a new, unused phandle for a device tree blob
394 * @fdt: pointer to the device tree blob
395 * @phandle: return location for the new phandle
396 *
397 * Walks the device tree blob and looks for the highest phandle value. On
398 * success, the new, unused phandle value (one higher than the previously
399 * highest phandle value in the device tree blob) will be returned in the
400 * @phandle parameter.
401 *
402 * Returns:
403 * 0 on success or a negative error-code on failure
404 */
405int fdt_generate_phandle(const void *fdt, uint32_t *phandle);
378 406
379/** 407/**
380 * fdt_num_mem_rsv - retrieve the number of memory reserve map entries 408 * fdt_num_mem_rsv - retrieve the number of memory reserve map entries
@@ -566,7 +594,7 @@ int fdt_next_property_offset(const void *fdt, int offset);
566 * ... 594 * ...
567 * } 595 * }
568 * 596 *
569 * if ((property < 0) && (property != -FDT_ERR_NOT_FOUND)) { 597 * if ((property < 0) && (property != -FDT_ERR_NOTFOUND)) {
570 * Error handling 598 * Error handling
571 * } 599 * }
572 * 600 *
@@ -669,7 +697,7 @@ static inline struct fdt_property *fdt_get_property_w(void *fdt, int nodeoffset,
669/** 697/**
670 * fdt_getprop_by_offset - retrieve the value of a property at a given offset 698 * fdt_getprop_by_offset - retrieve the value of a property at a given offset
671 * @fdt: pointer to the device tree blob 699 * @fdt: pointer to the device tree blob
672 * @ffset: offset of the property to read 700 * @offset: offset of the property to read
673 * @namep: pointer to a string variable (will be overwritten) or NULL 701 * @namep: pointer to a string variable (will be overwritten) or NULL
674 * @lenp: pointer to an integer variable (will be overwritten) or NULL 702 * @lenp: pointer to an integer variable (will be overwritten) or NULL
675 * 703 *
@@ -1360,7 +1388,45 @@ int fdt_nop_node(void *fdt, int nodeoffset);
1360/* Sequential write functions */ 1388/* Sequential write functions */
1361/**********************************************************************/ 1389/**********************************************************************/
1362 1390
1391/* fdt_create_with_flags flags */
1392#define FDT_CREATE_FLAG_NO_NAME_DEDUP 0x1
1393 /* FDT_CREATE_FLAG_NO_NAME_DEDUP: Do not try to de-duplicate property
1394 * names in the fdt. This can result in faster creation times, but
1395 * a larger fdt. */
1396
1397#define FDT_CREATE_FLAGS_ALL (FDT_CREATE_FLAG_NO_NAME_DEDUP)
1398
1399/**
1400 * fdt_create_with_flags - begin creation of a new fdt
1401 * @fdt: pointer to memory allocated where fdt will be created
1402 * @bufsize: size of the memory space at fdt
1403 * @flags: a valid combination of FDT_CREATE_FLAG_ flags, or 0.
1404 *
1405 * fdt_create_with_flags() begins the process of creating a new fdt with
1406 * the sequential write interface.
1407 *
1408 * fdt creation process must end with fdt_finished() to produce a valid fdt.
1409 *
1410 * returns:
1411 * 0, on success
1412 * -FDT_ERR_NOSPACE, bufsize is insufficient for a minimal fdt
1413 * -FDT_ERR_BADFLAGS, flags is not valid
1414 */
1415int fdt_create_with_flags(void *buf, int bufsize, uint32_t flags);
1416
1417/**
1418 * fdt_create - begin creation of a new fdt
1419 * @fdt: pointer to memory allocated where fdt will be created
1420 * @bufsize: size of the memory space at fdt
1421 *
1422 * fdt_create() is equivalent to fdt_create_with_flags() with flags=0.
1423 *
1424 * returns:
1425 * 0, on success
1426 * -FDT_ERR_NOSPACE, bufsize is insufficient for a minimal fdt
1427 */
1363int fdt_create(void *buf, int bufsize); 1428int fdt_create(void *buf, int bufsize);
1429
1364int fdt_resize(void *fdt, void *buf, int bufsize); 1430int fdt_resize(void *fdt, void *buf, int bufsize);
1365int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size); 1431int fdt_add_reservemap_entry(void *fdt, uint64_t addr, uint64_t size);
1366int fdt_finish_reservemap(void *fdt); 1432int fdt_finish_reservemap(void *fdt);
@@ -1832,6 +1898,43 @@ static inline int fdt_appendprop_cell(void *fdt, int nodeoffset,
1832 fdt_appendprop((fdt), (nodeoffset), (name), (str), strlen(str)+1) 1898 fdt_appendprop((fdt), (nodeoffset), (name), (str), strlen(str)+1)
1833 1899
1834/** 1900/**
1901 * fdt_appendprop_addrrange - append a address range property
1902 * @fdt: pointer to the device tree blob
1903 * @parent: offset of the parent node
1904 * @nodeoffset: offset of the node to add a property at
1905 * @name: name of property
1906 * @addr: start address of a given range
1907 * @size: size of a given range
1908 *
1909 * fdt_appendprop_addrrange() appends an address range value (start
1910 * address and size) to the value of the named property in the given
1911 * node, or creates a new property with that value if it does not
1912 * already exist.
1913 * If "name" is not specified, a default "reg" is used.
1914 * Cell sizes are determined by parent's #address-cells and #size-cells.
1915 *
1916 * This function may insert data into the blob, and will therefore
1917 * change the offsets of some existing nodes.
1918 *
1919 * returns:
1920 * 0, on success
1921 * -FDT_ERR_BADLAYOUT,
1922 * -FDT_ERR_BADMAGIC,
1923 * -FDT_ERR_BADNCELLS, if the node has a badly formatted or invalid
1924 * #address-cells property
1925 * -FDT_ERR_BADOFFSET, nodeoffset did not point to FDT_BEGIN_NODE tag
1926 * -FDT_ERR_BADSTATE,
1927 * -FDT_ERR_BADSTRUCTURE,
1928 * -FDT_ERR_BADVERSION,
1929 * -FDT_ERR_BADVALUE, addr or size doesn't fit to respective cells size
1930 * -FDT_ERR_NOSPACE, there is insufficient free space in the blob to
1931 * contain a new property
1932 * -FDT_ERR_TRUNCATED, standard meanings
1933 */
1934int fdt_appendprop_addrrange(void *fdt, int parent, int nodeoffset,
1935 const char *name, uint64_t addr, uint64_t size);
1936
1937/**
1835 * fdt_delprop - delete a property 1938 * fdt_delprop - delete a property
1836 * @fdt: pointer to the device tree blob 1939 * @fdt: pointer to the device tree blob
1837 * @nodeoffset: offset of the node whose property to nop 1940 * @nodeoffset: offset of the node whose property to nop
diff --git a/scripts/dtc/libfdt/libfdt_env.h b/scripts/dtc/libfdt/libfdt_env.h
index eb2053845c9c..73b6d40450ac 100644
--- a/scripts/dtc/libfdt/libfdt_env.h
+++ b/scripts/dtc/libfdt/libfdt_env.h
@@ -1,57 +1,13 @@
1/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */
1#ifndef LIBFDT_ENV_H 2#ifndef LIBFDT_ENV_H
2#define LIBFDT_ENV_H 3#define LIBFDT_ENV_H
3/* 4/*
4 * libfdt - Flat Device Tree manipulation 5 * libfdt - Flat Device Tree manipulation
5 * Copyright (C) 2006 David Gibson, IBM Corporation. 6 * Copyright (C) 2006 David Gibson, IBM Corporation.
6 * Copyright 2012 Kim Phillips, Freescale Semiconductor. 7 * Copyright 2012 Kim Phillips, Freescale Semiconductor.
7 *
8 * libfdt is dual licensed: you can use it either under the terms of
9 * the GPL, or the BSD license, at your option.
10 *
11 * a) This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License as
13 * published by the Free Software Foundation; either version 2 of the
14 * License, or (at your option) any later version.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public
22 * License along with this library; if not, write to the Free
23 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
24 * MA 02110-1301 USA
25 *
26 * Alternatively,
27 *
28 * b) Redistribution and use in source and binary forms, with or
29 * without modification, are permitted provided that the following
30 * conditions are met:
31 *
32 * 1. Redistributions of source code must retain the above
33 * copyright notice, this list of conditions and the following
34 * disclaimer.
35 * 2. Redistributions in binary form must reproduce the above
36 * copyright notice, this list of conditions and the following
37 * disclaimer in the documentation and/or other materials
38 * provided with the distribution.
39 *
40 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
41 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
42 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
43 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
44 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
45 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
46 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
47 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
48 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
50 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
51 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
52 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53 */ 8 */
54 9
10#include <stdbool.h>
55#include <stddef.h> 11#include <stddef.h>
56#include <stdint.h> 12#include <stdint.h>
57#include <stdlib.h> 13#include <stdlib.h>
diff --git a/scripts/dtc/libfdt/libfdt_internal.h b/scripts/dtc/libfdt/libfdt_internal.h
index 4109f890ae60..7830e550c37a 100644
--- a/scripts/dtc/libfdt/libfdt_internal.h
+++ b/scripts/dtc/libfdt/libfdt_internal.h
@@ -1,54 +1,9 @@
1/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */
1#ifndef LIBFDT_INTERNAL_H 2#ifndef LIBFDT_INTERNAL_H
2#define LIBFDT_INTERNAL_H 3#define LIBFDT_INTERNAL_H
3/* 4/*
4 * libfdt - Flat Device Tree manipulation 5 * libfdt - Flat Device Tree manipulation
5 * Copyright (C) 2006 David Gibson, IBM Corporation. 6 * Copyright (C) 2006 David Gibson, IBM Corporation.
6 *
7 * libfdt is dual licensed: you can use it either under the terms of
8 * the GPL, or the BSD license, at your option.
9 *
10 * a) This library is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License as
12 * published by the Free Software Foundation; either version 2 of the
13 * License, or (at your option) any later version.
14 *
15 * This library is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public
21 * License along with this library; if not, write to the Free
22 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
23 * MA 02110-1301 USA
24 *
25 * Alternatively,
26 *
27 * b) Redistribution and use in source and binary forms, with or
28 * without modification, are permitted provided that the following
29 * conditions are met:
30 *
31 * 1. Redistributions of source code must retain the above
32 * copyright notice, this list of conditions and the following
33 * disclaimer.
34 * 2. Redistributions in binary form must reproduce the above
35 * copyright notice, this list of conditions and the following
36 * disclaimer in the documentation and/or other materials
37 * provided with the distribution.
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
40 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
41 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
42 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
43 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
44 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
46 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
47 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
49 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
50 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
51 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
52 */ 7 */
53#include <fdt.h> 8#include <fdt.h>
54 9
diff --git a/scripts/dtc/livetree.c b/scripts/dtc/livetree.c
index 7a2e6446a17b..0c039993953a 100644
--- a/scripts/dtc/livetree.c
+++ b/scripts/dtc/livetree.c
@@ -1,21 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20 5
21#include "dtc.h" 6#include "dtc.h"
@@ -249,6 +234,7 @@ struct node * add_orphan_node(struct node *dt, struct node *new_node, char *ref)
249 char *name; 234 char *name;
250 235
251 if (ref[0] == '/') { 236 if (ref[0] == '/') {
237 d = data_add_marker(d, TYPE_STRING, ref);
252 d = data_append_data(d, ref, strlen(ref) + 1); 238 d = data_append_data(d, ref, strlen(ref) + 1);
253 239
254 p = build_property("target-path", d, NULL); 240 p = build_property("target-path", d, NULL);
@@ -350,17 +336,20 @@ void delete_node(struct node *node)
350} 336}
351 337
352void append_to_property(struct node *node, 338void append_to_property(struct node *node,
353 char *name, const void *data, int len) 339 char *name, const void *data, int len,
340 enum markertype type)
354{ 341{
355 struct data d; 342 struct data d;
356 struct property *p; 343 struct property *p;
357 344
358 p = get_property(node, name); 345 p = get_property(node, name);
359 if (p) { 346 if (p) {
360 d = data_append_data(p->val, data, len); 347 d = data_add_marker(p->val, type, name);
348 d = data_append_data(d, data, len);
361 p->val = d; 349 p->val = d;
362 } else { 350 } else {
363 d = data_append_data(empty_data, data, len); 351 d = data_add_marker(empty_data, type, name);
352 d = data_append_data(d, data, len);
364 p = build_property(name, d, NULL); 353 p = build_property(name, d, NULL);
365 add_property(node, p); 354 add_property(node, p);
366 } 355 }
@@ -858,8 +847,8 @@ static void generate_label_tree_internal(struct dt_info *dti,
858 847
859 /* insert it */ 848 /* insert it */
860 p = build_property(l->label, 849 p = build_property(l->label,
861 data_copy_mem(node->fullpath, 850 data_copy_escape_string(node->fullpath,
862 strlen(node->fullpath) + 1), 851 strlen(node->fullpath)),
863 NULL); 852 NULL);
864 add_property(an, p); 853 add_property(an, p);
865 } 854 }
@@ -910,7 +899,7 @@ static void add_fixup_entry(struct dt_info *dti, struct node *fn,
910 899
911 xasprintf(&entry, "%s:%s:%u", 900 xasprintf(&entry, "%s:%s:%u",
912 node->fullpath, prop->name, m->offset); 901 node->fullpath, prop->name, m->offset);
913 append_to_property(fn, m->ref, entry, strlen(entry) + 1); 902 append_to_property(fn, m->ref, entry, strlen(entry) + 1, TYPE_STRING);
914 903
915 free(entry); 904 free(entry);
916} 905}
@@ -970,7 +959,7 @@ static void add_local_fixup_entry(struct dt_info *dti,
970 char **compp; 959 char **compp;
971 int i, depth; 960 int i, depth;
972 961
973 /* walk back retreiving depth */ 962 /* walk back retrieving depth */
974 depth = 0; 963 depth = 0;
975 for (wn = node; wn; wn = wn->parent) 964 for (wn = node; wn; wn = wn->parent)
976 depth++; 965 depth++;
@@ -993,7 +982,7 @@ static void add_local_fixup_entry(struct dt_info *dti,
993 free(compp); 982 free(compp);
994 983
995 value_32 = cpu_to_fdt32(m->offset); 984 value_32 = cpu_to_fdt32(m->offset);
996 append_to_property(wn, prop->name, &value_32, sizeof(value_32)); 985 append_to_property(wn, prop->name, &value_32, sizeof(value_32), TYPE_UINT32);
997} 986}
998 987
999static void generate_local_fixups_tree_internal(struct dt_info *dti, 988static void generate_local_fixups_tree_internal(struct dt_info *dti,
diff --git a/scripts/dtc/srcpos.c b/scripts/dtc/srcpos.c
index 41f83700ee91..f5205fb9c1ff 100644
--- a/scripts/dtc/srcpos.c
+++ b/scripts/dtc/srcpos.c
@@ -1,20 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc. 3 * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
17 * USA
18 */ 4 */
19 5
20#define _GNU_SOURCE 6#define _GNU_SOURCE
diff --git a/scripts/dtc/srcpos.h b/scripts/dtc/srcpos.h
index 6326a952c40e..4318d7ad34d9 100644
--- a/scripts/dtc/srcpos.h
+++ b/scripts/dtc/srcpos.h
@@ -1,20 +1,6 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
1/* 2/*
2 * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc. 3 * Copyright 2007 Jon Loeliger, Freescale Semiconductor, Inc.
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
17 * USA
18 */ 4 */
19 5
20#ifndef SRCPOS_H 6#ifndef SRCPOS_H
diff --git a/scripts/dtc/treesource.c b/scripts/dtc/treesource.c
index 1af36628b75f..c9d980c8abfc 100644
--- a/scripts/dtc/treesource.c
+++ b/scripts/dtc/treesource.c
@@ -1,21 +1,6 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 3 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
3 *
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */ 4 */
20 5
21#include "dtc.h" 6#include "dtc.h"
diff --git a/scripts/dtc/util.c b/scripts/dtc/util.c
index 9c6fb5f286ae..48af961dcc8c 100644
--- a/scripts/dtc/util.c
+++ b/scripts/dtc/util.c
@@ -1,24 +1,10 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * Copyright 2011 The Chromium Authors, All Rights Reserved. 3 * Copyright 2011 The Chromium Authors, All Rights Reserved.
3 * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. 4 * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc.
4 * 5 *
5 * util_is_printable_string contributed by 6 * util_is_printable_string contributed by
6 * Pantelis Antoniou <pantelis.antoniou AT gmail.com> 7 * Pantelis Antoniou <pantelis.antoniou AT gmail.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
21 * USA
22 */ 8 */
23 9
24#include <ctype.h> 10#include <ctype.h>
diff --git a/scripts/dtc/util.h b/scripts/dtc/util.h
index 7658781a6200..ca5cb52928e3 100644
--- a/scripts/dtc/util.h
+++ b/scripts/dtc/util.h
@@ -1,3 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
1#ifndef UTIL_H 2#ifndef UTIL_H
2#define UTIL_H 3#define UTIL_H
3 4
@@ -8,21 +9,6 @@
8/* 9/*
9 * Copyright 2011 The Chromium Authors, All Rights Reserved. 10 * Copyright 2011 The Chromium Authors, All Rights Reserved.
10 * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc. 11 * Copyright 2008 Jon Loeliger, Freescale Semiconductor, Inc.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of the
15 * License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
25 * USA
26 */ 12 */
27 13
28#ifdef __GNUC__ 14#ifdef __GNUC__
@@ -122,7 +108,7 @@ int utilfdt_read_err(const char *filename, char **buffp, size_t *len);
122 * stderr. 108 * stderr.
123 * 109 *
124 * @param filename The filename to write, or - for stdout 110 * @param filename The filename to write, or - for stdout
125 * @param blob Poiner to buffer containing fdt 111 * @param blob Pointer to buffer containing fdt
126 * @return 0 if ok, -1 on error 112 * @return 0 if ok, -1 on error
127 */ 113 */
128int utilfdt_write(const char *filename, const void *blob); 114int utilfdt_write(const char *filename, const void *blob);
@@ -133,7 +119,7 @@ int utilfdt_write(const char *filename, const void *blob);
133 * an error message for the user. 119 * an error message for the user.
134 * 120 *
135 * @param filename The filename to write, or - for stdout 121 * @param filename The filename to write, or - for stdout
136 * @param blob Poiner to buffer containing fdt 122 * @param blob Pointer to buffer containing fdt
137 * @return 0 if ok, else an errno value representing the error 123 * @return 0 if ok, else an errno value representing the error
138 */ 124 */
139int utilfdt_write_err(const char *filename, const void *blob); 125int utilfdt_write_err(const char *filename, const void *blob);
diff --git a/scripts/dtc/version_gen.h b/scripts/dtc/version_gen.h
index 75f383c0b9d3..f2761e24cf40 100644
--- a/scripts/dtc/version_gen.h
+++ b/scripts/dtc/version_gen.h
@@ -1 +1 @@
#define DTC_VERSION "DTC 1.4.7-gf267e674" #define DTC_VERSION "DTC 1.5.0-g702c1b6c"
diff --git a/scripts/dtc/yamltree.c b/scripts/dtc/yamltree.c
index a00285a5a9ec..5b6ea8ea862f 100644
--- a/scripts/dtc/yamltree.c
+++ b/scripts/dtc/yamltree.c
@@ -1,22 +1,8 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * (C) Copyright Linaro, Ltd. 2018 3 * (C) Copyright Linaro, Ltd. 2018
3 * (C) Copyright Arm Holdings. 2017 4 * (C) Copyright Arm Holdings. 2017
4 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005. 5 * (C) Copyright David Gibson <dwg@au1.ibm.com>, IBM Corporation. 2005.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19 * USA
20 */ 6 */
21 7
22#include <stdlib.h> 8#include <stdlib.h>
diff --git a/scripts/export_report.pl b/scripts/export_report.pl
index 68ff426b347c..0f604f62f067 100755
--- a/scripts/export_report.pl
+++ b/scripts/export_report.pl
@@ -1,7 +1,7 @@
1#!/usr/bin/env perl 1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0-only
2# 3#
3# (C) Copyright IBM Corporation 2006. 4# (C) Copyright IBM Corporation 2006.
4# Released under GPL v2.
5# Author : Ram Pai (linuxram@us.ibm.com) 5# Author : Ram Pai (linuxram@us.ibm.com)
6# 6#
7# Usage: export_report.pl -k Module.symvers [-o report_file ] -f *.mod.c 7# Usage: export_report.pl -k Module.symvers [-o report_file ] -f *.mod.c
diff --git a/scripts/extract-vmlinux b/scripts/extract-vmlinux
index 85e1f32fb4a0..8995cd304e6e 100755
--- a/scripts/extract-vmlinux
+++ b/scripts/extract-vmlinux
@@ -1,4 +1,5 @@
1#!/bin/sh 1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0-only
2# ---------------------------------------------------------------------- 3# ----------------------------------------------------------------------
3# extract-vmlinux - Extract uncompressed vmlinux from a kernel image 4# extract-vmlinux - Extract uncompressed vmlinux from a kernel image
4# 5#
@@ -7,7 +8,6 @@
7# 8#
8# (c) 2011 Corentin Chary <corentin.chary@gmail.com> 9# (c) 2011 Corentin Chary <corentin.chary@gmail.com>
9# 10#
10# Licensed under the GNU General Public License, version 2 (GPLv2).
11# ---------------------------------------------------------------------- 11# ----------------------------------------------------------------------
12 12
13check_vmlinux() 13check_vmlinux()
diff --git a/scripts/extract_xc3028.pl b/scripts/extract_xc3028.pl
index a1c51b7e4baf..e1c9af25a595 100755
--- a/scripts/extract_xc3028.pl
+++ b/scripts/extract_xc3028.pl
@@ -1,7 +1,7 @@
1#!/usr/bin/env perl 1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3# Copyright (c) Mauro Carvalho Chehab <mchehab@kernel.org> 4# Copyright (c) Mauro Carvalho Chehab <mchehab@kernel.org>
4# Released under GPLv2
5# 5#
6# In order to use, you need to: 6# In order to use, you need to:
7# 1) Download the windows driver with something like: 7# 1) Download the windows driver with something like:
diff --git a/scripts/gcc-plugins/Kconfig b/scripts/gcc-plugins/Kconfig
index 80220ed26a35..e9c677a53c74 100644
--- a/scripts/gcc-plugins/Kconfig
+++ b/scripts/gcc-plugins/Kconfig
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0-only
1preferred-plugin-hostcc := $(if-success,[ $(gcc-version) -ge 40800 ],$(HOSTCXX),$(HOSTCC)) 2preferred-plugin-hostcc := $(if-success,[ $(gcc-version) -ge 40800 ],$(HOSTCXX),$(HOSTCC))
2 3
3config PLUGIN_HOSTCC 4config PLUGIN_HOSTCC
diff --git a/scripts/gcc-plugins/gcc-common.h b/scripts/gcc-plugins/gcc-common.h
index 552d5efd7cb7..17f06079a712 100644
--- a/scripts/gcc-plugins/gcc-common.h
+++ b/scripts/gcc-plugins/gcc-common.h
@@ -150,8 +150,12 @@ void print_gimple_expr(FILE *, gimple, int, int);
150void dump_gimple_stmt(pretty_printer *, gimple, int, int); 150void dump_gimple_stmt(pretty_printer *, gimple, int, int);
151#endif 151#endif
152 152
153#ifndef __unused
153#define __unused __attribute__((__unused__)) 154#define __unused __attribute__((__unused__))
155#endif
156#ifndef __visible
154#define __visible __attribute__((visibility("default"))) 157#define __visible __attribute__((visibility("default")))
158#endif
155 159
156#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node)) 160#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node))
157#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node)) 161#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node))
diff --git a/scripts/gdb/Makefile b/scripts/gdb/Makefile
index 62f5f65becfd..3fca1937d956 100644
--- a/scripts/gdb/Makefile
+++ b/scripts/gdb/Makefile
@@ -1 +1,2 @@
1# SPDX-License-Identifier: GPL-2.0-only
1subdir-y := linux 2subdir-y := linux
diff --git a/scripts/gdb/linux/Makefile b/scripts/gdb/linux/Makefile
index 9fd3d8ed731a..124755087510 100644
--- a/scripts/gdb/linux/Makefile
+++ b/scripts/gdb/linux/Makefile
@@ -1,6 +1,6 @@
1# SPDX-License-Identifier: GPL-2.0 1# SPDX-License-Identifier: GPL-2.0
2 2
3ifneq ($(srctree),.) 3ifdef building_out_of_srctree
4 4
5symlinks := $(patsubst $(srctree)/$(src)/%,%,$(wildcard $(srctree)/$(src)/*.py)) 5symlinks := $(patsubst $(srctree)/$(src)/%,%,$(wildcard $(srctree)/$(src)/*.py))
6 6
diff --git a/scripts/gdb/linux/clk.py b/scripts/gdb/linux/clk.py
new file mode 100644
index 000000000000..061aecfa294e
--- /dev/null
+++ b/scripts/gdb/linux/clk.py
@@ -0,0 +1,76 @@
1# SPDX-License-Identifier: GPL-2.0
2#
3# Copyright (c) NXP 2019
4
5import gdb
6import sys
7
8from linux import utils, lists, constants
9
10clk_core_type = utils.CachedType("struct clk_core")
11
12
13def clk_core_for_each_child(hlist_head):
14 return lists.hlist_for_each_entry(hlist_head,
15 clk_core_type.get_type().pointer(), "child_node")
16
17
18class LxClkSummary(gdb.Command):
19 """Print clk tree summary
20
21Output is a subset of /sys/kernel/debug/clk/clk_summary
22
23No calls are made during printing, instead a (c) if printed after values which
24are cached and potentially out of date"""
25
26 def __init__(self):
27 super(LxClkSummary, self).__init__("lx-clk-summary", gdb.COMMAND_DATA)
28
29 def show_subtree(self, clk, level):
30 gdb.write("%*s%-*s %7d %8d %8d %11lu%s\n" % (
31 level * 3 + 1, "",
32 30 - level * 3,
33 clk['name'].string(),
34 clk['enable_count'],
35 clk['prepare_count'],
36 clk['protect_count'],
37 clk['rate'],
38 '(c)' if clk['flags'] & constants.LX_CLK_GET_RATE_NOCACHE else ' '))
39
40 for child in clk_core_for_each_child(clk['children']):
41 self.show_subtree(child, level + 1)
42
43 def invoke(self, arg, from_tty):
44 gdb.write(" enable prepare protect \n")
45 gdb.write(" clock count count count rate \n")
46 gdb.write("------------------------------------------------------------------------\n")
47 for clk in clk_core_for_each_child(gdb.parse_and_eval("clk_root_list")):
48 self.show_subtree(clk, 0)
49 for clk in clk_core_for_each_child(gdb.parse_and_eval("clk_orphan_list")):
50 self.show_subtree(clk, 0)
51
52
53LxClkSummary()
54
55
56class LxClkCoreLookup(gdb.Function):
57 """Find struct clk_core by name"""
58
59 def __init__(self):
60 super(LxClkCoreLookup, self).__init__("lx_clk_core_lookup")
61
62 def lookup_hlist(self, hlist_head, name):
63 for child in clk_core_for_each_child(hlist_head):
64 if child['name'].string() == name:
65 return child
66 result = self.lookup_hlist(child['children'], name)
67 if result:
68 return result
69
70 def invoke(self, name):
71 name = name.string()
72 return (self.lookup_hlist(gdb.parse_and_eval("clk_root_list"), name) or
73 self.lookup_hlist(gdb.parse_and_eval("clk_orphan_list"), name))
74
75
76LxClkCoreLookup()
diff --git a/scripts/gdb/linux/config.py b/scripts/gdb/linux/config.py
new file mode 100644
index 000000000000..90e1565b1967
--- /dev/null
+++ b/scripts/gdb/linux/config.py
@@ -0,0 +1,44 @@
1# SPDX-License-Identifier: GPL-2.0
2#
3# Copyright 2019 Google LLC.
4
5import gdb
6import zlib
7
8from linux import utils
9
10
11class LxConfigDump(gdb.Command):
12 """Output kernel config to the filename specified as the command
13 argument. Equivalent to 'zcat /proc/config.gz > config.txt' on
14 a running target"""
15
16 def __init__(self):
17 super(LxConfigDump, self).__init__("lx-configdump", gdb.COMMAND_DATA,
18 gdb.COMPLETE_FILENAME)
19
20 def invoke(self, arg, from_tty):
21 if len(arg) == 0:
22 filename = "config.txt"
23 else:
24 filename = arg
25
26 try:
27 py_config_ptr = gdb.parse_and_eval("kernel_config_data + 8")
28 py_config_size = gdb.parse_and_eval(
29 "sizeof(kernel_config_data) - 1 - 8 * 2")
30 except gdb.error as e:
31 raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?")
32
33 inf = gdb.inferiors()[0]
34 zconfig_buf = utils.read_memoryview(inf, py_config_ptr,
35 py_config_size).tobytes()
36
37 config_buf = zlib.decompress(zconfig_buf, 16)
38 with open(filename, 'wb') as f:
39 f.write(config_buf)
40
41 gdb.write("Dumped config to " + filename + "\n")
42
43
44LxConfigDump()
diff --git a/scripts/gdb/linux/constants.py.in b/scripts/gdb/linux/constants.py.in
index d3319a80788a..2efbec6b6b8d 100644
--- a/scripts/gdb/linux/constants.py.in
+++ b/scripts/gdb/linux/constants.py.in
@@ -12,9 +12,12 @@
12 * 12 *
13 */ 13 */
14 14
15#include <linux/clk-provider.h>
15#include <linux/fs.h> 16#include <linux/fs.h>
17#include <linux/hrtimer.h>
16#include <linux/mount.h> 18#include <linux/mount.h>
17#include <linux/of_fdt.h> 19#include <linux/of_fdt.h>
20#include <linux/threads.h>
18 21
19/* We need to stringify expanded macros so that they can be parsed */ 22/* We need to stringify expanded macros so that they can be parsed */
20 23
@@ -36,6 +39,10 @@
36 39
37import gdb 40import gdb
38 41
42/* linux/clk-provider.h */
43if IS_BUILTIN(CONFIG_COMMON_CLK):
44 LX_GDBPARSED(CLK_GET_RATE_NOCACHE)
45
39/* linux/fs.h */ 46/* linux/fs.h */
40LX_VALUE(SB_RDONLY) 47LX_VALUE(SB_RDONLY)
41LX_VALUE(SB_SYNCHRONOUS) 48LX_VALUE(SB_SYNCHRONOUS)
@@ -44,6 +51,9 @@ LX_VALUE(SB_DIRSYNC)
44LX_VALUE(SB_NOATIME) 51LX_VALUE(SB_NOATIME)
45LX_VALUE(SB_NODIRATIME) 52LX_VALUE(SB_NODIRATIME)
46 53
54/* linux/htimer.h */
55LX_GDBPARSED(hrtimer_resolution)
56
47/* linux/mount.h */ 57/* linux/mount.h */
48LX_VALUE(MNT_NOSUID) 58LX_VALUE(MNT_NOSUID)
49LX_VALUE(MNT_NODEV) 59LX_VALUE(MNT_NODEV)
@@ -52,8 +62,16 @@ LX_VALUE(MNT_NOATIME)
52LX_VALUE(MNT_NODIRATIME) 62LX_VALUE(MNT_NODIRATIME)
53LX_VALUE(MNT_RELATIME) 63LX_VALUE(MNT_RELATIME)
54 64
65/* linux/threads.h */
66LX_VALUE(NR_CPUS)
67
55/* linux/of_fdt.h> */ 68/* linux/of_fdt.h> */
56LX_VALUE(OF_DT_HEADER) 69LX_VALUE(OF_DT_HEADER)
57 70
58/* Kernel Configs */ 71/* Kernel Configs */
72LX_CONFIG(CONFIG_GENERIC_CLOCKEVENTS)
73LX_CONFIG(CONFIG_GENERIC_CLOCKEVENTS_BROADCAST)
74LX_CONFIG(CONFIG_HIGH_RES_TIMERS)
75LX_CONFIG(CONFIG_NR_CPUS)
59LX_CONFIG(CONFIG_OF) 76LX_CONFIG(CONFIG_OF)
77LX_CONFIG(CONFIG_TICK_ONESHOT)
diff --git a/scripts/gdb/linux/cpus.py b/scripts/gdb/linux/cpus.py
index ca11e8df31b6..008e62f3190d 100644
--- a/scripts/gdb/linux/cpus.py
+++ b/scripts/gdb/linux/cpus.py
@@ -135,6 +135,7 @@ and can help identify the state of hotplugged CPUs"""
135 gdb.write("Online CPUs : {}\n".format(list(each_online_cpu()))) 135 gdb.write("Online CPUs : {}\n".format(list(each_online_cpu())))
136 gdb.write("Active CPUs : {}\n".format(list(each_active_cpu()))) 136 gdb.write("Active CPUs : {}\n".format(list(each_active_cpu())))
137 137
138
138LxCpus() 139LxCpus()
139 140
140 141
diff --git a/scripts/gdb/linux/lists.py b/scripts/gdb/linux/lists.py
index 2f335fbd86fd..c487ddf09d38 100644
--- a/scripts/gdb/linux/lists.py
+++ b/scripts/gdb/linux/lists.py
@@ -16,13 +16,15 @@ import gdb
16from linux import utils 16from linux import utils
17 17
18list_head = utils.CachedType("struct list_head") 18list_head = utils.CachedType("struct list_head")
19hlist_head = utils.CachedType("struct hlist_head")
20hlist_node = utils.CachedType("struct hlist_node")
19 21
20 22
21def list_for_each(head): 23def list_for_each(head):
22 if head.type == list_head.get_type().pointer(): 24 if head.type == list_head.get_type().pointer():
23 head = head.dereference() 25 head = head.dereference()
24 elif head.type != list_head.get_type(): 26 elif head.type != list_head.get_type():
25 raise gdb.GdbError("Must be struct list_head not {}" 27 raise TypeError("Must be struct list_head not {}"
26 .format(head.type)) 28 .format(head.type))
27 29
28 node = head['next'].dereference() 30 node = head['next'].dereference()
@@ -33,9 +35,24 @@ def list_for_each(head):
33 35
34def list_for_each_entry(head, gdbtype, member): 36def list_for_each_entry(head, gdbtype, member):
35 for node in list_for_each(head): 37 for node in list_for_each(head):
36 if node.type != list_head.get_type().pointer(): 38 yield utils.container_of(node, gdbtype, member)
37 raise TypeError("Type {} found. Expected struct list_head *." 39
38 .format(node.type)) 40
41def hlist_for_each(head):
42 if head.type == hlist_head.get_type().pointer():
43 head = head.dereference()
44 elif head.type != hlist_head.get_type():
45 raise TypeError("Must be struct hlist_head not {}"
46 .format(head.type))
47
48 node = head['first'].dereference()
49 while node.address:
50 yield node.address
51 node = node['next'].dereference()
52
53
54def hlist_for_each_entry(head, gdbtype, member):
55 for node in hlist_for_each(head):
39 yield utils.container_of(node, gdbtype, member) 56 yield utils.container_of(node, gdbtype, member)
40 57
41 58
@@ -110,4 +127,5 @@ class LxListChk(gdb.Command):
110 raise gdb.GdbError("lx-list-check takes one argument") 127 raise gdb.GdbError("lx-list-check takes one argument")
111 list_check(gdb.parse_and_eval(argv[0])) 128 list_check(gdb.parse_and_eval(argv[0]))
112 129
130
113LxListChk() 131LxListChk()
diff --git a/scripts/gdb/linux/proc.py b/scripts/gdb/linux/proc.py
index 2f01a958eb22..6a56bba233a9 100644
--- a/scripts/gdb/linux/proc.py
+++ b/scripts/gdb/linux/proc.py
@@ -29,6 +29,7 @@ class LxCmdLine(gdb.Command):
29 def invoke(self, arg, from_tty): 29 def invoke(self, arg, from_tty):
30 gdb.write(gdb.parse_and_eval("saved_command_line").string() + "\n") 30 gdb.write(gdb.parse_and_eval("saved_command_line").string() + "\n")
31 31
32
32LxCmdLine() 33LxCmdLine()
33 34
34 35
@@ -43,6 +44,7 @@ class LxVersion(gdb.Command):
43 # linux_banner should contain a newline 44 # linux_banner should contain a newline
44 gdb.write(gdb.parse_and_eval("(char *)linux_banner").string()) 45 gdb.write(gdb.parse_and_eval("(char *)linux_banner").string())
45 46
47
46LxVersion() 48LxVersion()
47 49
48 50
@@ -86,6 +88,7 @@ Equivalent to cat /proc/iomem on a running target"""
86 def invoke(self, arg, from_tty): 88 def invoke(self, arg, from_tty):
87 return show_lx_resources("iomem_resource") 89 return show_lx_resources("iomem_resource")
88 90
91
89LxIOMem() 92LxIOMem()
90 93
91 94
@@ -100,6 +103,7 @@ Equivalent to cat /proc/ioports on a running target"""
100 def invoke(self, arg, from_tty): 103 def invoke(self, arg, from_tty):
101 return show_lx_resources("ioport_resource") 104 return show_lx_resources("ioport_resource")
102 105
106
103LxIOPorts() 107LxIOPorts()
104 108
105 109
@@ -149,7 +153,7 @@ values of that process namespace"""
149 if len(argv) >= 1: 153 if len(argv) >= 1:
150 try: 154 try:
151 pid = int(argv[0]) 155 pid = int(argv[0])
152 except: 156 except gdb.error:
153 raise gdb.GdbError("Provide a PID as integer value") 157 raise gdb.GdbError("Provide a PID as integer value")
154 else: 158 else:
155 pid = 1 159 pid = 1
@@ -195,6 +199,7 @@ values of that process namespace"""
195 info_opts(FS_INFO, s_flags), 199 info_opts(FS_INFO, s_flags),
196 info_opts(MNT_INFO, m_flags))) 200 info_opts(MNT_INFO, m_flags)))
197 201
202
198LxMounts() 203LxMounts()
199 204
200 205
@@ -259,7 +264,7 @@ class LxFdtDump(gdb.Command):
259 264
260 try: 265 try:
261 f = open(filename, 'wb') 266 f = open(filename, 'wb')
262 except: 267 except gdb.error:
263 raise gdb.GdbError("Could not open file to dump fdt") 268 raise gdb.GdbError("Could not open file to dump fdt")
264 269
265 f.write(fdt_buf) 270 f.write(fdt_buf)
@@ -267,4 +272,5 @@ class LxFdtDump(gdb.Command):
267 272
268 gdb.write("Dumped fdt blob to " + filename + "\n") 273 gdb.write("Dumped fdt blob to " + filename + "\n")
269 274
275
270LxFdtDump() 276LxFdtDump()
diff --git a/scripts/gdb/linux/rbtree.py b/scripts/gdb/linux/rbtree.py
new file mode 100644
index 000000000000..39db889b874c
--- /dev/null
+++ b/scripts/gdb/linux/rbtree.py
@@ -0,0 +1,177 @@
1# SPDX-License-Identifier: GPL-2.0
2#
3# Copyright 2019 Google LLC.
4
5import gdb
6
7from linux import utils
8
9rb_root_type = utils.CachedType("struct rb_root")
10rb_node_type = utils.CachedType("struct rb_node")
11
12
13def rb_first(root):
14 if root.type == rb_root_type.get_type():
15 node = node.address.cast(rb_root_type.get_type().pointer())
16 elif root.type != rb_root_type.get_type().pointer():
17 raise gdb.GdbError("Must be struct rb_root not {}".format(root.type))
18
19 node = root['rb_node']
20 if node is 0:
21 return None
22
23 while node['rb_left']:
24 node = node['rb_left']
25
26 return node
27
28
29def rb_last(root):
30 if root.type == rb_root_type.get_type():
31 node = node.address.cast(rb_root_type.get_type().pointer())
32 elif root.type != rb_root_type.get_type().pointer():
33 raise gdb.GdbError("Must be struct rb_root not {}".format(root.type))
34
35 node = root['rb_node']
36 if node is 0:
37 return None
38
39 while node['rb_right']:
40 node = node['rb_right']
41
42 return node
43
44
45def rb_parent(node):
46 parent = gdb.Value(node['__rb_parent_color'] & ~3)
47 return parent.cast(rb_node_type.get_type().pointer())
48
49
50def rb_empty_node(node):
51 return node['__rb_parent_color'] == node.address
52
53
54def rb_next(node):
55 if node.type == rb_node_type.get_type():
56 node = node.address.cast(rb_node_type.get_type().pointer())
57 elif node.type != rb_node_type.get_type().pointer():
58 raise gdb.GdbError("Must be struct rb_node not {}".format(node.type))
59
60 if rb_empty_node(node):
61 return None
62
63 if node['rb_right']:
64 node = node['rb_right']
65 while node['rb_left']:
66 node = node['rb_left']
67 return node
68
69 parent = rb_parent(node)
70 while parent and node == parent['rb_right']:
71 node = parent
72 parent = rb_parent(node)
73
74 return parent
75
76
77def rb_prev(node):
78 if node.type == rb_node_type.get_type():
79 node = node.address.cast(rb_node_type.get_type().pointer())
80 elif node.type != rb_node_type.get_type().pointer():
81 raise gdb.GdbError("Must be struct rb_node not {}".format(node.type))
82
83 if rb_empty_node(node):
84 return None
85
86 if node['rb_left']:
87 node = node['rb_left']
88 while node['rb_right']:
89 node = node['rb_right']
90 return node.dereference()
91
92 parent = rb_parent(node)
93 while parent and node == parent['rb_left'].dereference():
94 node = parent
95 parent = rb_parent(node)
96
97 return parent
98
99
100class LxRbFirst(gdb.Function):
101 """Lookup and return a node from an RBTree
102
103$lx_rb_first(root): Return the node at the given index.
104If index is omitted, the root node is dereferenced and returned."""
105
106 def __init__(self):
107 super(LxRbFirst, self).__init__("lx_rb_first")
108
109 def invoke(self, root):
110 result = rb_first(root)
111 if result is None:
112 raise gdb.GdbError("No entry in tree")
113
114 return result
115
116
117LxRbFirst()
118
119
120class LxRbLast(gdb.Function):
121 """Lookup and return a node from an RBTree.
122
123$lx_rb_last(root): Return the node at the given index.
124If index is omitted, the root node is dereferenced and returned."""
125
126 def __init__(self):
127 super(LxRbLast, self).__init__("lx_rb_last")
128
129 def invoke(self, root):
130 result = rb_last(root)
131 if result is None:
132 raise gdb.GdbError("No entry in tree")
133
134 return result
135
136
137LxRbLast()
138
139
140class LxRbNext(gdb.Function):
141 """Lookup and return a node from an RBTree.
142
143$lx_rb_next(node): Return the node at the given index.
144If index is omitted, the root node is dereferenced and returned."""
145
146 def __init__(self):
147 super(LxRbNext, self).__init__("lx_rb_next")
148
149 def invoke(self, node):
150 result = rb_next(node)
151 if result is None:
152 raise gdb.GdbError("No entry in tree")
153
154 return result
155
156
157LxRbNext()
158
159
160class LxRbPrev(gdb.Function):
161 """Lookup and return a node from an RBTree.
162
163$lx_rb_prev(node): Return the node at the given index.
164If index is omitted, the root node is dereferenced and returned."""
165
166 def __init__(self):
167 super(LxRbPrev, self).__init__("lx_rb_prev")
168
169 def invoke(self, node):
170 result = rb_prev(node)
171 if result is None:
172 raise gdb.GdbError("No entry in tree")
173
174 return result
175
176
177LxRbPrev()
diff --git a/scripts/gdb/linux/symbols.py b/scripts/gdb/linux/symbols.py
index 004b0ac7fa72..2f5b95f09fa0 100644
--- a/scripts/gdb/linux/symbols.py
+++ b/scripts/gdb/linux/symbols.py
@@ -139,8 +139,12 @@ lx-symbols command."""
139 saved_states.append({'breakpoint': bp, 'enabled': bp.enabled}) 139 saved_states.append({'breakpoint': bp, 'enabled': bp.enabled})
140 140
141 # drop all current symbols and reload vmlinux 141 # drop all current symbols and reload vmlinux
142 orig_vmlinux = 'vmlinux'
143 for obj in gdb.objfiles():
144 if obj.filename.endswith('vmlinux'):
145 orig_vmlinux = obj.filename
142 gdb.execute("symbol-file", to_string=True) 146 gdb.execute("symbol-file", to_string=True)
143 gdb.execute("symbol-file vmlinux") 147 gdb.execute("symbol-file {0}".format(orig_vmlinux))
144 148
145 self.loaded_modules = [] 149 self.loaded_modules = []
146 module_list = modules.module_list() 150 module_list = modules.module_list()
diff --git a/scripts/gdb/linux/tasks.py b/scripts/gdb/linux/tasks.py
index f6ab3ccf698f..0301dc1e0138 100644
--- a/scripts/gdb/linux/tasks.py
+++ b/scripts/gdb/linux/tasks.py
@@ -79,6 +79,7 @@ class LxPs(gdb.Command):
79 pid=task["pid"], 79 pid=task["pid"],
80 comm=task["comm"].string())) 80 comm=task["comm"].string()))
81 81
82
82LxPs() 83LxPs()
83 84
84 85
@@ -134,4 +135,5 @@ variable."""
134 else: 135 else:
135 raise gdb.GdbError("No task of PID " + str(pid)) 136 raise gdb.GdbError("No task of PID " + str(pid))
136 137
138
137LxThreadInfoByPidFunc() 139LxThreadInfoByPidFunc()
diff --git a/scripts/gdb/linux/timerlist.py b/scripts/gdb/linux/timerlist.py
new file mode 100644
index 000000000000..071d0dd5a634
--- /dev/null
+++ b/scripts/gdb/linux/timerlist.py
@@ -0,0 +1,219 @@
1# SPDX-License-Identifier: GPL-2.0
2#
3# Copyright 2019 Google LLC.
4
5import binascii
6import gdb
7
8from linux import constants
9from linux import cpus
10from linux import rbtree
11from linux import utils
12
13timerqueue_node_type = utils.CachedType("struct timerqueue_node").get_type()
14hrtimer_type = utils.CachedType("struct hrtimer").get_type()
15
16
17def ktime_get():
18 """Returns the current time, but not very accurately
19
20 We can't read the hardware timer itself to add any nanoseconds
21 that need to be added since we last stored the time in the
22 timekeeper. But this is probably good enough for debug purposes."""
23 tk_core = gdb.parse_and_eval("&tk_core")
24
25 return tk_core['timekeeper']['tkr_mono']['base']
26
27
28def print_timer(rb_node, idx):
29 timerqueue = utils.container_of(rb_node, timerqueue_node_type.pointer(),
30 "node")
31 timer = utils.container_of(timerqueue, hrtimer_type.pointer(), "node")
32
33 function = str(timer['function']).split(" ")[1].strip("<>")
34 softexpires = timer['_softexpires']
35 expires = timer['node']['expires']
36 now = ktime_get()
37
38 text = " #{}: <{}>, {}, ".format(idx, timer, function)
39 text += "S:{:02x}\n".format(int(timer['state']))
40 text += " # expires at {}-{} nsecs [in {} to {} nsecs]\n".format(
41 softexpires, expires, softexpires - now, expires - now)
42 return text
43
44
45def print_active_timers(base):
46 curr = base['active']['next']['node']
47 curr = curr.address.cast(rbtree.rb_node_type.get_type().pointer())
48 idx = 0
49 while curr:
50 yield print_timer(curr, idx)
51 curr = rbtree.rb_next(curr)
52 idx += 1
53
54
55def print_base(base):
56 text = " .base: {}\n".format(base.address)
57 text += " .index: {}\n".format(base['index'])
58
59 text += " .resolution: {} nsecs\n".format(constants.LX_hrtimer_resolution)
60
61 text += " .get_time: {}\n".format(base['get_time'])
62 if constants.LX_CONFIG_HIGH_RES_TIMERS:
63 text += " .offset: {} nsecs\n".format(base['offset'])
64 text += "active timers:\n"
65 text += "".join([x for x in print_active_timers(base)])
66 return text
67
68
69def print_cpu(hrtimer_bases, cpu, max_clock_bases):
70 cpu_base = cpus.per_cpu(hrtimer_bases, cpu)
71 jiffies = gdb.parse_and_eval("jiffies_64")
72 tick_sched_ptr = gdb.parse_and_eval("&tick_cpu_sched")
73 ts = cpus.per_cpu(tick_sched_ptr, cpu)
74
75 text = "cpu: {}\n".format(cpu)
76 for i in xrange(max_clock_bases):
77 text += " clock {}:\n".format(i)
78 text += print_base(cpu_base['clock_base'][i])
79
80 if constants.LX_CONFIG_HIGH_RES_TIMERS:
81 fmts = [(" .{} : {} nsecs", 'expires_next'),
82 (" .{} : {}", 'hres_active'),
83 (" .{} : {}", 'nr_events'),
84 (" .{} : {}", 'nr_retries'),
85 (" .{} : {}", 'nr_hangs'),
86 (" .{} : {}", 'max_hang_time')]
87 text += "\n".join([s.format(f, cpu_base[f]) for s, f in fmts])
88 text += "\n"
89
90 if constants.LX_CONFIG_TICK_ONESHOT:
91 fmts = [(" .{} : {}", 'nohz_mode'),
92 (" .{} : {} nsecs", 'last_tick'),
93 (" .{} : {}", 'tick_stopped'),
94 (" .{} : {}", 'idle_jiffies'),
95 (" .{} : {}", 'idle_calls'),
96 (" .{} : {}", 'idle_sleeps'),
97 (" .{} : {} nsecs", 'idle_entrytime'),
98 (" .{} : {} nsecs", 'idle_waketime'),
99 (" .{} : {} nsecs", 'idle_exittime'),
100 (" .{} : {} nsecs", 'idle_sleeptime'),
101 (" .{}: {} nsecs", 'iowait_sleeptime'),
102 (" .{} : {}", 'last_jiffies'),
103 (" .{} : {}", 'next_timer'),
104 (" .{} : {} nsecs", 'idle_expires')]
105 text += "\n".join([s.format(f, ts[f]) for s, f in fmts])
106 text += "\njiffies: {}\n".format(jiffies)
107
108 text += "\n"
109
110 return text
111
112
113def print_tickdevice(td, cpu):
114 dev = td['evtdev']
115 text = "Tick Device: mode: {}\n".format(td['mode'])
116 if cpu < 0:
117 text += "Broadcast device\n"
118 else:
119 text += "Per CPU device: {}\n".format(cpu)
120
121 text += "Clock Event Device: "
122 if dev == 0:
123 text += "<NULL>\n"
124 return text
125
126 text += "{}\n".format(dev['name'])
127 text += " max_delta_ns: {}\n".format(dev['max_delta_ns'])
128 text += " min_delta_ns: {}\n".format(dev['min_delta_ns'])
129 text += " mult: {}\n".format(dev['mult'])
130 text += " shift: {}\n".format(dev['shift'])
131 text += " mode: {}\n".format(dev['state_use_accessors'])
132 text += " next_event: {} nsecs\n".format(dev['next_event'])
133
134 text += " set_next_event: {}\n".format(dev['set_next_event'])
135
136 members = [('set_state_shutdown', " shutdown: {}\n"),
137 ('set_state_periodic', " periodic: {}\n"),
138 ('set_state_oneshot', " oneshot: {}\n"),
139 ('set_state_oneshot_stopped', " oneshot stopped: {}\n"),
140 ('tick_resume', " resume: {}\n")]
141 for member, fmt in members:
142 if dev[member]:
143 text += fmt.format(dev[member])
144
145 text += " event_handler: {}\n".format(dev['event_handler'])
146 text += " retries: {}\n".format(dev['retries'])
147
148 return text
149
150
151def pr_cpumask(mask):
152 nr_cpu_ids = 1
153 if constants.LX_NR_CPUS > 1:
154 nr_cpu_ids = gdb.parse_and_eval("nr_cpu_ids")
155
156 inf = gdb.inferiors()[0]
157 bits = mask['bits']
158 num_bytes = (nr_cpu_ids + 7) / 8
159 buf = utils.read_memoryview(inf, bits, num_bytes).tobytes()
160 buf = binascii.b2a_hex(buf)
161
162 chunks = []
163 i = num_bytes
164 while i > 0:
165 i -= 1
166 start = i * 2
167 end = start + 2
168 chunks.append(buf[start:end])
169 if i != 0 and i % 4 == 0:
170 chunks.append(',')
171
172 extra = nr_cpu_ids % 8
173 if 0 < extra <= 4:
174 chunks[0] = chunks[0][0] # Cut off the first 0
175
176 return "".join(chunks)
177
178
179class LxTimerList(gdb.Command):
180 """Print /proc/timer_list"""
181
182 def __init__(self):
183 super(LxTimerList, self).__init__("lx-timerlist", gdb.COMMAND_DATA)
184
185 def invoke(self, arg, from_tty):
186 hrtimer_bases = gdb.parse_and_eval("&hrtimer_bases")
187 max_clock_bases = gdb.parse_and_eval("HRTIMER_MAX_CLOCK_BASES")
188
189 text = "Timer List Version: gdb scripts\n"
190 text += "HRTIMER_MAX_CLOCK_BASES: {}\n".format(max_clock_bases)
191 text += "now at {} nsecs\n".format(ktime_get())
192
193 for cpu in cpus.each_online_cpu():
194 text += print_cpu(hrtimer_bases, cpu, max_clock_bases)
195
196 if constants.LX_CONFIG_GENERIC_CLOCKEVENTS:
197 if constants.LX_CONFIG_GENERIC_CLOCKEVENTS_BROADCAST:
198 bc_dev = gdb.parse_and_eval("&tick_broadcast_device")
199 text += print_tickdevice(bc_dev, -1)
200 text += "\n"
201 mask = gdb.parse_and_eval("tick_broadcast_mask")
202 mask = pr_cpumask(mask)
203 text += "tick_broadcast_mask: {}\n".format(mask)
204 if constants.LX_CONFIG_TICK_ONESHOT:
205 mask = gdb.parse_and_eval("tick_broadcast_oneshot_mask")
206 mask = pr_cpumask(mask)
207 text += "tick_broadcast_oneshot_mask: {}\n".format(mask)
208 text += "\n"
209
210 tick_cpu_devices = gdb.parse_and_eval("&tick_cpu_device")
211 for cpu in cpus.each_online_cpu():
212 tick_dev = cpus.per_cpu(tick_cpu_devices, cpu)
213 text += print_tickdevice(tick_dev, cpu)
214 text += "\n"
215
216 gdb.write(text)
217
218
219LxTimerList()
diff --git a/scripts/gdb/linux/utils.py b/scripts/gdb/linux/utils.py
index 50805874cfc3..bc67126118c4 100644
--- a/scripts/gdb/linux/utils.py
+++ b/scripts/gdb/linux/utils.py
@@ -66,6 +66,7 @@ Note that TYPE and ELEMENT have to be quoted as strings."""
66 return container_of(ptr, gdb.lookup_type(typename.string()).pointer(), 66 return container_of(ptr, gdb.lookup_type(typename.string()).pointer(),
67 elementname.string()) 67 elementname.string())
68 68
69
69ContainerOf() 70ContainerOf()
70 71
71 72
@@ -148,14 +149,14 @@ def get_gdbserver_type():
148 def probe_qemu(): 149 def probe_qemu():
149 try: 150 try:
150 return gdb.execute("monitor info version", to_string=True) != "" 151 return gdb.execute("monitor info version", to_string=True) != ""
151 except: 152 except gdb.error:
152 return False 153 return False
153 154
154 def probe_kgdb(): 155 def probe_kgdb():
155 try: 156 try:
156 thread_info = gdb.execute("info thread 2", to_string=True) 157 thread_info = gdb.execute("info thread 2", to_string=True)
157 return "shadowCPU0" in thread_info 158 return "shadowCPU0" in thread_info
158 except: 159 except gdb.error:
159 return False 160 return False
160 161
161 global gdbserver_type 162 global gdbserver_type
@@ -172,7 +173,7 @@ def get_gdbserver_type():
172def gdb_eval_or_none(expresssion): 173def gdb_eval_or_none(expresssion):
173 try: 174 try:
174 return gdb.parse_and_eval(expresssion) 175 return gdb.parse_and_eval(expresssion)
175 except: 176 except gdb.error:
176 return None 177 return None
177 178
178 179
diff --git a/scripts/gdb/vmlinux-gdb.py b/scripts/gdb/vmlinux-gdb.py
index 6e0b0afd888a..eff5a48ac026 100644
--- a/scripts/gdb/vmlinux-gdb.py
+++ b/scripts/gdb/vmlinux-gdb.py
@@ -27,7 +27,11 @@ else:
27 import linux.modules 27 import linux.modules
28 import linux.dmesg 28 import linux.dmesg
29 import linux.tasks 29 import linux.tasks
30 import linux.config
30 import linux.cpus 31 import linux.cpus
31 import linux.lists 32 import linux.lists
33 import linux.rbtree
32 import linux.proc 34 import linux.proc
33 import linux.constants 35 import linux.constants
36 import linux.timerlist
37 import linux.clk
diff --git a/scripts/genksyms/Makefile b/scripts/genksyms/Makefile
index 03b7ce97de14..66c314bc5933 100644
--- a/scripts/genksyms/Makefile
+++ b/scripts/genksyms/Makefile
@@ -31,8 +31,8 @@ $(obj)/parse.tab.h: $(src)/parse.y FORCE
31endif 31endif
32 32
33# -I needed for generated C source (shipped source) 33# -I needed for generated C source (shipped source)
34HOSTCFLAGS_parse.tab.o := -I$(src) 34HOSTCFLAGS_parse.tab.o := -I $(srctree)/$(src)
35HOSTCFLAGS_lex.lex.o := -I$(src) 35HOSTCFLAGS_lex.lex.o := -I $(srctree)/$(src)
36 36
37# dependencies on generated files need to be listed explicitly 37# dependencies on generated files need to be listed explicitly
38$(obj)/lex.lex.o: $(obj)/parse.tab.h 38$(obj)/lex.lex.o: $(obj)/parse.tab.h
diff --git a/scripts/genksyms/genksyms.c b/scripts/genksyms/genksyms.c
index e007840f45b9..23eff234184f 100644
--- a/scripts/genksyms/genksyms.c
+++ b/scripts/genksyms/genksyms.c
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* Generate kernel symbol version hashes. 2/* Generate kernel symbol version hashes.
2 Copyright 1996, 1997 Linux International. 3 Copyright 1996, 1997 Linux International.
3 4
@@ -7,19 +8,7 @@
7 This file was part of the Linux modutils 2.4.22: moved back into the 8 This file was part of the Linux modutils 2.4.22: moved back into the
8 kernel sources by Rusty Russell/Kai Germaschewski. 9 kernel sources by Rusty Russell/Kai Germaschewski.
9 10
10 This program is free software; you can redistribute it and/or modify it 11 */
11 under the terms of the GNU General Public License as published by the
12 Free Software Foundation; either version 2 of the License, or (at your
13 option) any later version.
14
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software Foundation,
22 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23 12
24#include <stdio.h> 13#include <stdio.h>
25#include <string.h> 14#include <string.h>
diff --git a/scripts/genksyms/genksyms.h b/scripts/genksyms/genksyms.h
index b724a0290c75..2bcdb9bebab4 100644
--- a/scripts/genksyms/genksyms.h
+++ b/scripts/genksyms/genksyms.h
@@ -1,3 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0-or-later */
1/* Generate kernel symbol version hashes. 2/* Generate kernel symbol version hashes.
2 Copyright 1996, 1997 Linux International. 3 Copyright 1996, 1997 Linux International.
3 4
@@ -6,19 +7,7 @@
6 7
7 This file is part of the Linux modutils. 8 This file is part of the Linux modutils.
8 9
9 This program is free software; you can redistribute it and/or modify it 10 */
10 under the terms of the GNU General Public License as published by the
11 Free Software Foundation; either version 2 of the License, or (at your
12 option) any later version.
13
14 This program is distributed in the hope that it will be useful, but
15 WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software Foundation,
21 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 11
23#ifndef MODUTILS_GENKSYMS_H 12#ifndef MODUTILS_GENKSYMS_H
24#define MODUTILS_GENKSYMS_H 1 13#define MODUTILS_GENKSYMS_H 1
diff --git a/scripts/genksyms/keywords.c b/scripts/genksyms/keywords.c
index 9f40bcd17d07..c586d32dd2c3 100644
--- a/scripts/genksyms/keywords.c
+++ b/scripts/genksyms/keywords.c
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1static struct resword { 2static struct resword {
2 const char *name; 3 const char *name;
3 int token; 4 int token;
@@ -24,6 +25,10 @@ static struct resword {
24 { "__volatile__", VOLATILE_KEYW }, 25 { "__volatile__", VOLATILE_KEYW },
25 { "__builtin_va_list", VA_LIST_KEYW }, 26 { "__builtin_va_list", VA_LIST_KEYW },
26 27
28 { "__int128", BUILTIN_INT_KEYW },
29 { "__int128_t", BUILTIN_INT_KEYW },
30 { "__uint128_t", BUILTIN_INT_KEYW },
31
27 // According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO 32 // According to rth, c99 defines "_Bool", __restrict", __restrict__", "restrict". KAO
28 { "_Bool", BOOL_KEYW }, 33 { "_Bool", BOOL_KEYW },
29 { "_restrict", RESTRICT_KEYW }, 34 { "_restrict", RESTRICT_KEYW },
diff --git a/scripts/genksyms/parse.y b/scripts/genksyms/parse.y
index 00a6d7e54971..1ebcf52cd0f9 100644
--- a/scripts/genksyms/parse.y
+++ b/scripts/genksyms/parse.y
@@ -76,6 +76,7 @@ static void record_compound(struct string_list **keyw,
76%token ATTRIBUTE_KEYW 76%token ATTRIBUTE_KEYW
77%token AUTO_KEYW 77%token AUTO_KEYW
78%token BOOL_KEYW 78%token BOOL_KEYW
79%token BUILTIN_INT_KEYW
79%token CHAR_KEYW 80%token CHAR_KEYW
80%token CONST_KEYW 81%token CONST_KEYW
81%token DOUBLE_KEYW 82%token DOUBLE_KEYW
@@ -263,6 +264,7 @@ simple_type_specifier:
263 | VOID_KEYW 264 | VOID_KEYW
264 | BOOL_KEYW 265 | BOOL_KEYW
265 | VA_LIST_KEYW 266 | VA_LIST_KEYW
267 | BUILTIN_INT_KEYW
266 | TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; } 268 | TYPE { (*$1)->tag = SYM_TYPEDEF; $$ = $1; }
267 ; 269 ;
268 270
diff --git a/scripts/get_abi.pl b/scripts/get_abi.pl
new file mode 100755
index 000000000000..c738cb795514
--- /dev/null
+++ b/scripts/get_abi.pl
@@ -0,0 +1,468 @@
1#!/usr/bin/perl
2# SPDX-License-Identifier: GPL-2.0
3
4use strict;
5use Pod::Usage;
6use Getopt::Long;
7use File::Find;
8use Fcntl ':mode';
9
10my $help;
11my $man;
12my $debug;
13my $prefix="Documentation/ABI";
14
15GetOptions(
16 "debug|d+" => \$debug,
17 "dir=s" => \$prefix,
18 'help|?' => \$help,
19 man => \$man
20) or pod2usage(2);
21
22pod2usage(1) if $help;
23pod2usage(-exitstatus => 0, -verbose => 2) if $man;
24
25pod2usage(2) if (scalar @ARGV < 1 || @ARGV > 2);
26
27my ($cmd, $arg) = @ARGV;
28
29pod2usage(2) if ($cmd ne "search" && $cmd ne "rest" && $cmd ne "validate");
30pod2usage(2) if ($cmd eq "search" && !$arg);
31
32require Data::Dumper if ($debug);
33
34my %data;
35
36#
37# Displays an error message, printing file name and line
38#
39sub parse_error($$$$) {
40 my ($file, $ln, $msg, $data) = @_;
41
42 print STDERR "file $file#$ln: $msg at\n\t$data";
43}
44
45#
46# Parse an ABI file, storing its contents at %data
47#
48sub parse_abi {
49 my $file = $File::Find::name;
50
51 my $mode = (stat($file))[2];
52 return if ($mode & S_IFDIR);
53 return if ($file =~ m,/README,);
54
55 my $name = $file;
56 $name =~ s,.*/,,;
57
58 my $nametag = "File $name";
59 $data{$nametag}->{what} = "File $name";
60 $data{$nametag}->{type} = "File";
61 $data{$nametag}->{file} = $name;
62 $data{$nametag}->{filepath} = $file;
63 $data{$nametag}->{is_file} = 1;
64
65 my $type = $file;
66 $type =~ s,.*/(.*)/.*,$1,;
67
68 my $what;
69 my $new_what;
70 my $tag;
71 my $ln;
72 my $xrefs;
73 my $space;
74 my @labels;
75 my $label;
76
77 print STDERR "Opening $file\n" if ($debug > 1);
78 open IN, $file;
79 while(<IN>) {
80 $ln++;
81 if (m/^(\S+)(:\s*)(.*)/i) {
82 my $new_tag = lc($1);
83 my $sep = $2;
84 my $content = $3;
85
86 if (!($new_tag =~ m/(what|where|date|kernelversion|contact|description|users)/)) {
87 if ($tag eq "description") {
88 # New "tag" is actually part of
89 # description. Don't consider it a tag
90 $new_tag = "";
91 } elsif ($tag ne "") {
92 parse_error($file, $ln, "tag '$tag' is invalid", $_);
93 }
94 }
95
96 # Invalid, but it is a common mistake
97 if ($new_tag eq "where") {
98 parse_error($file, $ln, "tag 'Where' is invalid. Should be 'What:' instead", $_);
99 $new_tag = "what";
100 }
101
102 if ($new_tag =~ m/what/) {
103 $space = "";
104 if ($tag =~ m/what/) {
105 $what .= ", " . $content;
106 } else {
107 parse_error($file, $ln, "What '$what' doesn't have a description", "") if ($what && !$data{$what}->{description});
108
109 $what = $content;
110 $label = $content;
111 $new_what = 1;
112 }
113 push @labels, [($content, $label)];
114 $tag = $new_tag;
115
116 push @{$data{$nametag}->{xrefs}}, [($content, $label)] if ($data{$nametag}->{what});
117 next;
118 }
119
120 if ($tag ne "" && $new_tag) {
121 $tag = $new_tag;
122
123 if ($new_what) {
124 @{$data{$what}->{label}} = @labels if ($data{$nametag}->{what});
125 @labels = ();
126 $label = "";
127 $new_what = 0;
128
129 $data{$what}->{type} = $type;
130 $data{$what}->{file} = $name;
131 $data{$what}->{filepath} = $file;
132 print STDERR "\twhat: $what\n" if ($debug > 1);
133 }
134
135 if (!$what) {
136 parse_error($file, $ln, "'What:' should come first:", $_);
137 next;
138 }
139 if ($tag eq "description") {
140 next if ($content =~ m/^\s*$/);
141 if ($content =~ m/^(\s*)(.*)/) {
142 my $new_content = $2;
143 $space = $new_tag . $sep . $1;
144 while ($space =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {}
145 $space =~ s/./ /g;
146 $data{$what}->{$tag} .= "$new_content\n";
147 }
148 } else {
149 $data{$what}->{$tag} = $content;
150 }
151 next;
152 }
153 }
154
155 # Store any contents before tags at the database
156 if (!$tag && $data{$nametag}->{what}) {
157 $data{$nametag}->{description} .= $_;
158 next;
159 }
160
161 if ($tag eq "description") {
162 if (!$data{$what}->{description}) {
163 next if (m/^\s*\n/);
164 if (m/^(\s*)(.*)/) {
165 $space = $1;
166 while ($space =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {}
167 $data{$what}->{$tag} .= "$2\n";
168 }
169 } else {
170 my $content = $_;
171 if (m/^\s*\n/) {
172 $data{$what}->{$tag} .= $content;
173 next;
174 }
175
176 while ($content =~ s/\t+/' ' x (length($&) * 8 - length($`) % 8)/e) {}
177 $space = "" if (!($content =~ s/^($space)//));
178
179 # Compress spaces with tabs
180 $content =~ s<^ {8}> <\t>;
181 $content =~ s<^ {1,7}\t> <\t>;
182 $content =~ s< {1,7}\t> <\t>;
183 $data{$what}->{$tag} .= $content;
184 }
185 next;
186 }
187 if (m/^\s*(.*)/) {
188 $data{$what}->{$tag} .= "\n$1";
189 $data{$what}->{$tag} =~ s/\n+$//;
190 next;
191 }
192
193 # Everything else is error
194 parse_error($file, $ln, "Unexpected line:", $_);
195 }
196 $data{$nametag}->{description} =~ s/^\n+//;
197 close IN;
198}
199
200#
201# Outputs the book on ReST format
202#
203
204my %labels;
205
206sub output_rest {
207 foreach my $what (sort {
208 ($data{$a}->{type} eq "File") cmp ($data{$b}->{type} eq "File") ||
209 $a cmp $b
210 } keys %data) {
211 my $type = $data{$what}->{type};
212 my $file = $data{$what}->{file};
213 my $filepath = $data{$what}->{filepath};
214
215 my $w = $what;
216 $w =~ s/([\(\)\_\-\*\=\^\~\\])/\\$1/g;
217
218
219 foreach my $p (@{$data{$what}->{label}}) {
220 my ($content, $label) = @{$p};
221 $label = "abi_" . $label . " ";
222 $label =~ tr/A-Z/a-z/;
223
224 # Convert special chars to "_"
225 $label =~s/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xff])/_/g;
226 $label =~ s,_+,_,g;
227 $label =~ s,_$,,;
228
229 # Avoid duplicated labels
230 while (defined($labels{$label})) {
231 my @chars = ("A".."Z", "a".."z");
232 $label .= $chars[rand @chars];
233 }
234 $labels{$label} = 1;
235
236 $data{$what}->{label} .= $label;
237
238 printf ".. _%s:\n\n", $label;
239
240 # only one label is enough
241 last;
242 }
243
244
245 $filepath =~ s,.*/(.*/.*),\1,;;
246 $filepath =~ s,[/\-],_,g;;
247 my $fileref = "abi_file_".$filepath;
248
249 if ($type eq "File") {
250 my $bar = $w;
251 $bar =~ s/./-/g;
252
253 print ".. _$fileref:\n\n";
254 print "$w\n$bar\n\n";
255 } else {
256 my @names = split /\s*,\s*/,$w;
257
258 my $len = 0;
259
260 foreach my $name (@names) {
261 $len = length($name) if (length($name) > $len);
262 }
263
264 print "What:\n\n";
265
266 print "+-" . "-" x $len . "-+\n";
267 foreach my $name (@names) {
268 printf "| %s", $name . " " x ($len - length($name)) . " |\n";
269 print "+-" . "-" x $len . "-+\n";
270 }
271 print "\n";
272 }
273
274 print "Defined on file :ref:`$file <$fileref>`\n\n" if ($type ne "File");
275
276 my $desc = $data{$what}->{description};
277 $desc =~ s/^\s+//;
278
279 # Remove title markups from the description, as they won't work
280 $desc =~ s/\n[\-\*\=\^\~]+\n/\n/g;
281
282 if (!($desc =~ /^\s*$/)) {
283 if ($desc =~ m/\:\n/ || $desc =~ m/\n[\t ]+/ || $desc =~ m/[\x00-\x08\x0b-\x1f\x7b-\xff]/) {
284 # put everything inside a code block
285 $desc =~ s/\n/\n /g;
286
287 print "::\n\n";
288 print " $desc\n\n";
289 } else {
290 # Escape any special chars from description
291 $desc =~s/([\x00-\x08\x0b-\x1f\x21-\x2a\x2d\x2f\x3c-\x40\x5c\x5e-\x60\x7b-\xff])/\\$1/g;
292
293 print "$desc\n\n";
294 }
295 } else {
296 print "DESCRIPTION MISSING for $what\n\n" if (!$data{$what}->{is_file});
297 }
298
299 if ($data{$what}->{xrefs}) {
300 printf "Has the following ABI:\n\n";
301
302 foreach my $p(@{$data{$what}->{xrefs}}) {
303 my ($content, $label) = @{$p};
304 $label = "abi_" . $label . " ";
305 $label =~ tr/A-Z/a-z/;
306
307 # Convert special chars to "_"
308 $label =~s/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\xff])/_/g;
309 $label =~ s,_+,_,g;
310 $label =~ s,_$,,;
311
312 # Escape special chars from content
313 $content =~s/([\x00-\x1f\x21-\x2f\x3a-\x40\x7b-\xff])/\\$1/g;
314
315 print "- :ref:`$content <$label>`\n\n";
316 }
317 }
318 }
319}
320
321#
322# Searches for ABI symbols
323#
324sub search_symbols {
325 foreach my $what (sort keys %data) {
326 next if (!($what =~ m/($arg)/));
327
328 my $type = $data{$what}->{type};
329 next if ($type eq "File");
330
331 my $file = $data{$what}->{filepath};
332
333 my $bar = $what;
334 $bar =~ s/./-/g;
335
336 print "\n$what\n$bar\n\n";
337
338 my $kernelversion = $data{$what}->{kernelversion};
339 my $contact = $data{$what}->{contact};
340 my $users = $data{$what}->{users};
341 my $date = $data{$what}->{date};
342 my $desc = $data{$what}->{description};
343 $kernelversion =~ s/^\s+//;
344 $contact =~ s/^\s+//;
345 $users =~ s/^\s+//;
346 $users =~ s/\n//g;
347 $date =~ s/^\s+//;
348 $desc =~ s/^\s+//;
349
350 printf "Kernel version:\t\t%s\n", $kernelversion if ($kernelversion);
351 printf "Date:\t\t\t%s\n", $date if ($date);
352 printf "Contact:\t\t%s\n", $contact if ($contact);
353 printf "Users:\t\t\t%s\n", $users if ($users);
354 print "Defined on file:\t$file\n\n";
355 print "Description:\n\n$desc";
356 }
357}
358
359
360#
361# Parses all ABI files located at $prefix dir
362#
363find({wanted =>\&parse_abi, no_chdir => 1}, $prefix);
364
365print STDERR Data::Dumper->Dump([\%data], [qw(*data)]) if ($debug);
366
367#
368# Handles the command
369#
370if ($cmd eq "rest") {
371 output_rest;
372} elsif ($cmd eq "search") {
373 search_symbols;
374}
375
376
377__END__
378
379=head1 NAME
380
381abi_book.pl - parse the Linux ABI files and produce a ReST book.
382
383=head1 SYNOPSIS
384
385B<abi_book.pl> [--debug] [--man] [--help] [--dir=<dir>] <COMAND> [<ARGUMENT>]
386
387Where <COMMAND> can be:
388
389=over 8
390
391B<search> [SEARCH_REGEX] - search for [SEARCH_REGEX] inside ABI
392
393B<rest> - output the ABI in ReST markup language
394
395B<validate> - validate the ABI contents
396
397=back
398
399=head1 OPTIONS
400
401=over 8
402
403=item B<--dir>
404
405Changes the location of the ABI search. By default, it uses
406the Documentation/ABI directory.
407
408=item B<--debug>
409
410Put the script in verbose mode, useful for debugging. Can be called multiple
411times, to increase verbosity.
412
413=item B<--help>
414
415Prints a brief help message and exits.
416
417=item B<--man>
418
419Prints the manual page and exits.
420
421=back
422
423=head1 DESCRIPTION
424
425Parse the Linux ABI files from ABI DIR (usually located at Documentation/ABI),
426allowing to search for ABI symbols or to produce a ReST book containing
427the Linux ABI documentation.
428
429=head1 EXAMPLES
430
431Search for all stable symbols with the word "usb":
432
433=over 8
434
435$ scripts/get_abi.pl search usb --dir Documentation/ABI/stable
436
437=back
438
439Search for all symbols that match the regex expression "usb.*cap":
440
441=over 8
442
443$ scripts/get_abi.pl search usb.*cap
444
445=back
446
447Output all obsoleted symbols in ReST format
448
449=over 8
450
451$ scripts/get_abi.pl rest --dir Documentation/ABI/obsolete
452
453=back
454
455=head1 BUGS
456
457Report bugs to Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
458
459=head1 COPYRIGHT
460
461Copyright (c) 2016-2019 by Mauro Carvalho Chehab <mchehab+samsung@kernel.org>.
462
463License GPLv2: GNU GPL version 2 <http://gnu.org/licenses/gpl.html>.
464
465This is free software: you are free to change and redistribute it.
466There is NO WARRANTY, to the extent permitted by law.
467
468=cut
diff --git a/scripts/get_dvb_firmware b/scripts/get_dvb_firmware
index f3f230225aba..1a90802410bc 100755
--- a/scripts/get_dvb_firmware
+++ b/scripts/get_dvb_firmware
@@ -1,22 +1,9 @@
1#!/usr/bin/env perl 1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0-or-later
2# DVB firmware extractor 3# DVB firmware extractor
3# 4#
4# (c) 2004 Andrew de Quincey 5# (c) 2004 Andrew de Quincey
5# 6#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14#
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 7
21use File::Temp qw/ tempdir /; 8use File::Temp qw/ tempdir /;
22use IO::Handle; 9use IO::Handle;
diff --git a/scripts/gfp-translate b/scripts/gfp-translate
index c9230e158a8f..b2ce416d944b 100755
--- a/scripts/gfp-translate
+++ b/scripts/gfp-translate
@@ -1,7 +1,7 @@
1#!/bin/bash 1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0-only
2# Translate the bits making up a GFP mask 3# Translate the bits making up a GFP mask
3# (c) 2009, Mel Gorman <mel@csn.ul.ie> 4# (c) 2009, Mel Gorman <mel@csn.ul.ie>
4# Licensed under the terms of the GNU GPL License version 2
5SOURCE= 5SOURCE=
6GFPMASK=none 6GFPMASK=none
7 7
diff --git a/scripts/headers.sh b/scripts/headers.sh
deleted file mode 100755
index e0f883eb39a2..000000000000
--- a/scripts/headers.sh
+++ /dev/null
@@ -1,29 +0,0 @@
1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0
3# Run headers_$1 command for all suitable architectures
4
5# Stop on error
6set -e
7
8do_command()
9{
10 if [ -f ${srctree}/arch/$2/include/asm/Kbuild ]; then
11 make ARCH=$2 KBUILD_HEADERS=$1 headers_$1
12 else
13 printf "Ignoring arch: %s\n" ${arch}
14 fi
15}
16
17archs=${HDR_ARCH_LIST:-$(ls ${srctree}/arch)}
18
19for arch in ${archs}; do
20 case ${arch} in
21 um) # no userspace export
22 ;;
23 *)
24 if [ -d ${srctree}/arch/${arch} ]; then
25 do_command $1 ${arch}
26 fi
27 ;;
28 esac
29done
diff --git a/scripts/headers_install.sh b/scripts/headers_install.sh
index 593f8879c641..47f6f3ea0771 100755
--- a/scripts/headers_install.sh
+++ b/scripts/headers_install.sh
@@ -1,47 +1,39 @@
1#!/bin/sh 1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0 2# SPDX-License-Identifier: GPL-2.0
3 3
4if [ $# -lt 2 ] 4if [ $# -ne 2 ]
5then 5then
6 echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]" 6 echo "Usage: headers_install.sh INFILE OUTFILE"
7 echo 7 echo
8 echo "Prepares kernel header files for use by user space, by removing" 8 echo "Prepares kernel header files for use by user space, by removing"
9 echo "all compiler.h definitions and #includes, removing any" 9 echo "all compiler.h definitions and #includes, removing any"
10 echo "#ifdef __KERNEL__ sections, and putting __underscores__ around" 10 echo "#ifdef __KERNEL__ sections, and putting __underscores__ around"
11 echo "asm/inline/volatile keywords." 11 echo "asm/inline/volatile keywords."
12 echo 12 echo
13 echo "OUTDIR: directory to write each userspace header FILE to." 13 echo "INFILE: header file to operate on"
14 echo "SRCDIR: source directory where files are picked." 14 echo "OUTFILE: output file which the processed header is writen to"
15 echo "FILES: list of header files to operate on."
16 15
17 exit 1 16 exit 1
18fi 17fi
19 18
20# Grab arguments 19# Grab arguments
20INFILE=$1
21OUTFILE=$2
22TMPFILE=$OUTFILE.tmp
21 23
22OUTDIR="$1" 24trap 'rm -f $OUTFILE $TMPFILE' EXIT
23shift
24SRCDIR="$1"
25shift
26 25
27# Iterate through files listed on command line 26sed -E -e '
27 s/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g
28 s/__attribute_const__([[:space:]]|$)/\1/g
29 s@^#include <linux/compiler(|_types).h>@@
30 s/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g
31 s/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g
32 s@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @
33' $INFILE > $TMPFILE || exit 1
28 34
29FILE= 35scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE
30trap 'rm -f "$OUTDIR/$FILE" "$OUTDIR/$FILE.sed"' EXIT 36[ $? -gt 1 ] && exit 1
31for i in "$@" 37
32do 38rm -f $TMPFILE
33 FILE="$(basename "$i")"
34 sed -E \
35 -e 's/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g' \
36 -e 's/__attribute_const__([[:space:]]|$)/\1/g' \
37 -e 's@^#include <linux/compiler(|_types).h>@@' \
38 -e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \
39 -e 's/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g' \
40 -e 's@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @' \
41 "$SRCDIR/$i" > "$OUTDIR/$FILE.sed" || exit 1
42 scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \
43 > "$OUTDIR/$FILE"
44 [ $? -gt 1 ] && exit 1
45 rm -f "$OUTDIR/$FILE.sed"
46done
47trap - EXIT 39trap - EXIT
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
index e17837f1d3f2..ae6504d07fd6 100644
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
@@ -150,6 +150,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)
150 /* exclude debugging symbols */ 150 /* exclude debugging symbols */
151 else if (stype == 'N' || stype == 'n') 151 else if (stype == 'N' || stype == 'n')
152 return -1; 152 return -1;
153 /* exclude s390 kasan local symbols */
154 else if (!strncmp(sym, ".LASANPC", 8))
155 return -1;
153 156
154 /* include the type field in the symbol name, so that it gets 157 /* include the type field in the symbol name, so that it gets
155 * compressed together */ 158 * compressed together */
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
index 7c5dc31c1d95..ab30fe724c43 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
@@ -12,6 +12,10 @@ else
12Kconfig := Kconfig 12Kconfig := Kconfig
13endif 13endif
14 14
15ifndef KBUILD_DEFCONFIG
16KBUILD_DEFCONFIG := defconfig
17endif
18
15ifeq ($(quiet),silent_) 19ifeq ($(quiet),silent_)
16silent := -s 20silent := -s
17endif 21endif
@@ -74,9 +78,6 @@ savedefconfig: $(obj)/conf
74 $< $(silent) --$@=defconfig $(Kconfig) 78 $< $(silent) --$@=defconfig $(Kconfig)
75 79
76defconfig: $(obj)/conf 80defconfig: $(obj)/conf
77ifeq ($(KBUILD_DEFCONFIG),)
78 $< $(silent) --defconfig $(Kconfig)
79else
80ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),) 81ifneq ($(wildcard $(srctree)/arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG)),)
81 @$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'" 82 @$(kecho) "*** Default configuration is based on '$(KBUILD_DEFCONFIG)'"
82 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig) 83 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$(KBUILD_DEFCONFIG) $(Kconfig)
@@ -84,7 +85,6 @@ else
84 @$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'" 85 @$(kecho) "*** Default configuration is based on target '$(KBUILD_DEFCONFIG)'"
85 $(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG) 86 $(Q)$(MAKE) -f $(srctree)/Makefile $(KBUILD_DEFCONFIG)
86endif 87endif
87endif
88 88
89%_defconfig: $(obj)/conf 89%_defconfig: $(obj)/conf
90 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig) 90 $(Q)$< $(silent) --defconfig=arch/$(SRCARCH)/configs/$@ $(Kconfig)
@@ -147,8 +147,8 @@ common-objs := confdata.o expr.o lexer.lex.o parser.tab.o preprocess.o \
147 symbol.o 147 symbol.o
148 148
149$(obj)/lexer.lex.o: $(obj)/parser.tab.h 149$(obj)/lexer.lex.o: $(obj)/parser.tab.h
150HOSTCFLAGS_lexer.lex.o := -I$(src) 150HOSTCFLAGS_lexer.lex.o := -I $(srctree)/$(src)
151HOSTCFLAGS_parser.tab.o := -I$(src) 151HOSTCFLAGS_parser.tab.o := -I $(srctree)/$(src)
152 152
153# conf: Used for defconfig, oldconfig and related targets 153# conf: Used for defconfig, oldconfig and related targets
154hostprogs-y += conf 154hostprogs-y += conf
diff --git a/scripts/kconfig/conf.c b/scripts/kconfig/conf.c
index ef3678c24bab..40e16e871ae2 100644
--- a/scripts/kconfig/conf.c
+++ b/scripts/kconfig/conf.c
@@ -90,7 +90,7 @@ static int conf_askvalue(struct symbol *sym, const char *def)
90 line[0] = '\n'; 90 line[0] = '\n';
91 line[1] = 0; 91 line[1] = 0;
92 92
93 if (!sym_is_changable(sym)) { 93 if (!sym_is_changeable(sym)) {
94 printf("%s\n", def); 94 printf("%s\n", def);
95 line[0] = '\n'; 95 line[0] = '\n';
96 line[1] = 0; 96 line[1] = 0;
@@ -234,7 +234,7 @@ static int conf_choice(struct menu *menu)
234 234
235 sym = menu->sym; 235 sym = menu->sym;
236 is_new = !sym_has_value(sym); 236 is_new = !sym_has_value(sym);
237 if (sym_is_changable(sym)) { 237 if (sym_is_changeable(sym)) {
238 conf_sym(menu); 238 conf_sym(menu);
239 sym_calc_value(sym); 239 sym_calc_value(sym);
240 switch (sym_get_tristate_value(sym)) { 240 switch (sym_get_tristate_value(sym)) {
@@ -418,7 +418,7 @@ static void check_conf(struct menu *menu)
418 418
419 sym = menu->sym; 419 sym = menu->sym;
420 if (sym && !sym_has_value(sym)) { 420 if (sym && !sym_has_value(sym)) {
421 if (sym_is_changable(sym) || 421 if (sym_is_changeable(sym) ||
422 (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) { 422 (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)) {
423 if (input_mode == listnewconfig) { 423 if (input_mode == listnewconfig) {
424 if (sym->name) { 424 if (sym->name) {
@@ -451,7 +451,7 @@ static struct option long_opts[] = {
451 {"oldaskconfig", no_argument, NULL, oldaskconfig}, 451 {"oldaskconfig", no_argument, NULL, oldaskconfig},
452 {"oldconfig", no_argument, NULL, oldconfig}, 452 {"oldconfig", no_argument, NULL, oldconfig},
453 {"syncconfig", no_argument, NULL, syncconfig}, 453 {"syncconfig", no_argument, NULL, syncconfig},
454 {"defconfig", optional_argument, NULL, defconfig}, 454 {"defconfig", required_argument, NULL, defconfig},
455 {"savedefconfig", required_argument, NULL, savedefconfig}, 455 {"savedefconfig", required_argument, NULL, savedefconfig},
456 {"allnoconfig", no_argument, NULL, allnoconfig}, 456 {"allnoconfig", no_argument, NULL, allnoconfig},
457 {"allyesconfig", no_argument, NULL, allyesconfig}, 457 {"allyesconfig", no_argument, NULL, allyesconfig},
@@ -562,8 +562,6 @@ int main(int ac, char **av)
562 562
563 switch (input_mode) { 563 switch (input_mode) {
564 case defconfig: 564 case defconfig:
565 if (!defconfig_file)
566 defconfig_file = conf_get_default_confname();
567 if (conf_read(defconfig_file)) { 565 if (conf_read(defconfig_file)) {
568 fprintf(stderr, 566 fprintf(stderr,
569 "***\n" 567 "***\n"
diff --git a/scripts/kconfig/confdata.c b/scripts/kconfig/confdata.c
index 08ba146a83c5..501fdcc5e999 100644
--- a/scripts/kconfig/confdata.c
+++ b/scripts/kconfig/confdata.c
@@ -3,6 +3,7 @@
3 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org> 3 * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
4 */ 4 */
5 5
6#include <sys/mman.h>
6#include <sys/stat.h> 7#include <sys/stat.h>
7#include <ctype.h> 8#include <ctype.h>
8#include <errno.h> 9#include <errno.h>
@@ -36,6 +37,52 @@ static bool is_dir(const char *path)
36 return S_ISDIR(st.st_mode); 37 return S_ISDIR(st.st_mode);
37} 38}
38 39
40/* return true if the given two files are the same, false otherwise */
41static bool is_same(const char *file1, const char *file2)
42{
43 int fd1, fd2;
44 struct stat st1, st2;
45 void *map1, *map2;
46 bool ret = false;
47
48 fd1 = open(file1, O_RDONLY);
49 if (fd1 < 0)
50 return ret;
51
52 fd2 = open(file2, O_RDONLY);
53 if (fd2 < 0)
54 goto close1;
55
56 ret = fstat(fd1, &st1);
57 if (ret)
58 goto close2;
59 ret = fstat(fd2, &st2);
60 if (ret)
61 goto close2;
62
63 if (st1.st_size != st2.st_size)
64 goto close2;
65
66 map1 = mmap(NULL, st1.st_size, PROT_READ, MAP_PRIVATE, fd1, 0);
67 if (map1 == MAP_FAILED)
68 goto close2;
69
70 map2 = mmap(NULL, st2.st_size, PROT_READ, MAP_PRIVATE, fd2, 0);
71 if (map2 == MAP_FAILED)
72 goto close2;
73
74 if (bcmp(map1, map2, st1.st_size))
75 goto close2;
76
77 ret = true;
78close2:
79 close(fd2);
80close1:
81 close(fd1);
82
83 return ret;
84}
85
39/* 86/*
40 * Create the parent directory of the given path. 87 * Create the parent directory of the given path.
41 * 88 *
@@ -130,8 +177,6 @@ static void conf_message(const char *fmt, ...)
130static const char *conf_filename; 177static const char *conf_filename;
131static int conf_lineno, conf_warnings; 178static int conf_lineno, conf_warnings;
132 179
133const char conf_defname[] = "arch/$(ARCH)/defconfig";
134
135static void conf_warning(const char *fmt, ...) 180static void conf_warning(const char *fmt, ...)
136{ 181{
137 va_list ap; 182 va_list ap;
@@ -179,28 +224,13 @@ const char *conf_get_configname(void)
179 return name ? name : ".config"; 224 return name ? name : ".config";
180} 225}
181 226
182const char *conf_get_autoconfig_name(void) 227static const char *conf_get_autoconfig_name(void)
183{ 228{
184 char *name = getenv("KCONFIG_AUTOCONFIG"); 229 char *name = getenv("KCONFIG_AUTOCONFIG");
185 230
186 return name ? name : "include/config/auto.conf"; 231 return name ? name : "include/config/auto.conf";
187} 232}
188 233
189char *conf_get_default_confname(void)
190{
191 static char fullname[PATH_MAX+1];
192 char *env, *name;
193
194 name = expand_string(conf_defname);
195 env = getenv(SRCTREE);
196 if (env) {
197 sprintf(fullname, "%s/%s", env, name);
198 if (is_present(fullname))
199 return fullname;
200 }
201 return name;
202}
203
204static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p) 234static int conf_set_sym_val(struct symbol *sym, int def, int def_flags, char *p)
205{ 235{
206 char *p2; 236 char *p2;
@@ -504,11 +534,9 @@ int conf_read(const char *name)
504 switch (sym->type) { 534 switch (sym->type) {
505 case S_BOOLEAN: 535 case S_BOOLEAN:
506 case S_TRISTATE: 536 case S_TRISTATE:
507 if (sym->def[S_DEF_USER].tri != sym_get_tristate_value(sym)) 537 if (sym->def[S_DEF_USER].tri == sym_get_tristate_value(sym))
508 break;
509 if (!sym_is_choice(sym))
510 continue; 538 continue;
511 /* fall through */ 539 break;
512 default: 540 default:
513 if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val)) 541 if (!strcmp(sym->curr.val, sym->def[S_DEF_USER].val))
514 continue; 542 continue;
@@ -766,7 +794,7 @@ int conf_write_defconfig(const char *filename)
766 goto next_menu; 794 goto next_menu;
767 sym->flags &= ~SYMBOL_WRITE; 795 sym->flags &= ~SYMBOL_WRITE;
768 /* If we cannot change the symbol - skip */ 796 /* If we cannot change the symbol - skip */
769 if (!sym_is_changable(sym)) 797 if (!sym_is_changeable(sym))
770 goto next_menu; 798 goto next_menu;
771 /* If symbol equals to default value - skip */ 799 /* If symbol equals to default value - skip */
772 if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0) 800 if (strcmp(sym_get_string_value(sym), sym_get_string_default(sym)) == 0)
@@ -817,40 +845,35 @@ int conf_write(const char *name)
817 FILE *out; 845 FILE *out;
818 struct symbol *sym; 846 struct symbol *sym;
819 struct menu *menu; 847 struct menu *menu;
820 const char *basename;
821 const char *str; 848 const char *str;
822 char dirname[PATH_MAX+1], tmpname[PATH_MAX+22], newname[PATH_MAX+8]; 849 char tmpname[PATH_MAX + 1], oldname[PATH_MAX + 1];
823 char *env; 850 char *env;
851 bool need_newline = false;
852
853 if (!name)
854 name = conf_get_configname();
855
856 if (!*name) {
857 fprintf(stderr, "config name is empty\n");
858 return -1;
859 }
860
861 if (is_dir(name)) {
862 fprintf(stderr, "%s: Is a directory\n", name);
863 return -1;
864 }
865
866 if (make_parent_dir(name))
867 return -1;
824 868
825 dirname[0] = 0;
826 if (name && name[0]) {
827 char *slash;
828
829 if (is_dir(name)) {
830 strcpy(dirname, name);
831 strcat(dirname, "/");
832 basename = conf_get_configname();
833 } else if ((slash = strrchr(name, '/'))) {
834 int size = slash - name + 1;
835 memcpy(dirname, name, size);
836 dirname[size] = 0;
837 if (slash[1])
838 basename = slash + 1;
839 else
840 basename = conf_get_configname();
841 } else
842 basename = name;
843 } else
844 basename = conf_get_configname();
845
846 sprintf(newname, "%s%s", dirname, basename);
847 env = getenv("KCONFIG_OVERWRITECONFIG"); 869 env = getenv("KCONFIG_OVERWRITECONFIG");
848 if (!env || !*env) { 870 if (env && *env) {
849 sprintf(tmpname, "%s.tmpconfig.%d", dirname, (int)getpid());
850 out = fopen(tmpname, "w");
851 } else {
852 *tmpname = 0; 871 *tmpname = 0;
853 out = fopen(newname, "w"); 872 out = fopen(name, "w");
873 } else {
874 snprintf(tmpname, sizeof(tmpname), "%s.%d.tmp",
875 name, (int)getpid());
876 out = fopen(tmpname, "w");
854 } 877 }
855 if (!out) 878 if (!out)
856 return 1; 879 return 1;
@@ -871,12 +894,16 @@ int conf_write(const char *name)
871 "#\n" 894 "#\n"
872 "# %s\n" 895 "# %s\n"
873 "#\n", str); 896 "#\n", str);
897 need_newline = false;
874 } else if (!(sym->flags & SYMBOL_CHOICE)) { 898 } else if (!(sym->flags & SYMBOL_CHOICE)) {
875 sym_calc_value(sym); 899 sym_calc_value(sym);
876 if (!(sym->flags & SYMBOL_WRITE)) 900 if (!(sym->flags & SYMBOL_WRITE))
877 goto next; 901 goto next;
902 if (need_newline) {
903 fprintf(out, "\n");
904 need_newline = false;
905 }
878 sym->flags &= ~SYMBOL_WRITE; 906 sym->flags &= ~SYMBOL_WRITE;
879
880 conf_write_symbol(out, sym, &kconfig_printer_cb, NULL); 907 conf_write_symbol(out, sym, &kconfig_printer_cb, NULL);
881 } 908 }
882 909
@@ -888,6 +915,12 @@ next:
888 if (menu->next) 915 if (menu->next)
889 menu = menu->next; 916 menu = menu->next;
890 else while ((menu = menu->parent)) { 917 else while ((menu = menu->parent)) {
918 if (!menu->sym && menu_is_visible(menu) &&
919 menu != &rootmenu) {
920 str = menu_get_prompt(menu);
921 fprintf(out, "# end of %s\n", str);
922 need_newline = true;
923 }
891 if (menu->next) { 924 if (menu->next) {
892 menu = menu->next; 925 menu = menu->next;
893 break; 926 break;
@@ -897,14 +930,20 @@ next:
897 fclose(out); 930 fclose(out);
898 931
899 if (*tmpname) { 932 if (*tmpname) {
900 strcat(dirname, basename); 933 if (is_same(name, tmpname)) {
901 strcat(dirname, ".old"); 934 conf_message("No change to %s", name);
902 rename(newname, dirname); 935 unlink(tmpname);
903 if (rename(tmpname, newname)) 936 sym_set_change_count(0);
937 return 0;
938 }
939
940 snprintf(oldname, sizeof(oldname), "%s.old", name);
941 rename(name, oldname);
942 if (rename(tmpname, name))
904 return 1; 943 return 1;
905 } 944 }
906 945
907 conf_message("configuration written to %s", newname); 946 conf_message("configuration written to %s", name);
908 947
909 sym_set_change_count(0); 948 sym_set_change_count(0);
910 949
@@ -917,8 +956,6 @@ static int conf_write_dep(const char *name)
917 struct file *file; 956 struct file *file;
918 FILE *out; 957 FILE *out;
919 958
920 if (!name)
921 name = ".kconfig.d";
922 out = fopen("..config.tmp", "w"); 959 out = fopen("..config.tmp", "w");
923 if (!out) 960 if (!out)
924 return 1; 961 return 1;
diff --git a/scripts/kconfig/gconf.c b/scripts/kconfig/gconf.c
index 5d4ecf309ee4..e36b342f1065 100644
--- a/scripts/kconfig/gconf.c
+++ b/scripts/kconfig/gconf.c
@@ -638,7 +638,7 @@ on_set_option_mode3_activate(GtkMenuItem *menuitem, gpointer user_data)
638void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data) 638void on_introduction1_activate(GtkMenuItem * menuitem, gpointer user_data)
639{ 639{
640 GtkWidget *dialog; 640 GtkWidget *dialog;
641 const gchar *intro_text = 641 const gchar *intro_text =
642 "Welcome to gkc, the GTK+ graphical configuration tool\n" 642 "Welcome to gkc, the GTK+ graphical configuration tool\n"
643 "For each option, a blank box indicates the feature is disabled, a\n" 643 "For each option, a blank box indicates the feature is disabled, a\n"
644 "check indicates it is enabled, and a dot indicates that it is to\n" 644 "check indicates it is enabled, and a dot indicates that it is to\n"
diff --git a/scripts/kconfig/lexer.l b/scripts/kconfig/lexer.l
index c9df1c8b9824..6354c905b006 100644
--- a/scripts/kconfig/lexer.l
+++ b/scripts/kconfig/lexer.l
@@ -378,7 +378,8 @@ FILE *zconf_fopen(const char *name)
378 if (!f && name != NULL && name[0] != '/') { 378 if (!f && name != NULL && name[0] != '/') {
379 env = getenv(SRCTREE); 379 env = getenv(SRCTREE);
380 if (env) { 380 if (env) {
381 sprintf(fullname, "%s/%s", env, name); 381 snprintf(fullname, sizeof(fullname),
382 "%s/%s", env, name);
382 f = fopen(fullname, "r"); 383 f = fopen(fullname, "r");
383 } 384 }
384 } 385 }
diff --git a/scripts/kconfig/lkc.h b/scripts/kconfig/lkc.h
index d871539e4b45..4fb16f316626 100644
--- a/scripts/kconfig/lkc.h
+++ b/scripts/kconfig/lkc.h
@@ -49,8 +49,6 @@ const char *zconf_curname(void);
49 49
50/* confdata.c */ 50/* confdata.c */
51const char *conf_get_configname(void); 51const char *conf_get_configname(void);
52const char *conf_get_autoconfig_name(void);
53char *conf_get_default_confname(void);
54void sym_set_change_count(int count); 52void sym_set_change_count(int count);
55void sym_add_change_count(int count); 53void sym_add_change_count(int count);
56bool conf_set_all_new_symbols(enum conf_def_mode mode); 54bool conf_set_all_new_symbols(enum conf_def_mode mode);
diff --git a/scripts/kconfig/lkc_proto.h b/scripts/kconfig/lkc_proto.h
index 86c267540ccc..f9ab98238aef 100644
--- a/scripts/kconfig/lkc_proto.h
+++ b/scripts/kconfig/lkc_proto.h
@@ -42,7 +42,7 @@ tristate sym_toggle_tristate_value(struct symbol *sym);
42bool sym_string_valid(struct symbol *sym, const char *newval); 42bool sym_string_valid(struct symbol *sym, const char *newval);
43bool sym_string_within_range(struct symbol *sym, const char *str); 43bool sym_string_within_range(struct symbol *sym, const char *str);
44bool sym_set_string_value(struct symbol *sym, const char *newval); 44bool sym_set_string_value(struct symbol *sym, const char *newval);
45bool sym_is_changable(struct symbol *sym); 45bool sym_is_changeable(struct symbol *sym);
46struct property * sym_get_choice_prop(struct symbol *sym); 46struct property * sym_get_choice_prop(struct symbol *sym);
47const char * sym_get_string_value(struct symbol *sym); 47const char * sym_get_string_value(struct symbol *sym);
48 48
@@ -58,7 +58,6 @@ void env_write_dep(FILE *f, const char *auto_conf_name);
58void variable_add(const char *name, const char *value, 58void variable_add(const char *name, const char *value,
59 enum variable_flavor flavor); 59 enum variable_flavor flavor);
60void variable_all_del(void); 60void variable_all_del(void);
61char *expand_string(const char *in);
62char *expand_dollar(const char **str); 61char *expand_dollar(const char **str);
63char *expand_one_token(const char **str); 62char *expand_one_token(const char **str);
64 63
diff --git a/scripts/kconfig/lxdialog/BIG.FAT.WARNING b/scripts/kconfig/lxdialog/BIG.FAT.WARNING
index a8999d82bdb3..7cb5a7ec93d2 100644
--- a/scripts/kconfig/lxdialog/BIG.FAT.WARNING
+++ b/scripts/kconfig/lxdialog/BIG.FAT.WARNING
@@ -1,4 +1,4 @@
1This is NOT the official version of dialog. This version has been 1This is NOT the official version of dialog. This version has been
2significantly modified from the original. It is for use by the Linux 2significantly modified from the original. It is for use by the Linux
3kernel configuration script. Please do not bother Savio Lam with 3kernel configuration script. Please do not bother Savio Lam with
4questions about this program. 4questions about this program.
diff --git a/scripts/kconfig/mconf.c b/scripts/kconfig/mconf.c
index 5f8c82a4cb08..49c26ea9dd98 100644
--- a/scripts/kconfig/mconf.c
+++ b/scripts/kconfig/mconf.c
@@ -536,7 +536,7 @@ static void build_conf(struct menu *menu)
536 } 536 }
537 537
538 val = sym_get_tristate_value(sym); 538 val = sym_get_tristate_value(sym);
539 if (sym_is_changable(sym)) { 539 if (sym_is_changeable(sym)) {
540 switch (type) { 540 switch (type) {
541 case S_BOOLEAN: 541 case S_BOOLEAN:
542 item_make("[%c]", val == no ? ' ' : '*'); 542 item_make("[%c]", val == no ? ' ' : '*');
@@ -587,7 +587,7 @@ static void build_conf(struct menu *menu)
587 } else { 587 } else {
588 switch (type) { 588 switch (type) {
589 case S_BOOLEAN: 589 case S_BOOLEAN:
590 if (sym_is_changable(sym)) 590 if (sym_is_changeable(sym))
591 item_make("[%c]", val == no ? ' ' : '*'); 591 item_make("[%c]", val == no ? ' ' : '*');
592 else 592 else
593 item_make("-%c-", val == no ? ' ' : '*'); 593 item_make("-%c-", val == no ? ' ' : '*');
@@ -600,7 +600,7 @@ static void build_conf(struct menu *menu)
600 case mod: ch = 'M'; break; 600 case mod: ch = 'M'; break;
601 default: ch = ' '; break; 601 default: ch = ' '; break;
602 } 602 }
603 if (sym_is_changable(sym)) { 603 if (sym_is_changeable(sym)) {
604 if (sym->rev_dep.tri == mod) 604 if (sym->rev_dep.tri == mod)
605 item_make("{%c}", ch); 605 item_make("{%c}", ch);
606 else 606 else
@@ -617,7 +617,7 @@ static void build_conf(struct menu *menu)
617 if (tmp < 0) 617 if (tmp < 0)
618 tmp = 0; 618 tmp = 0;
619 item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu), 619 item_add_str("%*c%s%s", tmp, ' ', menu_get_prompt(menu),
620 (sym_has_value(sym) || !sym_is_changable(sym)) ? 620 (sym_has_value(sym) || !sym_is_changeable(sym)) ?
621 "" : " (NEW)"); 621 "" : " (NEW)");
622 item_set_tag('s'); 622 item_set_tag('s');
623 item_set_data(menu); 623 item_set_data(menu);
@@ -625,7 +625,7 @@ static void build_conf(struct menu *menu)
625 } 625 }
626 } 626 }
627 item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), 627 item_add_str("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
628 (sym_has_value(sym) || !sym_is_changable(sym)) ? 628 (sym_has_value(sym) || !sym_is_changeable(sym)) ?
629 "" : " (NEW)"); 629 "" : " (NEW)");
630 if (menu->prompt->type == P_MENU) { 630 if (menu->prompt->type == P_MENU) {
631 item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->"); 631 item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->");
@@ -936,7 +936,7 @@ static void conf_save(void)
936 set_config_filename(dialog_input_result); 936 set_config_filename(dialog_input_result);
937 return; 937 return;
938 } 938 }
939 show_textbox(NULL, "Can't create file! Probably a nonexistent directory.", 5, 60); 939 show_textbox(NULL, "Can't create file!", 5, 60);
940 break; 940 break;
941 case 1: 941 case 1:
942 show_helptext("Save Alternate Configuration", save_config_help); 942 show_helptext("Save Alternate Configuration", save_config_help);
diff --git a/scripts/kconfig/nconf-cfg.sh b/scripts/kconfig/nconf-cfg.sh
index 001559ef0a60..001559ef0a60 100644..100755
--- a/scripts/kconfig/nconf-cfg.sh
+++ b/scripts/kconfig/nconf-cfg.sh
diff --git a/scripts/kconfig/nconf.c b/scripts/kconfig/nconf.c
index ac92c0ded6c5..b7c1ef757178 100644
--- a/scripts/kconfig/nconf.c
+++ b/scripts/kconfig/nconf.c
@@ -803,7 +803,7 @@ static void build_conf(struct menu *menu)
803 } 803 }
804 804
805 val = sym_get_tristate_value(sym); 805 val = sym_get_tristate_value(sym);
806 if (sym_is_changable(sym)) { 806 if (sym_is_changeable(sym)) {
807 switch (type) { 807 switch (type) {
808 case S_BOOLEAN: 808 case S_BOOLEAN:
809 item_make(menu, 't', "[%c]", 809 item_make(menu, 't', "[%c]",
@@ -857,7 +857,7 @@ static void build_conf(struct menu *menu)
857 } else { 857 } else {
858 switch (type) { 858 switch (type) {
859 case S_BOOLEAN: 859 case S_BOOLEAN:
860 if (sym_is_changable(sym)) 860 if (sym_is_changeable(sym))
861 item_make(menu, 't', "[%c]", 861 item_make(menu, 't', "[%c]",
862 val == no ? ' ' : '*'); 862 val == no ? ' ' : '*');
863 else 863 else
@@ -876,7 +876,7 @@ static void build_conf(struct menu *menu)
876 ch = ' '; 876 ch = ' ';
877 break; 877 break;
878 } 878 }
879 if (sym_is_changable(sym)) { 879 if (sym_is_changeable(sym)) {
880 if (sym->rev_dep.tri == mod) 880 if (sym->rev_dep.tri == mod)
881 item_make(menu, 881 item_make(menu,
882 't', "{%c}", ch); 882 't', "{%c}", ch);
@@ -896,14 +896,14 @@ static void build_conf(struct menu *menu)
896 item_add_str("%*c%s%s", tmp, ' ', 896 item_add_str("%*c%s%s", tmp, ' ',
897 menu_get_prompt(menu), 897 menu_get_prompt(menu),
898 (sym_has_value(sym) || 898 (sym_has_value(sym) ||
899 !sym_is_changable(sym)) ? "" : 899 !sym_is_changeable(sym)) ? "" :
900 " (NEW)"); 900 " (NEW)");
901 goto conf_childs; 901 goto conf_childs;
902 } 902 }
903 } 903 }
904 item_add_str("%*c%s%s", indent + 1, ' ', 904 item_add_str("%*c%s%s", indent + 1, ' ',
905 menu_get_prompt(menu), 905 menu_get_prompt(menu),
906 (sym_has_value(sym) || !sym_is_changable(sym)) ? 906 (sym_has_value(sym) || !sym_is_changeable(sym)) ?
907 "" : " (NEW)"); 907 "" : " (NEW)");
908 if (menu->prompt && menu->prompt->type == P_MENU) { 908 if (menu->prompt && menu->prompt->type == P_MENU) {
909 item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->"); 909 item_add_str(" %s", menu_is_empty(menu) ? "----" : "--->");
@@ -1438,8 +1438,7 @@ static void conf_save(void)
1438 set_config_filename(dialog_input_result); 1438 set_config_filename(dialog_input_result);
1439 return; 1439 return;
1440 } 1440 }
1441 btn_dialog(main_window, "Can't create file! " 1441 btn_dialog(main_window, "Can't create file!",
1442 "Probably a nonexistent directory.",
1443 1, "<OK>"); 1442 1, "<OK>");
1444 break; 1443 break;
1445 case 1: 1444 case 1:
diff --git a/scripts/kconfig/preprocess.c b/scripts/kconfig/preprocess.c
index 592dfbfa9fb3..0243086fb168 100644
--- a/scripts/kconfig/preprocess.c
+++ b/scripts/kconfig/preprocess.c
@@ -15,6 +15,7 @@
15#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0])) 15#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
16 16
17static char *expand_string_with_args(const char *in, int argc, char *argv[]); 17static char *expand_string_with_args(const char *in, int argc, char *argv[]);
18static char *expand_string(const char *in);
18 19
19static void __attribute__((noreturn)) pperror(const char *format, ...) 20static void __attribute__((noreturn)) pperror(const char *format, ...)
20{ 21{
@@ -550,7 +551,7 @@ static char *expand_string_with_args(const char *in, int argc, char *argv[])
550 return __expand_string(&in, is_end_of_str, argc, argv); 551 return __expand_string(&in, is_end_of_str, argc, argv);
551} 552}
552 553
553char *expand_string(const char *in) 554static char *expand_string(const char *in)
554{ 555{
555 return expand_string_with_args(in, 0, NULL); 556 return expand_string_with_args(in, 0, NULL);
556} 557}
diff --git a/scripts/kconfig/qconf.cc b/scripts/kconfig/qconf.cc
index ce7fc87a49a7..82773cc35d35 100644
--- a/scripts/kconfig/qconf.cc
+++ b/scripts/kconfig/qconf.cc
@@ -152,7 +152,7 @@ void ConfigItem::updateMenu(void)
152 case S_TRISTATE: 152 case S_TRISTATE:
153 char ch; 153 char ch;
154 154
155 if (!sym_is_changable(sym) && list->optMode == normalOpt) { 155 if (!sym_is_changeable(sym) && list->optMode == normalOpt) {
156 setPixmap(promptColIdx, QIcon()); 156 setPixmap(promptColIdx, QIcon());
157 setText(noColIdx, QString::null); 157 setText(noColIdx, QString::null);
158 setText(modColIdx, QString::null); 158 setText(modColIdx, QString::null);
diff --git a/scripts/kconfig/symbol.c b/scripts/kconfig/symbol.c
index 1f9266dadedf..f56eec5ea4c7 100644
--- a/scripts/kconfig/symbol.c
+++ b/scripts/kconfig/symbol.c
@@ -785,7 +785,7 @@ const char *sym_get_string_value(struct symbol *sym)
785 return (const char *)sym->curr.val; 785 return (const char *)sym->curr.val;
786} 786}
787 787
788bool sym_is_changable(struct symbol *sym) 788bool sym_is_changeable(struct symbol *sym)
789{ 789{
790 return sym->visible > sym->rev_dep.tri; 790 return sym->visible > sym->rev_dep.tri;
791} 791}
@@ -1114,7 +1114,7 @@ static void sym_check_print_recursive(struct symbol *last_sym)
1114 } 1114 }
1115 1115
1116 fprintf(stderr, 1116 fprintf(stderr,
1117 "For a resolution refer to Documentation/kbuild/kconfig-language.txt\n" 1117 "For a resolution refer to Documentation/kbuild/kconfig-language.rst\n"
1118 "subsection \"Kconfig recursive dependency limitations\"\n" 1118 "subsection \"Kconfig recursive dependency limitations\"\n"
1119 "\n"); 1119 "\n");
1120 1120
diff --git a/scripts/kconfig/tests/err_recursive_dep/expected_stderr b/scripts/kconfig/tests/err_recursive_dep/expected_stderr
index 84679b104655..c9f4abf9a791 100644
--- a/scripts/kconfig/tests/err_recursive_dep/expected_stderr
+++ b/scripts/kconfig/tests/err_recursive_dep/expected_stderr
@@ -1,38 +1,38 @@
1Kconfig:11:error: recursive dependency detected! 1Kconfig:11:error: recursive dependency detected!
2Kconfig:11: symbol B is selected by B 2Kconfig:11: symbol B is selected by B
3For a resolution refer to Documentation/kbuild/kconfig-language.txt 3For a resolution refer to Documentation/kbuild/kconfig-language.rst
4subsection "Kconfig recursive dependency limitations" 4subsection "Kconfig recursive dependency limitations"
5 5
6Kconfig:5:error: recursive dependency detected! 6Kconfig:5:error: recursive dependency detected!
7Kconfig:5: symbol A depends on A 7Kconfig:5: symbol A depends on A
8For a resolution refer to Documentation/kbuild/kconfig-language.txt 8For a resolution refer to Documentation/kbuild/kconfig-language.rst
9subsection "Kconfig recursive dependency limitations" 9subsection "Kconfig recursive dependency limitations"
10 10
11Kconfig:17:error: recursive dependency detected! 11Kconfig:17:error: recursive dependency detected!
12Kconfig:17: symbol C1 depends on C2 12Kconfig:17: symbol C1 depends on C2
13Kconfig:21: symbol C2 depends on C1 13Kconfig:21: symbol C2 depends on C1
14For a resolution refer to Documentation/kbuild/kconfig-language.txt 14For a resolution refer to Documentation/kbuild/kconfig-language.rst
15subsection "Kconfig recursive dependency limitations" 15subsection "Kconfig recursive dependency limitations"
16 16
17Kconfig:32:error: recursive dependency detected! 17Kconfig:32:error: recursive dependency detected!
18Kconfig:32: symbol D2 is selected by D1 18Kconfig:32: symbol D2 is selected by D1
19Kconfig:27: symbol D1 depends on D2 19Kconfig:27: symbol D1 depends on D2
20For a resolution refer to Documentation/kbuild/kconfig-language.txt 20For a resolution refer to Documentation/kbuild/kconfig-language.rst
21subsection "Kconfig recursive dependency limitations" 21subsection "Kconfig recursive dependency limitations"
22 22
23Kconfig:37:error: recursive dependency detected! 23Kconfig:37:error: recursive dependency detected!
24Kconfig:37: symbol E1 depends on E2 24Kconfig:37: symbol E1 depends on E2
25Kconfig:42: symbol E2 is implied by E1 25Kconfig:42: symbol E2 is implied by E1
26For a resolution refer to Documentation/kbuild/kconfig-language.txt 26For a resolution refer to Documentation/kbuild/kconfig-language.rst
27subsection "Kconfig recursive dependency limitations" 27subsection "Kconfig recursive dependency limitations"
28 28
29Kconfig:60:error: recursive dependency detected! 29Kconfig:60:error: recursive dependency detected!
30Kconfig:60: symbol G depends on G 30Kconfig:60: symbol G depends on G
31For a resolution refer to Documentation/kbuild/kconfig-language.txt 31For a resolution refer to Documentation/kbuild/kconfig-language.rst
32subsection "Kconfig recursive dependency limitations" 32subsection "Kconfig recursive dependency limitations"
33 33
34Kconfig:51:error: recursive dependency detected! 34Kconfig:51:error: recursive dependency detected!
35Kconfig:51: symbol F2 depends on F1 35Kconfig:51: symbol F2 depends on F1
36Kconfig:49: symbol F1 default value contains F2 36Kconfig:49: symbol F1 default value contains F2
37For a resolution refer to Documentation/kbuild/kconfig-language.txt 37For a resolution refer to Documentation/kbuild/kconfig-language.rst
38subsection "Kconfig recursive dependency limitations" 38subsection "Kconfig recursive dependency limitations"
diff --git a/scripts/kconfig/tests/err_recursive_inc/Kconfig b/scripts/kconfig/tests/err_recursive_inc/Kconfig
index 0e4c8750ab65..c6f4adec76d1 100644
--- a/scripts/kconfig/tests/err_recursive_inc/Kconfig
+++ b/scripts/kconfig/tests/err_recursive_inc/Kconfig
@@ -1 +1,2 @@
1# SPDX-License-Identifier: GPL-2.0-only
1source "Kconfig.inc1" 2source "Kconfig.inc1"
diff --git a/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1 b/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1
index 00e408d653fc..01cbf0d69cce 100644
--- a/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1
+++ b/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc1
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0-only
1 2
2 3
3 4
diff --git a/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2 b/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2
index 349ea2db15dc..82351075ab1b 100644
--- a/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2
+++ b/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc2
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0-only
1 2
2 3
3source "Kconfig.inc3" 4source "Kconfig.inc3"
diff --git a/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3 b/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3
index 0e4c8750ab65..c6f4adec76d1 100644
--- a/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3
+++ b/scripts/kconfig/tests/err_recursive_inc/Kconfig.inc3
@@ -1 +1,2 @@
1# SPDX-License-Identifier: GPL-2.0-only
1source "Kconfig.inc1" 2source "Kconfig.inc1"
diff --git a/scripts/kconfig/tests/err_recursive_inc/expected_stderr b/scripts/kconfig/tests/err_recursive_inc/expected_stderr
index 6b582eee2176..b070a31fdfeb 100644
--- a/scripts/kconfig/tests/err_recursive_inc/expected_stderr
+++ b/scripts/kconfig/tests/err_recursive_inc/expected_stderr
@@ -1,6 +1,6 @@
1Recursive inclusion detected. 1Recursive inclusion detected.
2Inclusion path: 2Inclusion path:
3 current file : Kconfig.inc1 3 current file : Kconfig.inc1
4 included from: Kconfig.inc3:1 4 included from: Kconfig.inc3:2
5 included from: Kconfig.inc2:3 5 included from: Kconfig.inc2:4
6 included from: Kconfig.inc1:4 6 included from: Kconfig.inc1:5
diff --git a/scripts/kernel-doc b/scripts/kernel-doc
index 3350e498b4ce..6b03012750da 100755
--- a/scripts/kernel-doc
+++ b/scripts/kernel-doc
@@ -249,7 +249,7 @@ my @highlights_rst = (
249 [$type_member_func, "\\:c\\:type\\:`\$1\$2\$3\\\\(\\\\) <\$1>`"], 249 [$type_member_func, "\\:c\\:type\\:`\$1\$2\$3\\\\(\\\\) <\$1>`"],
250 [$type_member, "\\:c\\:type\\:`\$1\$2\$3 <\$1>`"], 250 [$type_member, "\\:c\\:type\\:`\$1\$2\$3 <\$1>`"],
251 [$type_fp_param, "**\$1\\\\(\\\\)**"], 251 [$type_fp_param, "**\$1\\\\(\\\\)**"],
252 [$type_func, "\\:c\\:func\\:`\$1()`"], 252 [$type_func, "\$1()"],
253 [$type_enum, "\\:c\\:type\\:`\$1 <\$2>`"], 253 [$type_enum, "\\:c\\:type\\:`\$1 <\$2>`"],
254 [$type_struct, "\\:c\\:type\\:`\$1 <\$2>`"], 254 [$type_struct, "\\:c\\:type\\:`\$1 <\$2>`"],
255 [$type_typedef, "\\:c\\:type\\:`\$1 <\$2>`"], 255 [$type_typedef, "\\:c\\:type\\:`\$1 <\$2>`"],
@@ -285,7 +285,7 @@ use constant {
285 OUTPUT_INTERNAL => 4, # output non-exported symbols 285 OUTPUT_INTERNAL => 4, # output non-exported symbols
286}; 286};
287my $output_selection = OUTPUT_ALL; 287my $output_selection = OUTPUT_ALL;
288my $show_not_found = 0; 288my $show_not_found = 0; # No longer used
289 289
290my @export_file_list; 290my @export_file_list;
291 291
@@ -435,7 +435,7 @@ while ($ARGV[0] =~ m/^--?(.*)/) {
435 } elsif ($cmd eq 'enable-lineno') { 435 } elsif ($cmd eq 'enable-lineno') {
436 $enable_lineno = 1; 436 $enable_lineno = 1;
437 } elsif ($cmd eq 'show-not-found') { 437 } elsif ($cmd eq 'show-not-found') {
438 $show_not_found = 1; 438 $show_not_found = 1; # A no-op but don't fail
439 } else { 439 } else {
440 # Unknown argument 440 # Unknown argument
441 usage(); 441 usage();
@@ -2163,12 +2163,14 @@ sub process_file($) {
2163 } 2163 }
2164 2164
2165 # Make sure we got something interesting. 2165 # Make sure we got something interesting.
2166 if ($initial_section_counter == $section_counter) { 2166 if ($initial_section_counter == $section_counter && $
2167 if ($output_mode ne "none") { 2167 output_mode ne "none") {
2168 print STDERR "${file}:1: warning: no structured comments found\n"; 2168 if ($output_selection == OUTPUT_INCLUDE) {
2169 print STDERR "${file}:1: warning: '$_' not found\n"
2170 for keys %function_table;
2169 } 2171 }
2170 if (($output_selection == OUTPUT_INCLUDE) && ($show_not_found == 1)) { 2172 else {
2171 print STDERR " Was looking for '$_'.\n" for keys %function_table; 2173 print STDERR "${file}:1: warning: no structured comments found\n";
2172 } 2174 }
2173 } 2175 }
2174} 2176}
diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl
index ef9e5b2a1614..b2d8b8aa2d99 100755
--- a/scripts/leaking_addresses.pl
+++ b/scripts/leaking_addresses.pl
@@ -1,7 +1,7 @@
1#!/usr/bin/env perl 1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0-only
2# 3#
3# (c) 2017 Tobin C. Harding <me@tobin.cc> 4# (c) 2017 Tobin C. Harding <me@tobin.cc>
4# Licensed under the terms of the GNU GPL License version 2
5# 5#
6# leaking_addresses.pl: Scan the kernel for potential leaking addresses. 6# leaking_addresses.pl: Scan the kernel for potential leaking addresses.
7# - Scans dmesg output. 7# - Scans dmesg output.
diff --git a/scripts/markup_oops.pl b/scripts/markup_oops.pl
index 70dcfb6b3de1..e476caf52414 100755
--- a/scripts/markup_oops.pl
+++ b/scripts/markup_oops.pl
@@ -1,4 +1,5 @@
1#!/usr/bin/env perl 1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3use File::Basename; 4use File::Basename;
4use Math::BigInt; 5use Math::BigInt;
@@ -8,10 +9,6 @@ use Getopt::Long;
8# 9#
9# This file is part of the Linux kernel 10# This file is part of the Linux kernel
10# 11#
11# This program file is free software; you can redistribute it and/or modify it
12# under the terms of the GNU General Public License as published by the
13# Free Software Foundation; version 2 of the License.
14#
15# Authors: 12# Authors:
16# Arjan van de Ven <arjan@linux.intel.com> 13# Arjan van de Ven <arjan@linux.intel.com>
17 14
diff --git a/scripts/modules-check.sh b/scripts/modules-check.sh
new file mode 100755
index 000000000000..39e8cb36ba19
--- /dev/null
+++ b/scripts/modules-check.sh
@@ -0,0 +1,16 @@
1#!/bin/sh
2# SPDX-License-Identifier: GPL-2.0
3
4set -e
5
6# Check uniqueness of module names
7check_same_name_modules()
8{
9 for m in $(sed 's:.*/::' modules.order | sort | uniq -d)
10 do
11 echo "warning: same module names found:" >&2
12 sed -n "/\/$m/s:^kernel/: :p" modules.order >&2
13 done
14}
15
16check_same_name_modules
diff --git a/scripts/objdiff b/scripts/objdiff
index 4fb5d6796893..72b0b63c3fe1 100755
--- a/scripts/objdiff
+++ b/scripts/objdiff
@@ -1,11 +1,11 @@
1#!/bin/bash 1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3# objdiff - a small script for validating that a commit or series of commits 4# objdiff - a small script for validating that a commit or series of commits
4# didn't change object code. 5# didn't change object code.
5# 6#
6# Copyright 2014, Jason Cooper <jason@lakedaemon.net> 7# Copyright 2014, Jason Cooper <jason@lakedaemon.net>
7# 8#
8# Licensed under the terms of the GNU GPL version 2
9 9
10# usage example: 10# usage example:
11# 11#
diff --git a/scripts/package/Makefile b/scripts/package/Makefile
index 2c6de21e5152..ca7f46b562a4 100644
--- a/scripts/package/Makefile
+++ b/scripts/package/Makefile
@@ -1,3 +1,4 @@
1# SPDX-License-Identifier: GPL-2.0-only
1# Makefile for the different targets used to generate full packages of a kernel 2# Makefile for the different targets used to generate full packages of a kernel
2# It uses the generic clean infrastructure of kbuild 3# It uses the generic clean infrastructure of kbuild
3 4
@@ -103,7 +104,7 @@ clean-dirs += $(objtree)/snap/
103# --------------------------------------------------------------------------- 104# ---------------------------------------------------------------------------
104tar%pkg: FORCE 105tar%pkg: FORCE
105 $(MAKE) -f $(srctree)/Makefile 106 $(MAKE) -f $(srctree)/Makefile
106 $(CONFIG_SHELL) $(srctree)/scripts/package/buildtar $@ 107 +$(CONFIG_SHELL) $(srctree)/scripts/package/buildtar $@
107 108
108clean-dirs += $(objtree)/tar-install/ 109clean-dirs += $(objtree)/tar-install/
109 110
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
index b03dd56a4782..e8ca6dc97e96 100755
--- a/scripts/package/builddeb
+++ b/scripts/package/builddeb
@@ -130,7 +130,7 @@ if is_enabled CONFIG_MODULES; then
130fi 130fi
131 131
132if [ "$ARCH" != "um" ]; then 132if [ "$ARCH" != "um" ]; then
133 $MAKE -f $srctree/Makefile headers_check 133 $MAKE -f $srctree/Makefile headers
134 $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr" 134 $MAKE -f $srctree/Makefile headers_install INSTALL_HDR_PATH="$libc_headers_dir/usr"
135fi 135fi
136 136
diff --git a/scripts/package/mkspec b/scripts/package/mkspec
index 009147d4718e..2d29df4a0a53 100755
--- a/scripts/package/mkspec
+++ b/scripts/package/mkspec
@@ -31,7 +31,7 @@ PROVIDES="$PROVIDES kernel-$KERNELRELEASE"
31__KERNELRELEASE=$(echo $KERNELRELEASE | sed -e "s/-/_/g") 31__KERNELRELEASE=$(echo $KERNELRELEASE | sed -e "s/-/_/g")
32EXCLUDES="$RCS_TAR_IGNORE --exclude=.tmp_versions --exclude=*vmlinux* \ 32EXCLUDES="$RCS_TAR_IGNORE --exclude=.tmp_versions --exclude=*vmlinux* \
33--exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation \ 33--exclude=*.o --exclude=*.ko --exclude=*.cmd --exclude=Documentation \
34--exclude=.config.old --exclude=.missing-syscalls.d" 34--exclude=.config.old --exclude=.missing-syscalls.d --exclude=*.s"
35 35
36# We can label the here-doc lines for conditional output to the spec file 36# We can label the here-doc lines for conditional output to the spec file
37# 37#
diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c
index a50a2aa963ad..8387a9bc064a 100644
--- a/scripts/recordmcount.c
+++ b/scripts/recordmcount.c
@@ -1,8 +1,8 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/* 2/*
2 * recordmcount.c: construct a table of the locations of calls to 'mcount' 3 * recordmcount.c: construct a table of the locations of calls to 'mcount'
3 * so that ftrace can find them quickly. 4 * so that ftrace can find them quickly.
4 * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved. 5 * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved.
5 * Licensed under the GNU General Public License, version 2 (GPLv2).
6 * 6 *
7 * Restructured to fit Linux format, as well as other updates: 7 * Restructured to fit Linux format, as well as other updates:
8 * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. 8 * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h
index 2e7793735e14..13c5e6c8829c 100644
--- a/scripts/recordmcount.h
+++ b/scripts/recordmcount.h
@@ -1,3 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
1/* 2/*
2 * recordmcount.h 3 * recordmcount.h
3 * 4 *
@@ -15,8 +16,6 @@
15 * 16 *
16 * This conversion to macros was done by: 17 * This conversion to macros was done by:
17 * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. 18 * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
18 *
19 * Licensed under the GNU General Public License, version 2 (GPLv2).
20 */ 19 */
21#undef append_func 20#undef append_func
22#undef is_fake_mcount 21#undef is_fake_mcount
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
index d24759214efd..3f77a5d695c1 100755
--- a/scripts/recordmcount.pl
+++ b/scripts/recordmcount.pl
@@ -1,6 +1,6 @@
1#!/usr/bin/env perl 1#!/usr/bin/env perl
2# SPDX-License-Identifier: GPL-2.0-only
2# (c) 2008, Steven Rostedt <srostedt@redhat.com> 3# (c) 2008, Steven Rostedt <srostedt@redhat.com>
3# Licensed under the terms of the GNU GPL License version 2
4# 4#
5# recordmcount.pl - makes a section called __mcount_loc that holds 5# recordmcount.pl - makes a section called __mcount_loc that holds
6# all the offsets to the calls to mcount. 6# all the offsets to the calls to mcount.
diff --git a/scripts/selinux/Makefile b/scripts/selinux/Makefile
index b3048b894a39..59494e14989b 100644
--- a/scripts/selinux/Makefile
+++ b/scripts/selinux/Makefile
@@ -1 +1,2 @@
1# SPDX-License-Identifier: GPL-2.0-only
1subdir-y := mdp genheaders 2subdir-y := mdp genheaders
diff --git a/scripts/selinux/mdp/mdp.c b/scripts/selinux/mdp/mdp.c
index 18fd6143888b..576d11a60417 100644
--- a/scripts/selinux/mdp/mdp.c
+++ b/scripts/selinux/mdp/mdp.c
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-or-later
1/* 2/*
2 * 3 *
3 * mdp - make dummy policy 4 * mdp - make dummy policy
@@ -5,20 +6,6 @@
5 * When pointed at a kernel tree, builds a dummy policy for that kernel 6 * When pointed at a kernel tree, builds a dummy policy for that kernel
6 * with exactly one type with full rights to itself. 7 * with exactly one type with full rights to itself.
7 * 8 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 *
22 * Copyright (C) IBM Corporation, 2006 9 * Copyright (C) IBM Corporation, 2006
23 * 10 *
24 * Authors: Serge E. Hallyn <serue@us.ibm.com> 11 * Authors: Serge E. Hallyn <serue@us.ibm.com>
diff --git a/scripts/show_delta b/scripts/show_delta
index 5b365009e6a3..264399307c4f 100755
--- a/scripts/show_delta
+++ b/scripts/show_delta
@@ -1,4 +1,5 @@
1#!/usr/bin/python 1#!/usr/bin/python
2# SPDX-License-Identifier: GPL-2.0-only
2# 3#
3# show_deltas: Read list of printk messages instrumented with 4# show_deltas: Read list of printk messages instrumented with
4# time data, and format with time deltas. 5# time data, and format with time deltas.
@@ -7,7 +8,6 @@
7# 8#
8# Copyright 2003 Sony Corporation 9# Copyright 2003 Sony Corporation
9# 10#
10# GPL 2.0 applies.
11 11
12import sys 12import sys
13import string 13import string
diff --git a/scripts/sortextable.c b/scripts/sortextable.c
index 365a907f98b3..55768654e3c6 100644
--- a/scripts/sortextable.c
+++ b/scripts/sortextable.c
@@ -1,3 +1,4 @@
1// SPDX-License-Identifier: GPL-2.0-only
1/* 2/*
2 * sortextable.c: Sort the kernel's exception table 3 * sortextable.c: Sort the kernel's exception table
3 * 4 *
@@ -6,7 +7,6 @@
6 * Based on code taken from recortmcount.c which is: 7 * Based on code taken from recortmcount.c which is:
7 * 8 *
8 * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved. 9 * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved.
9 * Licensed under the GNU General Public License, version 2 (GPLv2).
10 * 10 *
11 * Restructured to fit Linux format, as well as other updates: 11 * Restructured to fit Linux format, as well as other updates:
12 * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. 12 * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
diff --git a/scripts/sortextable.h b/scripts/sortextable.h
index ba8700428e21..d4b3f6c40f02 100644
--- a/scripts/sortextable.h
+++ b/scripts/sortextable.h
@@ -1,3 +1,4 @@
1/* SPDX-License-Identifier: GPL-2.0-only */
1/* 2/*
2 * sortextable.h 3 * sortextable.h
3 * 4 *
@@ -7,9 +8,6 @@
7 * 8 *
8 * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved. 9 * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved.
9 * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. 10 * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc.
10 *
11 *
12 * Licensed under the GNU General Public License, version 2 (GPLv2).
13 */ 11 */
14 12
15#undef extable_ent_size 13#undef extable_ent_size
diff --git a/scripts/spdxcheck.py b/scripts/spdxcheck.py
index 4fe392e507fb..6374e078a5f2 100755
--- a/scripts/spdxcheck.py
+++ b/scripts/spdxcheck.py
@@ -32,7 +32,8 @@ class SPDXdata(object):
32def read_spdxdata(repo): 32def read_spdxdata(repo):
33 33
34 # The subdirectories of LICENSES in the kernel source 34 # The subdirectories of LICENSES in the kernel source
35 license_dirs = [ "preferred", "other", "exceptions" ] 35 # Note: exceptions needs to be parsed as last directory.
36 license_dirs = [ "preferred", "dual", "deprecated", "exceptions" ]
36 lictree = repo.head.commit.tree['LICENSES'] 37 lictree = repo.head.commit.tree['LICENSES']
37 38
38 spdx = SPDXdata() 39 spdx = SPDXdata()
@@ -58,13 +59,13 @@ def read_spdxdata(repo):
58 elif l.startswith('SPDX-Licenses:'): 59 elif l.startswith('SPDX-Licenses:'):
59 for lic in l.split(':')[1].upper().strip().replace(' ', '').replace('\t', '').split(','): 60 for lic in l.split(':')[1].upper().strip().replace(' ', '').replace('\t', '').split(','):
60 if not lic in spdx.licenses: 61 if not lic in spdx.licenses:
61 raise SPDXException(None, 'Exception %s missing license %s' %(ex, lic)) 62 raise SPDXException(None, 'Exception %s missing license %s' %(exception, lic))
62 spdx.exceptions[exception].append(lic) 63 spdx.exceptions[exception].append(lic)
63 64
64 elif l.startswith("License-Text:"): 65 elif l.startswith("License-Text:"):
65 if exception: 66 if exception:
66 if not len(spdx.exceptions[exception]): 67 if not len(spdx.exceptions[exception]):
67 raise SPDXException(el, 'Exception %s is missing SPDX-Licenses' %excid) 68 raise SPDXException(el, 'Exception %s is missing SPDX-Licenses' %exception)
68 spdx.exception_files += 1 69 spdx.exception_files += 1
69 else: 70 else:
70 spdx.license_files += 1 71 spdx.license_files += 1
diff --git a/scripts/spelling.txt b/scripts/spelling.txt
index 86b87332b9e5..de75b9feaaed 100644
--- a/scripts/spelling.txt
+++ b/scripts/spelling.txt
@@ -41,6 +41,7 @@ accquired||acquired
41accross||across 41accross||across
42acessable||accessible 42acessable||accessible
43acess||access 43acess||access
44acessing||accessing
44achitecture||architecture 45achitecture||architecture
45acient||ancient 46acient||ancient
46acitions||actions 47acitions||actions
@@ -54,6 +55,7 @@ activete||activate
54actived||activated 55actived||activated
55actualy||actually 56actualy||actually
56acumulating||accumulating 57acumulating||accumulating
58acumulative||accumulative
57acumulator||accumulator 59acumulator||accumulator
58adapater||adapter 60adapater||adapter
59addional||additional 61addional||additional
@@ -103,6 +105,7 @@ alogrithm||algorithm
103alot||a lot 105alot||a lot
104alow||allow 106alow||allow
105alows||allows 107alows||allows
108alredy||already
106altough||although 109altough||although
107alue||value 110alue||value
108ambigious||ambiguous 111ambigious||ambiguous
@@ -223,6 +226,7 @@ boardcast||broadcast
223borad||board 226borad||board
224boundry||boundary 227boundry||boundary
225brievely||briefly 228brievely||briefly
229brigde||bridge
226broadcase||broadcast 230broadcase||broadcast
227broadcat||broadcast 231broadcat||broadcast
228bufufer||buffer 232bufufer||buffer
@@ -239,6 +243,7 @@ calulate||calculate
239cancelation||cancellation 243cancelation||cancellation
240cancle||cancel 244cancle||cancel
241capabilites||capabilities 245capabilites||capabilities
246capabilties||capabilities
242capabilty||capability 247capabilty||capability
243capabitilies||capabilities 248capabitilies||capabilities
244capablity||capability 249capablity||capability
@@ -325,6 +330,7 @@ conector||connector
325connecetd||connected 330connecetd||connected
326configuartion||configuration 331configuartion||configuration
327configuation||configuration 332configuation||configuration
333configued||configured
328configuratoin||configuration 334configuratoin||configuration
329configuraton||configuration 335configuraton||configuration
330configuretion||configuration 336configuretion||configuration
@@ -407,6 +413,7 @@ depreacte||deprecate
407desactivate||deactivate 413desactivate||deactivate
408desciptor||descriptor 414desciptor||descriptor
409desciptors||descriptors 415desciptors||descriptors
416descripto||descriptor
410descripton||description 417descripton||description
411descrition||description 418descrition||description
412descritptor||descriptor 419descritptor||descriptor
@@ -432,6 +439,7 @@ deveolpment||development
432devided||divided 439devided||divided
433deviece||device 440deviece||device
434diable||disable 441diable||disable
442dicline||decline
435dictionnary||dictionary 443dictionnary||dictionary
436didnt||didn't 444didnt||didn't
437diferent||different 445diferent||different
@@ -461,6 +469,7 @@ disharge||discharge
461disnabled||disabled 469disnabled||disabled
462dispertion||dispersion 470dispertion||dispersion
463dissapears||disappears 471dissapears||disappears
472dissconect||disconnect
464distiction||distinction 473distiction||distinction
465divisable||divisible 474divisable||divisible
466divsiors||divisors 475divsiors||divisors
@@ -469,11 +478,14 @@ documantation||documentation
469documentaion||documentation 478documentaion||documentation
470documment||document 479documment||document
471doesnt||doesn't 480doesnt||doesn't
481donwload||download
482donwloading||downloading
472dorp||drop 483dorp||drop
473dosen||doesn 484dosen||doesn
474downlad||download 485downlad||download
475downlads||downloads 486downlads||downloads
476droped||dropped 487droped||dropped
488droput||dropout
477druing||during 489druing||during
478dynmaic||dynamic 490dynmaic||dynamic
479eanable||enable 491eanable||enable
@@ -482,6 +494,7 @@ ecspecially||especially
482edditable||editable 494edditable||editable
483editting||editing 495editting||editing
484efective||effective 496efective||effective
497effectivness||effectiveness
485efficently||efficiently 498efficently||efficiently
486ehther||ether 499ehther||ether
487eigth||eight 500eigth||eight
@@ -543,6 +556,7 @@ extensability||extensibility
543extention||extension 556extention||extension
544extenstion||extension 557extenstion||extension
545extracter||extractor 558extracter||extractor
559faied||failed
546faield||failed 560faield||failed
547falied||failed 561falied||failed
548faild||failed 562faild||failed
@@ -567,6 +581,7 @@ fetaures||features
567fileystem||filesystem 581fileystem||filesystem
568fimware||firmware 582fimware||firmware
569firmare||firmware 583firmare||firmware
584firmaware||firmware
570firware||firmware 585firware||firmware
571finanize||finalize 586finanize||finalize
572findn||find 587findn||find
@@ -601,6 +616,8 @@ funtions||functions
601furthur||further 616furthur||further
602futhermore||furthermore 617futhermore||furthermore
603futrue||future 618futrue||future
619gatable||gateable
620gateing||gating
604gauage||gauge 621gauage||gauge
605gaurenteed||guaranteed 622gaurenteed||guaranteed
606generiously||generously 623generiously||generously
@@ -641,9 +658,11 @@ iomaped||iomapped
641imblance||imbalance 658imblance||imbalance
642immeadiately||immediately 659immeadiately||immediately
643immedaite||immediate 660immedaite||immediate
661immedate||immediate
644immediatelly||immediately 662immediatelly||immediately
645immediatly||immediately 663immediatly||immediately
646immidiate||immediate 664immidiate||immediate
665immutible||immutable
647impelentation||implementation 666impelentation||implementation
648impementated||implemented 667impementated||implemented
649implemantation||implementation 668implemantation||implementation
@@ -661,10 +680,12 @@ incative||inactive
661incomming||incoming 680incomming||incoming
662incompatabilities||incompatibilities 681incompatabilities||incompatibilities
663incompatable||incompatible 682incompatable||incompatible
683incompatble||incompatible
664inconsistant||inconsistent 684inconsistant||inconsistent
665increas||increase 685increas||increase
666incremeted||incremented 686incremeted||incremented
667incrment||increment 687incrment||increment
688inculde||include
668indendation||indentation 689indendation||indentation
669indended||intended 690indended||intended
670independant||independent 691independant||independent
@@ -778,6 +799,7 @@ libary||library
778librairies||libraries 799librairies||libraries
779libraris||libraries 800libraris||libraries
780licenceing||licencing 801licenceing||licencing
802logaritmic||logarithmic
781loggging||logging 803loggging||logging
782loggin||login 804loggin||login
783logile||logfile 805logile||logfile
@@ -832,6 +854,7 @@ mispelled||misspelled
832mispelt||misspelt 854mispelt||misspelt
833mising||missing 855mising||missing
834mismactch||mismatch 856mismactch||mismatch
857missign||missing
835missmanaged||mismanaged 858missmanaged||mismanaged
836missmatch||mismatch 859missmatch||mismatch
837miximum||maximum 860miximum||maximum
@@ -848,6 +871,7 @@ mopdule||module
848mroe||more 871mroe||more
849mulitplied||multiplied 872mulitplied||multiplied
850multidimensionnal||multidimensional 873multidimensionnal||multidimensional
874multipe||multiple
851multple||multiple 875multple||multiple
852mumber||number 876mumber||number
853muticast||multicast 877muticast||multicast
@@ -870,7 +894,9 @@ nescessary||necessary
870nessessary||necessary 894nessessary||necessary
871noticable||noticeable 895noticable||noticeable
872notications||notifications 896notications||notifications
897notifcations||notifications
873notifed||notified 898notifed||notified
899notity||notify
874numebr||number 900numebr||number
875numner||number 901numner||number
876obtaion||obtain 902obtaion||obtain
@@ -887,6 +913,7 @@ occuring||occurring
887offser||offset 913offser||offset
888offet||offset 914offet||offset
889offloded||offloaded 915offloded||offloaded
916offseting||offsetting
890omited||omitted 917omited||omitted
891omiting||omitting 918omiting||omitting
892omitt||omit 919omitt||omit
@@ -1009,6 +1036,8 @@ programers||programmers
1009programm||program 1036programm||program
1010programms||programs 1037programms||programs
1011progresss||progress 1038progresss||progress
1039prohibitted||prohibited
1040prohibitting||prohibiting
1012promiscous||promiscuous 1041promiscous||promiscuous
1013promps||prompts 1042promps||prompts
1014pronnounced||pronounced 1043pronnounced||pronounced
@@ -1023,6 +1052,7 @@ prosess||process
1023protable||portable 1052protable||portable
1024protcol||protocol 1053protcol||protocol
1025protecion||protection 1054protecion||protection
1055protedcted||protected
1026protocoll||protocol 1056protocoll||protocol
1027promixity||proximity 1057promixity||proximity
1028psudo||pseudo 1058psudo||pseudo
@@ -1037,6 +1067,7 @@ reasearcher||researcher
1037reasearchers||researchers 1067reasearchers||researchers
1038reasearch||research 1068reasearch||research
1039recepient||recipient 1069recepient||recipient
1070recevied||received
1040receving||receiving 1071receving||receiving
1041recieved||received 1072recieved||received
1042recieve||receive 1073recieve||receive
@@ -1110,6 +1141,7 @@ retreived||retrieved
1110retreive||retrieve 1141retreive||retrieve
1111retreiving||retrieving 1142retreiving||retrieving
1112retrive||retrieve 1143retrive||retrieve
1144retrived||retrieved
1113retuned||returned 1145retuned||returned
1114reudce||reduce 1146reudce||reduce
1115reuest||request 1147reuest||request
@@ -1145,7 +1177,6 @@ senarios||scenarios
1145sentivite||sensitive 1177sentivite||sensitive
1146separatly||separately 1178separatly||separately
1147sepcify||specify 1179sepcify||specify
1148sepc||spec
1149seperated||separated 1180seperated||separated
1150seperately||separately 1181seperately||separately
1151seperate||separate 1182seperate||separate
@@ -1177,6 +1208,7 @@ singaled||signaled
1177singal||signal 1208singal||signal
1178singed||signed 1209singed||signed
1179sleeped||slept 1210sleeped||slept
1211sliped||slipped
1180softwares||software 1212softwares||software
1181speach||speech 1213speach||speech
1182specfic||specific 1214specfic||specific
@@ -1283,6 +1315,7 @@ threds||threads
1283threshhold||threshold 1315threshhold||threshold
1284thresold||threshold 1316thresold||threshold
1285throught||through 1317throught||through
1318trackling||tracking
1286troughput||throughput 1319troughput||throughput
1287thses||these 1320thses||these
1288tiggers||triggers 1321tiggers||triggers
@@ -1409,5 +1442,6 @@ wnat||want
1409workarould||workaround 1442workarould||workaround
1410writeing||writing 1443writeing||writing
1411writting||writing 1444writting||writing
1445wtih||with
1412zombe||zombie 1446zombe||zombie
1413zomebie||zombie 1447zomebie||zombie
diff --git a/scripts/sphinx-pre-install b/scripts/sphinx-pre-install
index f6a5c0bae31e..f230e65329a2 100755
--- a/scripts/sphinx-pre-install
+++ b/scripts/sphinx-pre-install
@@ -1,20 +1,16 @@
1#!/usr/bin/perl 1#!/usr/bin/perl
2# SPDX-License-Identifier: GPL-2.0-or-later
2use strict; 3use strict;
3 4
4# Copyright (c) 2017 Mauro Carvalho Chehab <mchehab@kernel.org> 5# Copyright (c) 2017-2019 Mauro Carvalho Chehab <mchehab@kernel.org>
5# 6#
6# This program is free software; you can redistribute it and/or
7# modify it under the terms of the GNU General Public License
8# as published by the Free Software Foundation; either version 2
9# of the License, or (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15 7
16my $virtenv_dir = "sphinx_1.4"; 8my $prefix = "./";
17my $requirement_file = "Documentation/sphinx/requirements.txt"; 9$prefix = "$ENV{'srctree'}/" if ($ENV{'srctree'});
10
11my $conf = $prefix . "Documentation/conf.py";
12my $requirement_file = $prefix . "Documentation/sphinx/requirements.txt";
13my $virtenv_prefix = "sphinx_";
18 14
19# 15#
20# Static vars 16# Static vars
@@ -26,7 +22,10 @@ my $need = 0;
26my $optional = 0; 22my $optional = 0;
27my $need_symlink = 0; 23my $need_symlink = 0;
28my $need_sphinx = 0; 24my $need_sphinx = 0;
25my $rec_sphinx_upgrade = 0;
29my $install = ""; 26my $install = "";
27my $virtenv_dir = "";
28my $min_version;
30 29
31# 30#
32# Command line arguments 31# Command line arguments
@@ -34,6 +33,7 @@ my $install = "";
34 33
35my $pdf = 1; 34my $pdf = 1;
36my $virtualenv = 1; 35my $virtualenv = 1;
36my $version_check = 0;
37 37
38# 38#
39# List of required texlive packages on Fedora and OpenSuse 39# List of required texlive packages on Fedora and OpenSuse
@@ -201,13 +201,15 @@ sub check_missing_tex($)
201 } 201 }
202} 202}
203 203
204sub check_sphinx() 204sub get_sphinx_fname()
205{ 205{
206 return if findprog("sphinx-build"); 206 my $fname = "sphinx-build";
207 return $fname if findprog($fname);
207 208
208 if (findprog("sphinx-build-3")) { 209 $fname = "sphinx-build-3";
210 if (findprog($fname)) {
209 $need_symlink = 1; 211 $need_symlink = 1;
210 return; 212 return $fname;
211 } 213 }
212 214
213 if ($virtualenv) { 215 if ($virtualenv) {
@@ -219,6 +221,74 @@ sub check_sphinx()
219 } else { 221 } else {
220 add_package("python-sphinx", 0); 222 add_package("python-sphinx", 0);
221 } 223 }
224
225 return "";
226}
227
228sub check_sphinx()
229{
230 my $rec_version;
231 my $cur_version;
232
233 open IN, $conf or die "Can't open $conf";
234 while (<IN>) {
235 if (m/^\s*needs_sphinx\s*=\s*[\'\"]([\d\.]+)[\'\"]/) {
236 $min_version=$1;
237 last;
238 }
239 }
240 close IN;
241
242 die "Can't get needs_sphinx version from $conf" if (!$min_version);
243
244 open IN, $requirement_file or die "Can't open $requirement_file";
245 while (<IN>) {
246 if (m/^\s*Sphinx\s*==\s*([\d\.]+)$/) {
247 $rec_version=$1;
248 last;
249 }
250 }
251 close IN;
252
253 die "Can't get recommended sphinx version from $requirement_file" if (!$min_version);
254
255 $virtenv_dir = $virtenv_prefix . $rec_version;
256
257 my $sphinx = get_sphinx_fname();
258 return if ($sphinx eq "");
259
260 open IN, "$sphinx --version 2>&1 |" or die "$sphinx returned an error";
261 while (<IN>) {
262 if (m/^\s*sphinx-build\s+([\d\.]+)$/) {
263 $cur_version=$1;
264 last;
265 }
266 # Sphinx 1.2.x uses a different format
267 if (m/^\s*Sphinx.*\s+([\d\.]+)$/) {
268 $cur_version=$1;
269 last;
270 }
271 }
272 close IN;
273
274 die "$sphinx didn't return its version" if (!$cur_version);
275
276 if ($cur_version lt $min_version) {
277 printf "ERROR: Sphinx version is %s. It should be >= %s (recommended >= %s)\n",
278 $cur_version, $min_version, $rec_version;;
279 $need_sphinx = 1;
280 return;
281 }
282
283 if ($cur_version lt $rec_version) {
284 printf "Sphinx version %s\n", $cur_version;
285 print "Warning: It is recommended at least Sphinx version $rec_version.\n";
286 $rec_sphinx_upgrade = 1;
287 return;
288 }
289
290 # On version check mode, just assume Sphinx has all mandatory deps
291 exit (0) if ($version_check);
222} 292}
223 293
224# 294#
@@ -503,27 +573,18 @@ sub check_distros()
503 573
504sub check_needs() 574sub check_needs()
505{ 575{
576 # Check for needed programs/tools
577 check_sphinx();
578
506 if ($system_release) { 579 if ($system_release) {
507 print "Detected OS: $system_release.\n"; 580 print "Detected OS: $system_release.\n\n";
508 } else { 581 } else {
509 print "Unknown OS\n"; 582 print "Unknown OS\n\n";
510 } 583 }
511 584
512 # RHEL 7.x and clones have Sphinx version 1.1.x and incomplete texlive 585 print "To upgrade Sphinx, use:\n\n" if ($rec_sphinx_upgrade);
513 if (($system_release =~ /Red Hat Enterprise Linux/) ||
514 ($system_release =~ /CentOS/) ||
515 ($system_release =~ /Scientific Linux/) ||
516 ($system_release =~ /Oracle Linux Server/)) {
517 $virtualenv = 1;
518 $pdf = 0;
519
520 printf("NOTE: On this distro, Sphinx and TexLive shipped versions are incompatible\n");
521 printf("with doc build. So, use Sphinx via a Python virtual environment.\n\n");
522 printf("This script can't install a TexLive version that would provide PDF.\n");
523 }
524 586
525 # Check for needed programs/tools 587 # Check for needed programs/tools
526 check_sphinx();
527 check_perl_module("Pod::Usage", 0); 588 check_perl_module("Pod::Usage", 0);
528 check_program("make", 0); 589 check_program("make", 0);
529 check_program("gcc", 0); 590 check_program("gcc", 0);
@@ -540,26 +601,33 @@ sub check_needs()
540 printf "\tsudo ln -sf %s /usr/bin/sphinx-build\n\n", 601 printf "\tsudo ln -sf %s /usr/bin/sphinx-build\n\n",
541 which("sphinx-build-3"); 602 which("sphinx-build-3");
542 } 603 }
543 if ($need_sphinx) { 604 if ($need_sphinx || $rec_sphinx_upgrade) {
544 my $activate = "$virtenv_dir/bin/activate"; 605 my $min_activate = "$ENV{'PWD'}/${virtenv_prefix}${min_version}/bin/activate";
545 if (-e "$ENV{'PWD'}/$activate") { 606 my @activates = glob "$ENV{'PWD'}/${virtenv_prefix}*/bin/activate";
546 printf "\nNeed to activate virtualenv with:\n"; 607
547 printf "\t. $activate\n"; 608 @activates = sort {$b cmp $a} @activates;
609
610 if ($need_sphinx && scalar @activates > 0 && $activates[0] ge $min_activate) {
611 printf "\nNeed to activate a compatible Sphinx version on virtualenv with:\n";
612 printf "\t. $activates[0]\n";
613 exit (1);
548 } else { 614 } else {
615 my $rec_activate = "$virtenv_dir/bin/activate";
549 my $virtualenv = findprog("virtualenv-3"); 616 my $virtualenv = findprog("virtualenv-3");
550 $virtualenv = findprog("virtualenv-3.5") if (!$virtualenv); 617 $virtualenv = findprog("virtualenv-3.5") if (!$virtualenv);
551 $virtualenv = findprog("virtualenv") if (!$virtualenv); 618 $virtualenv = findprog("virtualenv") if (!$virtualenv);
552 $virtualenv = "virtualenv" if (!$virtualenv); 619 $virtualenv = "virtualenv" if (!$virtualenv);
553 620
554 printf "\t$virtualenv $virtenv_dir\n"; 621 printf "\t$virtualenv $virtenv_dir\n";
555 printf "\t. $activate\n"; 622 printf "\t. $rec_activate\n";
556 printf "\tpip install -r $requirement_file\n"; 623 printf "\tpip install -r $requirement_file\n";
557 $need++; 624
625 $need++ if (!$rec_sphinx_upgrade);
558 } 626 }
559 } 627 }
560 printf "\n"; 628 printf "\n";
561 629
562 print "All optional dependenties are met.\n" if (!$optional); 630 print "All optional dependencies are met.\n" if (!$optional);
563 631
564 if ($need == 1) { 632 if ($need == 1) {
565 die "Can't build as $need mandatory dependency is missing"; 633 die "Can't build as $need mandatory dependency is missing";
@@ -581,8 +649,14 @@ while (@ARGV) {
581 $virtualenv = 0; 649 $virtualenv = 0;
582 } elsif ($arg eq "--no-pdf"){ 650 } elsif ($arg eq "--no-pdf"){
583 $pdf = 0; 651 $pdf = 0;
652 } elsif ($arg eq "--version-check"){
653 $version_check = 1;
584 } else { 654 } else {
585 print "Usage:\n\t$0 <--no-virtualenv> <--no-pdf>\n\n"; 655 print "Usage:\n\t$0 <--no-virtualenv> <--no-pdf> <--version-check>\n\n";
656 print "Where:\n";
657 print "\t--no-virtualenv\t- Recommend installing Sphinx instead of using a virtualenv\n";
658 print "\t--version-check\t- if version is compatible, don't check for missing dependencies\n";
659 print "\t--no-pdf\t- don't check for dependencies required to build PDF docs\n\n";
586 exit -1; 660 exit -1;
587 } 661 }
588} 662}
diff --git a/scripts/tags.sh b/scripts/tags.sh
index 70e14c67bde7..4e18ae5282a6 100755
--- a/scripts/tags.sh
+++ b/scripts/tags.sh
@@ -1,11 +1,12 @@
1#!/bin/bash 1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0-only
2# Generate tags or cscope files 3# Generate tags or cscope files
3# Usage tags.sh <mode> 4# Usage tags.sh <mode>
4# 5#
5# mode may be any of: tags, TAGS, cscope 6# mode may be any of: tags, TAGS, cscope
6# 7#
7# Uses the following environment variables: 8# Uses the following environment variables:
8# ARCH, SUBARCH, SRCARCH, srctree, src, obj 9# SUBARCH, SRCARCH, srctree
9 10
10if [ "$KBUILD_VERBOSE" = "1" ]; then 11if [ "$KBUILD_VERBOSE" = "1" ]; then
11 set -x 12 set -x
@@ -16,8 +17,7 @@ ignore="$(echo "$RCS_FIND_IGNORE" | sed 's|\\||g' )"
16# tags and cscope files should also ignore MODVERSION *.mod.c files 17# tags and cscope files should also ignore MODVERSION *.mod.c files
17ignore="$ignore ( -name *.mod.c ) -prune -o" 18ignore="$ignore ( -name *.mod.c ) -prune -o"
18 19
19# Do not use full path if we do not use O=.. builds 20# Use make KBUILD_ABS_SRCTREE=1 {tags|cscope}
20# Use make O=. {tags|cscope}
21# to force full paths for a non-O= build 21# to force full paths for a non-O= build
22if [ "${srctree}" = "." -o -z "${srctree}" ]; then 22if [ "${srctree}" = "." -o -z "${srctree}" ]; then
23 tree= 23 tree=
@@ -35,21 +35,19 @@ elif [ "${ALLSOURCE_ARCHS}" = "all" ]; then
35 ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ') 35 ALLSOURCE_ARCHS=$(find ${tree}arch/ -mindepth 1 -maxdepth 1 -type d -printf '%f ')
36fi 36fi
37 37
38# find sources in arch/$ARCH 38# find sources in arch/$1
39find_arch_sources() 39find_arch_sources()
40{ 40{
41 for i in $archincludedir; do 41 for i in $archincludedir; do
42 prune="$prune -wholename $i -prune -o" 42 prune="$prune -wholename $i -prune -o"
43 done 43 done
44 find ${tree}arch/$1 $ignore $subarchprune $prune -name "$2" \ 44 find ${tree}arch/$1 $ignore $prune -name "$2" -not -type l -print;
45 -not -type l -print;
46} 45}
47 46
48# find sources in arch/$1/include 47# find sources in arch/$1/include
49find_arch_include_sources() 48find_arch_include_sources()
50{ 49{
51 include=$(find ${tree}arch/$1/ $subarchprune \ 50 include=$(find ${tree}arch/$1/ -name include -type d -print);
52 -name include -type d -print);
53 if [ -n "$include" ]; then 51 if [ -n "$include" ]; then
54 archincludedir="$archincludedir $include" 52 archincludedir="$archincludedir $include"
55 find $include $ignore -name "$2" -not -type l -print; 53 find $include $ignore -name "$2" -not -type l -print;
@@ -305,36 +303,6 @@ if [ "${ARCH}" = "um" ]; then
305 else 303 else
306 archinclude=${SUBARCH} 304 archinclude=${SUBARCH}
307 fi 305 fi
308elif [ "${SRCARCH}" = "arm" -a "${SUBARCH}" != "" ]; then
309 subarchdir=$(find ${tree}arch/$SRCARCH/ -name "mach-*" -type d -o \
310 -name "plat-*" -type d);
311 mach_suffix=$SUBARCH
312 plat_suffix=$SUBARCH
313
314 # Special cases when $plat_suffix != $mach_suffix
315 case $mach_suffix in
316 "omap1" | "omap2")
317 plat_suffix="omap"
318 ;;
319 esac
320
321 if [ ! -d ${tree}arch/$SRCARCH/mach-$mach_suffix ]; then
322 echo "Warning: arch/arm/mach-$mach_suffix/ not found." >&2
323 echo " Fix your \$SUBARCH appropriately" >&2
324 fi
325
326 for i in $subarchdir; do
327 case "$i" in
328 *"mach-"${mach_suffix})
329 ;;
330 *"plat-"${plat_suffix})
331 ;;
332 *)
333 subarchprune="$subarchprune \
334 -wholename $i -prune -o"
335 ;;
336 esac
337 done
338fi 306fi
339 307
340remove_structs= 308remove_structs=
diff --git a/scripts/tracing/draw_functrace.py b/scripts/tracing/draw_functrace.py
index 9b6dd4f36335..b65735758520 100755
--- a/scripts/tracing/draw_functrace.py
+++ b/scripts/tracing/draw_functrace.py
@@ -1,8 +1,8 @@
1#!/usr/bin/python 1#!/usr/bin/python
2# SPDX-License-Identifier: GPL-2.0-only
2 3
3""" 4"""
4Copyright 2008 (c) Frederic Weisbecker <fweisbec@gmail.com> 5Copyright 2008 (c) Frederic Weisbecker <fweisbec@gmail.com>
5Licensed under the terms of the GNU GPL License version 2
6 6
7This script parses a trace provided by the function tracer in 7This script parses a trace provided by the function tracer in
8kernel/trace/trace_functions.c 8kernel/trace/trace_functions.c