3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-01-30 14:52:17 +00:00
This commit is contained in:
Raziel K. Crowe 2022-09-09 14:20:25 +05:00
commit 26999baf09
893 changed files with 16472 additions and 9925 deletions

View File

@ -15,6 +15,10 @@ pound := \#
# Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o # Name of target with a '.' as filename prefix. foo/bar.o => foo/.bar.o
dot-target = $(dir $@).$(notdir $@) dot-target = $(dir $@).$(notdir $@)
###
# Name of target with a '.tmp_' as filename prefix. foo/bar.o => foo/.tmp_bar.o
tmp-target = $(dir $@).tmp_$(notdir $@)
### ###
# The temporary file to save gcc -MMD generated dependencies must not # The temporary file to save gcc -MMD generated dependencies must not
# contain a comma # contain a comma
@ -138,9 +142,11 @@ check-FORCE = $(if $(filter FORCE, $^),,$(warning FORCE prerequisite is missing)
if-changed-cond = $(newer-prereqs)$(cmd-check)$(check-FORCE) if-changed-cond = $(newer-prereqs)$(cmd-check)$(check-FORCE)
# Execute command if command has changed or prerequisite(s) are updated. # Execute command if command has changed or prerequisite(s) are updated.
if_changed = $(if $(if-changed-cond), \ if_changed = $(if $(if-changed-cond),$(cmd_and_savecmd),@:)
cmd_and_savecmd = \
$(cmd); \ $(cmd); \
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd
# Execute the command and also postprocess generated .d dependencies file. # Execute the command and also postprocess generated .d dependencies file.
if_changed_dep = $(if $(if-changed-cond),$(cmd_and_fixdep),@:) if_changed_dep = $(if $(if-changed-cond),$(cmd_and_fixdep),@:)

View File

@ -25,7 +25,7 @@ failure = $(if-success,$(1),n,y)
# $(cc-option,<flag>) # $(cc-option,<flag>)
# Return y if the compiler supports <flag>, n otherwise # Return y if the compiler supports <flag>, n otherwise
cc-option = $(success,mkdir .tmp_$$$$; trap "rm -rf .tmp_$$$$" EXIT; $(CC) -Werror $(CLANG_FLAGS) $(1) -c -x c /dev/null -o .tmp_$$$$/tmp.o) cc-option = $(success,trap "rm -rf .tmp_$$" EXIT; mkdir .tmp_$$; $(CC) -Werror $(CLANG_FLAGS) $(1) -c -x c /dev/null -o .tmp_$$/tmp.o)
# $(ld-option,<flag>) # $(ld-option,<flag>)
# Return y if the linker supports <flag>, n otherwise # Return y if the linker supports <flag>, n otherwise

View File

@ -14,8 +14,8 @@ hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include
HOSTLDLIBS_sorttable = -lpthread HOSTLDLIBS_sorttable = -lpthread
HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include
HOSTCFLAGS_sign-file.o = $(shell pkg-config --cflags libcrypto 2> /dev/null) HOSTCFLAGS_sign-file.o = $(shell $(HOSTPKG_CONFIG) --cflags libcrypto 2> /dev/null)
HOSTLDLIBS_sign-file = $(shell pkg-config --libs libcrypto 2> /dev/null || echo -lcrypto) HOSTLDLIBS_sign-file = $(shell $(HOSTPKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
ifdef CONFIG_UNWINDER_ORC ifdef CONFIG_UNWINDER_ORC
ifeq ($(ARCH),x86_64) ifeq ($(ARCH),x86_64)

View File

@ -85,11 +85,8 @@ ifdef need-builtin
targets-for-builtin += $(obj)/built-in.a targets-for-builtin += $(obj)/built-in.a
endif endif
targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m))) targets-for-modules := $(foreach x, o mod $(if $(CONFIG_TRIM_UNUSED_KSYMS), usyms), \
$(patsubst %.o, %.$x, $(filter %.o, $(obj-m))))
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
targets-for-modules += $(patsubst %.o, %.prelink.o, $(filter %.o, $(obj-m)))
endif
ifdef need-modorder ifdef need-modorder
targets-for-modules += $(obj)/modules.order targets-for-modules += $(obj)/modules.order
@ -125,18 +122,16 @@ cmd_cpp_i_c = $(CPP) $(c_flags) -o $@ $<
$(obj)/%.i: $(src)/%.c FORCE $(obj)/%.i: $(src)/%.c FORCE
$(call if_changed_dep,cpp_i_c) $(call if_changed_dep,cpp_i_c)
genksyms = scripts/genksyms/genksyms \
$(if $(1), -T $(2)) \
$(if $(KBUILD_PRESERVE), -p) \
-r $(or $(wildcard $(2:.symtypes=.symref)), /dev/null)
# These mirror gensymtypes_S and co below, keep them in synch. # These mirror gensymtypes_S and co below, keep them in synch.
cmd_gensymtypes_c = \ cmd_gensymtypes_c = $(CPP) -D__GENKSYMS__ $(c_flags) $< | $(genksyms)
$(CPP) -D__GENKSYMS__ $(c_flags) $< | \
scripts/genksyms/genksyms $(if $(1), -T $(2)) \
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
$(if $(KBUILD_PRESERVE),-p) \
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
cmd_cc_symtypes_c = \ cmd_cc_symtypes_c = $(call cmd_gensymtypes_c,true,$@) >/dev/null
$(call cmd_gensymtypes_c,true,$@) >/dev/null; \
test -s $@ || rm -f $@
$(obj)/%.symtypes : $(src)/%.c FORCE $(obj)/%.symtypes : $(src)/%.c FORCE
$(call cmd,cc_symtypes_c) $(call cmd,cc_symtypes_c)
@ -153,8 +148,18 @@ $(obj)/%.ll: $(src)/%.c FORCE
# The C file is compiled and updated dependency information is generated. # The C file is compiled and updated dependency information is generated.
# (See cmd_cc_o_c + relevant part of rule_cc_o_c) # (See cmd_cc_o_c + relevant part of rule_cc_o_c)
is-single-obj-m = $(and $(part-of-module),$(filter $@, $(obj-m)),y)
# When a module consists of a single object, there is no reason to keep LLVM IR.
# Make $(LD) covert LLVM IR to ELF here.
ifdef CONFIG_LTO_CLANG
cmd_ld_single_m = $(if $(is-single-obj-m), ; $(LD) $(ld_flags) -r -o $(tmp-target) $@; mv $(tmp-target) $@)
endif
quiet_cmd_cc_o_c = CC $(quiet_modtag) $@ quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< $(cmd_objtool) cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $< \
$(cmd_ld_single_m) \
$(cmd_objtool)
ifdef CONFIG_MODVERSIONS ifdef CONFIG_MODVERSIONS
# When module versioning is enabled the following steps are executed: # When module versioning is enabled the following steps are executed:
@ -162,35 +167,18 @@ ifdef CONFIG_MODVERSIONS
# o if <file>.o doesn't contain a __ksymtab version, i.e. does # o if <file>.o doesn't contain a __ksymtab version, i.e. does
# not export symbols, it's done. # not export symbols, it's done.
# o otherwise, we calculate symbol versions using the good old # o otherwise, we calculate symbol versions using the good old
# genksyms on the preprocessed source and postprocess them in a way # genksyms on the preprocessed source and dump them into the .cmd file.
# that they are usable as a linker script # o modpost will extract versions from that file and create *.c files that will
# o generate .tmp_<file>.o from <file>.o using the linker to # be compiled and linked to the kernel and/or modules.
# replace the unresolved symbols __crc_exported_symbol with
# the actual value of the checksum generated by genksyms
# o remove .tmp_<file>.o to <file>.o
ifdef CONFIG_LTO_CLANG gen_symversions = \
# Generate .o.symversions files for each .o with exported symbols, and link these
# to the kernel and/or modules at the end.
cmd_modversions_c = \
if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then \ if $(NM) $@ 2>/dev/null | grep -q __ksymtab; then \
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ $(call cmd_gensymtypes_$(1),$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
> $@.symversions; \ >> $(dot-target).cmd; \
else \
rm -f $@.symversions; \
fi;
else
cmd_modversions_c = \
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \
$(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
> $(@D)/.tmp_$(@F:.o=.ver); \
\
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \
-T $(@D)/.tmp_$(@F:.o=.ver); \
mv -f $(@D)/.tmp_$(@F) $@; \
rm -f $(@D)/.tmp_$(@F:.o=.ver); \
fi fi
endif
cmd_gen_symversions_c = $(call gen_symversions,c)
endif endif
ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT ifdef CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
@ -222,65 +210,38 @@ cmd_record_mcount = $(if $(findstring $(strip $(CC_FLAGS_FTRACE)),$(_c_flags)),
$(sub_cmd_record_mcount)) $(sub_cmd_record_mcount))
endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT endif # CONFIG_FTRACE_MCOUNT_USE_RECORDMCOUNT
ifdef CONFIG_STACK_VALIDATION
objtool := $(objtree)/tools/objtool/objtool
objtool_args = \
$(if $(CONFIG_UNWINDER_ORC),orc generate,check) \
$(if $(part-of-module), --module) \
$(if $(CONFIG_X86_KERNEL_IBT), --lto --ibt) \
$(if $(CONFIG_FRAME_POINTER),, --no-fp) \
$(if $(CONFIG_GCOV_KERNEL), --no-unreachable) \
$(if $(CONFIG_RETPOLINE), --retpoline) \
$(if $(CONFIG_X86_SMAP), --uaccess) \
$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \
$(if $(CONFIG_SLS), --sls)
cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd)
endif # CONFIG_STACK_VALIDATION
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
# Skip objtool for LLVM bitcode
$(obj)/%.o: objtool-enabled :=
else
# 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory # 'OBJECT_FILES_NON_STANDARD := y': skip objtool checking for a directory
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file # 'OBJECT_FILES_NON_STANDARD_foo.o := 'y': skip objtool checking for a file
# 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file # 'OBJECT_FILES_NON_STANDARD_foo.o := 'n': override directory skip for a file
$(obj)/%.o: objtool-enabled = $(if $(filter-out y%, \ is-standard-object = $(if $(filter-out y%, $(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y)
$(OBJECT_FILES_NON_STANDARD_$(basetarget).o)$(OBJECT_FILES_NON_STANDARD)n),y)
endif $(obj)/%.o: objtool-enabled = $(if $(is-standard-object),$(if $(delay-objtool),$(is-single-obj-m),y))
ifdef CONFIG_TRIM_UNUSED_KSYMS ifdef CONFIG_TRIM_UNUSED_KSYMS
cmd_gen_ksymdeps = \ cmd_gen_ksymdeps = \
$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd $(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
# List module undefined symbols
undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "", $$2) }';
endif endif
cmd_check_local_export = $(srctree)/scripts/check-local-export $@
define rule_cc_o_c define rule_cc_o_c
$(call cmd_and_fixdep,cc_o_c) $(call cmd_and_fixdep,cc_o_c)
$(call cmd,gen_ksymdeps) $(call cmd,gen_ksymdeps)
$(call cmd,check_local_export)
$(call cmd,checksrc) $(call cmd,checksrc)
$(call cmd,checkdoc) $(call cmd,checkdoc)
$(call cmd,gen_objtooldep) $(call cmd,gen_objtooldep)
$(call cmd,modversions_c) $(call cmd,gen_symversions_c)
$(call cmd,record_mcount) $(call cmd,record_mcount)
endef endef
define rule_as_o_S define rule_as_o_S
$(call cmd_and_fixdep,as_o_S) $(call cmd_and_fixdep,as_o_S)
$(call cmd,gen_ksymdeps) $(call cmd,gen_ksymdeps)
$(call cmd,check_local_export)
$(call cmd,gen_objtooldep) $(call cmd,gen_objtooldep)
$(call cmd,modversions_S) $(call cmd,gen_symversions_S)
endef endef
# Built-in and composite module parts # Built-in and composite module parts
@ -288,34 +249,20 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
$(call if_changed_rule,cc_o_c) $(call if_changed_rule,cc_o_c)
$(call cmd,force_checksrc) $(call cmd,force_checksrc)
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) # To make this rule robust against "Argument list too long" error,
# Module .o files may contain LLVM bitcode, compile them into native code # ensure to add $(obj)/ prefix by a shell command.
# before ELF processing cmd_mod = printf '%s\n' $(call real-search, $*.o, .o, -objs -y -m) | \
quiet_cmd_cc_prelink_modules = LD [M] $@ $(AWK) '!x[$$0]++ { print("$(obj)/"$$0) }' > $@
cmd_cc_prelink_modules = \
$(LD) $(ld_flags) -r -o $@ \
$(shell [ -s $(@:.prelink.o=.o.symversions) ] && \
echo -T $(@:.prelink.o=.o.symversions)) \
--whole-archive $(filter-out FORCE,$^) \
$(cmd_objtool)
# objtool was skipped for LLVM bitcode, run it now that we have compiled $(obj)/%.mod: FORCE
# modules into native code
$(obj)/%.prelink.o: objtool-enabled = y
$(obj)/%.prelink.o: part-of-module := y
$(obj)/%.prelink.o: $(obj)/%.o FORCE
$(call if_changed,cc_prelink_modules)
endif
cmd_mod = { \
echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
$(undefined_syms) echo; \
} > $@
$(obj)/%.mod: $(obj)/%$(mod-prelink-ext).o FORCE
$(call if_changed,mod) $(call if_changed,mod)
# List module undefined symbols
cmd_undefined_syms = $(NM) $< | sed -n 's/^ *U //p' > $@
$(obj)/%.usyms: $(obj)/%.o FORCE
$(call if_changed,undefined_syms)
quiet_cmd_cc_lst_c = MKLST $@ quiet_cmd_cc_lst_c = MKLST $@
cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \ cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
$(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \ $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
@ -344,16 +291,10 @@ cmd_gensymtypes_S = \
$(CPP) $(a_flags) $< | \ $(CPP) $(a_flags) $< | \
grep "\<___EXPORT_SYMBOL\>" | \ grep "\<___EXPORT_SYMBOL\>" | \
sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \ sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ; } | \
$(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \ $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | $(genksyms)
scripts/genksyms/genksyms $(if $(1), -T $(2)) \
$(patsubst y,-R,$(CONFIG_MODULE_REL_CRCS)) \
$(if $(KBUILD_PRESERVE),-p) \
-r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@ quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@
cmd_cc_symtypes_S = \ cmd_cc_symtypes_S = $(call cmd_gensymtypes_S,true,$@) >/dev/null
$(call cmd_gensymtypes_S,true,$@) >/dev/null; \
test -s $@ || rm -f $@
$(obj)/%.symtypes : $(src)/%.S FORCE $(obj)/%.symtypes : $(src)/%.S FORCE
$(call cmd,cc_symtypes_S) $(call cmd,cc_symtypes_S)
@ -373,16 +314,8 @@ ifdef CONFIG_ASM_MODVERSIONS
# versioning matches the C process described above, with difference that # versioning matches the C process described above, with difference that
# we parse asm-prototypes.h C header to get function definitions. # we parse asm-prototypes.h C header to get function definitions.
cmd_modversions_S = \ cmd_gen_symversions_S = $(call gen_symversions,S)
if $(OBJDUMP) -h $@ | grep -q __ksymtab; then \
$(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
> $(@D)/.tmp_$(@F:.o=.ver); \
\
$(LD) $(KBUILD_LDFLAGS) -r -o $(@D)/.tmp_$(@F) $@ \
-T $(@D)/.tmp_$(@F:.o=.ver); \
mv -f $(@D)/.tmp_$(@F) $@; \
rm -f $(@D)/.tmp_$(@F:.o=.ver); \
fi
endif endif
$(obj)/%.o: $(src)/%.S FORCE $(obj)/%.o: $(src)/%.S FORCE
@ -417,29 +350,19 @@ $(obj)/%.asn1.c $(obj)/%.asn1.h: $(src)/%.asn1 $(objtree)/scripts/asn1_compiler
$(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ; $(subdir-builtin): $(obj)/%/built-in.a: $(obj)/% ;
$(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ; $(subdir-modorder): $(obj)/%/modules.order: $(obj)/% ;
# combine symversions for later processing
ifeq ($(CONFIG_LTO_CLANG) $(CONFIG_MODVERSIONS),y y)
cmd_update_lto_symversions = \
rm -f $@.symversions \
$(foreach n, $(filter-out FORCE,$^), \
$(if $(shell test -s $(n).symversions && echo y), \
; cat $(n).symversions >> $@.symversions))
else
cmd_update_lto_symversions = echo >/dev/null
endif
# #
# Rule to compile a set of .o files into one .a file (without symbol table) # Rule to compile a set of .o files into one .a file (without symbol table)
# #
# To make this rule robust against "Argument list too long" error,
# remove $(obj)/ prefix, and restore it by a shell command.
quiet_cmd_ar_builtin = AR $@ quiet_cmd_ar_builtin = AR $@
cmd_ar_builtin = rm -f $@; $(AR) cDPrST $@ $(real-prereqs) cmd_ar_builtin = rm -f $@; \
$(if $(real-prereqs), printf "$(obj)/%s " $(patsubst $(obj)/%,%,$(real-prereqs)) | xargs) \
quiet_cmd_ar_and_symver = AR $@ $(AR) cDPrST $@
cmd_ar_and_symver = $(cmd_update_lto_symversions); $(cmd_ar_builtin)
$(obj)/built-in.a: $(real-obj-y) FORCE $(obj)/built-in.a: $(real-obj-y) FORCE
$(call if_changed,ar_and_symver) $(call if_changed,ar_builtin)
# #
# Rule to create modules.order file # Rule to create modules.order file
@ -459,32 +382,24 @@ $(obj)/modules.order: $(obj-m) FORCE
# #
# Rule to compile a set of .o files into one .a file (with symbol table) # Rule to compile a set of .o files into one .a file (with symbol table)
# #
quiet_cmd_ar_lib = AR $@
cmd_ar_lib = $(cmd_update_lto_symversions); $(cmd_ar)
$(obj)/lib.a: $(lib-y) FORCE $(obj)/lib.a: $(lib-y) FORCE
$(call if_changed,ar_lib) $(call if_changed,ar)
# NOTE: quiet_cmd_ld_multi_m = LD [M] $@
# Do not replace $(filter %.o,^) with $(real-prereqs). When a single object cmd_ld_multi_m = $(LD) $(ld_flags) -r -o $@ @$(patsubst %.o,%.mod,$@) $(cmd_objtool)
# module is turned into a multi object module, $^ will contain header file
# dependencies recorded in the .*.cmd file.
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
quiet_cmd_link_multi-m = AR [M] $@
cmd_link_multi-m = \
$(cmd_update_lto_symversions); \
rm -f $@; \
$(AR) cDPrsT $@ $(filter %.o,$^)
else
quiet_cmd_link_multi-m = LD [M] $@
cmd_link_multi-m = $(LD) $(ld_flags) -r -o $@ $(filter %.o,$^)
endif
$(multi-obj-m): FORCE define rule_ld_multi_m
$(call if_changed,link_multi-m) $(call cmd_and_savecmd,ld_multi_m)
$(call cmd,gen_objtooldep)
endef
$(multi-obj-m): objtool-enabled := $(delay-objtool)
$(multi-obj-m): part-of-module := y
$(multi-obj-m): %.o: %.mod FORCE
$(call if_changed_rule,ld_multi_m)
$(call multi_depend, $(multi-obj-m), .o, -objs -y -m) $(call multi_depend, $(multi-obj-m), .o, -objs -y -m)
targets += $(multi-obj-m)
targets := $(filter-out $(PHONY), $(targets)) targets := $(filter-out $(PHONY), $(targets))
# Add intermediate targets: # Add intermediate targets:

View File

@ -36,13 +36,7 @@ __clean-files := \
__clean-files := $(filter-out $(no-clean-files), $(__clean-files)) __clean-files := $(filter-out $(no-clean-files), $(__clean-files))
# clean-files is given relative to the current directory, unless it __clean-files := $(wildcard $(addprefix $(obj)/, $(__clean-files)))
# starts with $(objtree)/ (which means "./", so do not add "./" unless
# you want to delete a file from the toplevel object directory).
__clean-files := $(wildcard \
$(addprefix $(obj)/, $(filter-out $(objtree)/%, $(__clean-files))) \
$(filter $(objtree)/%, $(__clean-files)))
# ========================================================================== # ==========================================================================

View File

@ -21,8 +21,8 @@ TMPOUT = $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/).tmp_$$$$
# automatically cleaned up. # automatically cleaned up.
try-run = $(shell set -e; \ try-run = $(shell set -e; \
TMP=$(TMPOUT)/tmp; \ TMP=$(TMPOUT)/tmp; \
mkdir -p $(TMPOUT); \
trap "rm -rf $(TMPOUT)" EXIT; \ trap "rm -rf $(TMPOUT)" EXIT; \
mkdir -p $(TMPOUT); \
if ($(1)) >/dev/null 2>&1; \ if ($(1)) >/dev/null 2>&1; \
then echo "$(2)"; \ then echo "$(2)"; \
else echo "$(3)"; \ else echo "$(3)"; \

View File

@ -2,8 +2,8 @@
# ========================================================================== # ==========================================================================
# make W=... settings # make W=... settings
# #
# There are three warning groups enabled by W=1, W=2, W=3. # There are four warning groups enabled by W=1, W=2, W=3, and W=e
# They are independent, and can be combined like W=12 or W=123. # They are independent, and can be combined like W=12 or W=123e.
# ========================================================================== # ==========================================================================
KBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned) KBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned)
@ -47,9 +47,20 @@ else
ifdef CONFIG_CC_IS_CLANG ifdef CONFIG_CC_IS_CLANG
KBUILD_CFLAGS += -Wno-initializer-overrides KBUILD_CFLAGS += -Wno-initializer-overrides
# Clang before clang-16 would warn on default argument promotions.
ifeq ($(shell [ $(CONFIG_CLANG_VERSION) -lt 160000 ] && echo y),y)
# Disable -Wformat
KBUILD_CFLAGS += -Wno-format KBUILD_CFLAGS += -Wno-format
# Then re-enable flags that were part of the -Wformat group that aren't
# problematic.
KBUILD_CFLAGS += -Wformat-extra-args -Wformat-invalid-specifier
KBUILD_CFLAGS += -Wformat-zero-length -Wnonnull
# Requires clang-12+.
ifeq ($(shell [ $(CONFIG_CLANG_VERSION) -ge 120000 ] && echo y),y)
KBUILD_CFLAGS += -Wformat-insufficient-args
endif
endif
KBUILD_CFLAGS += -Wno-sign-compare KBUILD_CFLAGS += -Wno-sign-compare
KBUILD_CFLAGS += -Wno-format-zero-length
KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast) KBUILD_CFLAGS += $(call cc-disable-warning, pointer-to-enum-cast)
KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare KBUILD_CFLAGS += -Wno-tautological-constant-out-of-range-compare
KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access) KBUILD_CFLAGS += $(call cc-disable-warning, unaligned-access)
@ -94,3 +105,12 @@ KBUILD_CFLAGS += $(call cc-option, -Wpacked-bitfield-compat)
KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3 KBUILD_CPPFLAGS += -DKBUILD_EXTRA_WARN3
endif endif
#
# W=e - error out on warnings
#
ifneq ($(findstring e, $(KBUILD_EXTRA_WARN)),)
KBUILD_CFLAGS += -Werror
endif

View File

@ -4,12 +4,10 @@ gcc-plugin-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) += latent_entropy_plugin.so
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) \ gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_LATENT_ENTROPY) \
+= -DLATENT_ENTROPY_PLUGIN += -DLATENT_ENTROPY_PLUGIN
ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY ifdef CONFIG_GCC_PLUGIN_LATENT_ENTROPY
DISABLE_LATENT_ENTROPY_PLUGIN += -fplugin-arg-latent_entropy_plugin-disable DISABLE_LATENT_ENTROPY_PLUGIN += -fplugin-arg-latent_entropy_plugin-disable -ULATENT_ENTROPY_PLUGIN
endif endif
export DISABLE_LATENT_ENTROPY_PLUGIN export DISABLE_LATENT_ENTROPY_PLUGIN
gcc-plugin-$(CONFIG_GCC_PLUGIN_SANCOV) += sancov_plugin.so
gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so gcc-plugin-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) += structleak_plugin.so
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) \ gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK_VERBOSE) \
+= -fplugin-arg-structleak_plugin-verbose += -fplugin-arg-structleak_plugin-verbose
@ -24,12 +22,6 @@ export DISABLE_STRUCTLEAK_PLUGIN
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) \ gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STRUCTLEAK) \
+= -DSTRUCTLEAK_PLUGIN += -DSTRUCTLEAK_PLUGIN
gcc-plugin-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) += randomize_layout_plugin.so
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) \
+= -DRANDSTRUCT_PLUGIN
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_RANDSTRUCT_PERFORMANCE) \
+= -fplugin-arg-randomize_layout_plugin-performance-mode
gcc-plugin-$(CONFIG_GCC_PLUGIN_STACKLEAK) += stackleak_plugin.so gcc-plugin-$(CONFIG_GCC_PLUGIN_STACKLEAK) += stackleak_plugin.so
gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STACKLEAK) \ gcc-plugin-cflags-$(CONFIG_GCC_PLUGIN_STACKLEAK) \
+= -DSTACKLEAK_PLUGIN += -DSTACKLEAK_PLUGIN
@ -53,13 +45,19 @@ export DISABLE_ARM_SSP_PER_TASK_PLUGIN
# All the plugin CFLAGS are collected here in case a build target needs to # All the plugin CFLAGS are collected here in case a build target needs to
# filter them out of the KBUILD_CFLAGS. # filter them out of the KBUILD_CFLAGS.
GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y)) GCC_PLUGINS_CFLAGS := $(strip $(addprefix -fplugin=$(objtree)/scripts/gcc-plugins/, $(gcc-plugin-y)) $(gcc-plugin-cflags-y))
# The sancov_plugin.so is included via CFLAGS_KCOV, so it is removed here.
GCC_PLUGINS_CFLAGS := $(filter-out %/sancov_plugin.so, $(GCC_PLUGINS_CFLAGS))
export GCC_PLUGINS_CFLAGS export GCC_PLUGINS_CFLAGS
# Add the flags to the build! # Add the flags to the build!
KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS) KBUILD_CFLAGS += $(GCC_PLUGINS_CFLAGS)
# All enabled GCC plugins are collected here for building below. # Some plugins are enabled outside of this Makefile, but they still need to
GCC_PLUGIN := $(gcc-plugin-y) # be included in GCC_PLUGIN so they can get built.
gcc-plugin-external-$(CONFIG_GCC_PLUGIN_SANCOV) \
+= sancov_plugin.so
gcc-plugin-external-$(CONFIG_GCC_PLUGIN_RANDSTRUCT) \
+= randomize_layout_plugin.so
# All enabled GCC plugins are collected here for building in
# scripts/gcc-scripts/Makefile.
GCC_PLUGIN := $(gcc-plugin-y) $(gcc-plugin-external-y)
export GCC_PLUGIN export GCC_PLUGIN

View File

@ -225,20 +225,40 @@ dtc_cpp_flags = -Wp,-MMD,$(depfile).pre.tmp -nostdinc \
$(addprefix -I,$(DTC_INCLUDE)) \ $(addprefix -I,$(DTC_INCLUDE)) \
-undef -D__DTS__ -undef -D__DTS__
ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),) ifdef CONFIG_OBJTOOL
# With CONFIG_LTO_CLANG, .o files in modules might be LLVM bitcode, so we
# need to run LTO to compile them into native code (.lto.o) before further objtool := $(objtree)/tools/objtool/objtool
# processing.
mod-prelink-ext := .prelink objtool_args = \
endif $(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label) \
$(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr) \
$(if $(CONFIG_X86_KERNEL_IBT), --ibt) \
$(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount) \
$(if $(CONFIG_UNWINDER_ORC), --orc) \
$(if $(CONFIG_RETPOLINE), --retpoline) \
$(if $(CONFIG_RETHUNK), --rethunk) \
$(if $(CONFIG_SLS), --sls) \
$(if $(CONFIG_STACK_VALIDATION), --stackval) \
$(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call) \
$(if $(CONFIG_HAVE_UACCESS_VALIDATION), --uaccess) \
$(if $(delay-objtool), --link) \
$(if $(part-of-module), --module) \
$(if $(CONFIG_GCOV_KERNEL), --no-unreachable)
delay-objtool := $(or $(CONFIG_LTO_CLANG),$(CONFIG_X86_KERNEL_IBT))
cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd)
endif # CONFIG_OBJTOOL
# Useful for describing the dependency of composite objects # Useful for describing the dependency of composite objects
# Usage: # Usage:
# $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add) # $(call multi_depend, multi_used_targets, suffix_to_remove, suffix_to_add)
define multi_depend define multi_depend
$(foreach m, $(notdir $1), \ $(foreach m, $1, \
$(eval $(obj)/$m: \ $(eval $m: \
$(addprefix $(obj)/, $(foreach s, $3, $($(m:%$(strip $2)=%$(s))))))) $(addprefix $(obj)/, $(call suffix-search, $(patsubst $(obj)/%,%,$m), $2, $3))))
endef endef
# Copy a file # Copy a file

View File

@ -9,7 +9,7 @@ __modfinal:
include include/config/auto.conf include include/config/auto.conf
include $(srctree)/scripts/Kbuild.include include $(srctree)/scripts/Kbuild.include
# for c_flags and mod-prelink-ext # for c_flags
include $(srctree)/scripts/Makefile.lib include $(srctree)/scripts/Makefile.lib
# find all modules listed in modules.order # find all modules listed in modules.order
@ -54,9 +54,8 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \
$(cmd); \ $(cmd); \
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
# Re-generate module BTFs if either module's .ko or vmlinux changed # Re-generate module BTFs if either module's .ko or vmlinux changed
$(modules): %.ko: %$(mod-prelink-ext).o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE $(modules): %.ko: %.o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE
+$(call if_changed_except,ld_ko_o,vmlinux) +$(call if_changed_except,ld_ko_o,vmlinux)
ifdef CONFIG_DEBUG_INFO_BTF_MODULES ifdef CONFIG_DEBUG_INFO_BTF_MODULES
+$(if $(newer-prereqs),$(call cmd,btf_ko)) +$(if $(newer-prereqs),$(call cmd,btf_ko))

View File

@ -18,6 +18,9 @@ INSTALL_MOD_DIR ?= extra
dst := $(MODLIB)/$(INSTALL_MOD_DIR) dst := $(MODLIB)/$(INSTALL_MOD_DIR)
endif endif
$(foreach x, % :, $(if $(findstring $x, $(dst)), \
$(error module installation path cannot contain '$x')))
suffix-y := suffix-y :=
suffix-$(CONFIG_MODULE_COMPRESS_GZIP) := .gz suffix-$(CONFIG_MODULE_COMPRESS_GZIP) := .gz
suffix-$(CONFIG_MODULE_COMPRESS_XZ) := .xz suffix-$(CONFIG_MODULE_COMPRESS_XZ) := .xz
@ -28,9 +31,6 @@ modules := $(patsubst $(extmod_prefix)%, $(dst)/%$(suffix-y), $(modules))
__modinst: $(modules) __modinst: $(modules)
@: @:
quiet_cmd_none =
cmd_none = :
# #
# Installation # Installation
# #

View File

@ -41,9 +41,6 @@ __modpost:
include include/config/auto.conf include include/config/auto.conf
include $(srctree)/scripts/Kbuild.include include $(srctree)/scripts/Kbuild.include
# for mod-prelink-ext
include $(srctree)/scripts/Makefile.lib
MODPOST = scripts/mod/modpost \ MODPOST = scripts/mod/modpost \
$(if $(CONFIG_MODVERSIONS),-m) \ $(if $(CONFIG_MODVERSIONS),-m) \
$(if $(CONFIG_MODULE_SRCVERSION_ALL),-a) \ $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a) \
@ -87,8 +84,7 @@ obj := $(KBUILD_EXTMOD)
src := $(obj) src := $(obj)
# Include the module's Makefile to find KBUILD_EXTRA_SYMBOLS # Include the module's Makefile to find KBUILD_EXTRA_SYMBOLS
include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \ include $(or $(wildcard $(src)/Kbuild), $(src)/Makefile)
$(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile)
# modpost option for external modules # modpost option for external modules
MODPOST += -e MODPOST += -e
@ -118,8 +114,6 @@ $(input-symdump):
@echo >&2 ' Modules may not have dependencies or modversions.' @echo >&2 ' Modules may not have dependencies or modversions.'
@echo >&2 ' You may get many unresolved symbol warnings.' @echo >&2 ' You may get many unresolved symbol warnings.'
modules := $(sort $(shell cat $(MODORDER)))
# KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined symbols # KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined symbols
ifneq ($(KBUILD_MODPOST_WARN)$(filter-out $(existing-input-symdump), $(input-symdump)),) ifneq ($(KBUILD_MODPOST_WARN)$(filter-out $(existing-input-symdump), $(input-symdump)),)
MODPOST += -w MODPOST += -w
@ -128,9 +122,9 @@ endif
# Read out modules.order to pass in modpost. # Read out modules.order to pass in modpost.
# Otherwise, allmodconfig would fail with "Argument list too long". # Otherwise, allmodconfig would fail with "Argument list too long".
quiet_cmd_modpost = MODPOST $@ quiet_cmd_modpost = MODPOST $@
cmd_modpost = sed 's/\.ko$$/$(mod-prelink-ext)\.o/' $< | $(MODPOST) -T - cmd_modpost = sed 's/ko$$/o/' $< | $(MODPOST) -T -
$(output-symdump): $(MODORDER) $(input-symdump) $(modules:.ko=$(mod-prelink-ext).o) FORCE $(output-symdump): $(MODORDER) $(input-symdump) FORCE
$(call if_changed,modpost) $(call if_changed,modpost)
targets += $(output-symdump) targets += $(output-symdump)

View File

@ -56,7 +56,7 @@ rpm-pkg:
$(MAKE) clean $(MAKE) clean
$(CONFIG_SHELL) $(MKSPEC) >$(objtree)/kernel.spec $(CONFIG_SHELL) $(MKSPEC) >$(objtree)/kernel.spec
$(call cmd,src_tar,$(KERNELPATH),kernel.spec) $(call cmd,src_tar,$(KERNELPATH),kernel.spec)
+rpmbuild $(RPMOPTS) --target $(UTS_MACHINE) -ta $(KERNELPATH).tar.gz \ +rpmbuild $(RPMOPTS) --target $(UTS_MACHINE)-linux -ta $(KERNELPATH).tar.gz \
--define='_smp_mflags %{nil}' --define='_smp_mflags %{nil}'
# binrpm-pkg # binrpm-pkg
@ -66,7 +66,7 @@ binrpm-pkg:
$(MAKE) -f $(srctree)/Makefile $(MAKE) -f $(srctree)/Makefile
$(CONFIG_SHELL) $(MKSPEC) prebuilt > $(objtree)/binkernel.spec $(CONFIG_SHELL) $(MKSPEC) prebuilt > $(objtree)/binkernel.spec
+rpmbuild $(RPMOPTS) --define "_builddir $(objtree)" --target \ +rpmbuild $(RPMOPTS) --define "_builddir $(objtree)" --target \
$(UTS_MACHINE) -bb $(objtree)/binkernel.spec $(UTS_MACHINE)-linux -bb $(objtree)/binkernel.spec
PHONY += deb-pkg PHONY += deb-pkg
deb-pkg: deb-pkg:

View File

@ -35,7 +35,7 @@ case "$KBUILD_VERBOSE" in
esac esac
# Generate a new symbol list file # Generate a new symbol list file
$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh "$new_ksyms_file" $CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh --modorder "$new_ksyms_file"
# Extract changes between old and new list and touch corresponding # Extract changes between old and new list and touch corresponding
# dependency files. # dependency files.

View File

@ -164,41 +164,44 @@ gen_xchg_fallbacks()
gen_try_cmpxchg_fallback() gen_try_cmpxchg_fallback()
{ {
local cmpxchg="$1"; shift;
local order="$1"; shift; local order="$1"; shift;
cat <<EOF cat <<EOF
#ifndef arch_try_cmpxchg${order} #ifndef arch_try_${cmpxchg}${order}
#define arch_try_cmpxchg${order}(_ptr, _oldp, _new) \\ #define arch_try_${cmpxchg}${order}(_ptr, _oldp, _new) \\
({ \\ ({ \\
typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \\ typeof(*(_ptr)) *___op = (_oldp), ___o = *___op, ___r; \\
___r = arch_cmpxchg${order}((_ptr), ___o, (_new)); \\ ___r = arch_${cmpxchg}${order}((_ptr), ___o, (_new)); \\
if (unlikely(___r != ___o)) \\ if (unlikely(___r != ___o)) \\
*___op = ___r; \\ *___op = ___r; \\
likely(___r == ___o); \\ likely(___r == ___o); \\
}) })
#endif /* arch_try_cmpxchg${order} */ #endif /* arch_try_${cmpxchg}${order} */
EOF EOF
} }
gen_try_cmpxchg_fallbacks() gen_try_cmpxchg_fallbacks()
{ {
printf "#ifndef arch_try_cmpxchg_relaxed\n" local cmpxchg="$1"; shift;
printf "#ifdef arch_try_cmpxchg\n"
gen_basic_fallbacks "arch_try_cmpxchg" printf "#ifndef arch_try_${cmpxchg}_relaxed\n"
printf "#ifdef arch_try_${cmpxchg}\n"
printf "#endif /* arch_try_cmpxchg */\n\n" gen_basic_fallbacks "arch_try_${cmpxchg}"
printf "#endif /* arch_try_${cmpxchg} */\n\n"
for order in "" "_acquire" "_release" "_relaxed"; do for order in "" "_acquire" "_release" "_relaxed"; do
gen_try_cmpxchg_fallback "${order}" gen_try_cmpxchg_fallback "${cmpxchg}" "${order}"
done done
printf "#else /* arch_try_cmpxchg_relaxed */\n" printf "#else /* arch_try_${cmpxchg}_relaxed */\n"
gen_order_fallbacks "arch_try_cmpxchg" gen_order_fallbacks "arch_try_${cmpxchg}"
printf "#endif /* arch_try_cmpxchg_relaxed */\n\n" printf "#endif /* arch_try_${cmpxchg}_relaxed */\n\n"
} }
cat << EOF cat << EOF
@ -218,7 +221,9 @@ for xchg in "arch_xchg" "arch_cmpxchg" "arch_cmpxchg64"; do
gen_xchg_fallbacks "${xchg}" gen_xchg_fallbacks "${xchg}"
done done
gen_try_cmpxchg_fallbacks for cmpxchg in "cmpxchg" "cmpxchg64"; do
gen_try_cmpxchg_fallbacks "${cmpxchg}"
done
grep '^[a-z]' "$1" | while read name meta args; do grep '^[a-z]' "$1" | while read name meta args; do
gen_proto "${meta}" "${name}" "atomic" "int" ${args} gen_proto "${meta}" "${name}" "atomic" "int" ${args}

View File

@ -166,7 +166,7 @@ grep '^[a-z]' "$1" | while read name meta args; do
done done
for xchg in "xchg" "cmpxchg" "cmpxchg64" "try_cmpxchg"; do for xchg in "xchg" "cmpxchg" "cmpxchg64" "try_cmpxchg" "try_cmpxchg64"; do
for order in "" "_acquire" "_release" "_relaxed"; do for order in "" "_acquire" "_release" "_relaxed"; do
gen_xchg "${xchg}" "${order}" "" gen_xchg "${xchg}" "${order}" ""
printf "\n" printf "\n"

View File

@ -1,2 +1,3 @@
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
/fixdep /fixdep
/randstruct.seed

View File

@ -3,3 +3,14 @@
# fixdep: used to generate dependency information during build process # fixdep: used to generate dependency information during build process
hostprogs-always-y += fixdep hostprogs-always-y += fixdep
# randstruct: the seed is needed before building the gcc-plugin or
# before running a Clang kernel build.
gen-randstruct-seed := $(srctree)/scripts/gen-randstruct-seed.sh
quiet_cmd_create_randstruct_seed = GENSEED $@
cmd_create_randstruct_seed = \
$(CONFIG_SHELL) $(gen-randstruct-seed) \
$@ $(objtree)/include/generated/randstruct_hash.h
$(obj)/randstruct.seed: $(gen-randstruct-seed) FORCE
$(call if_changed,create_randstruct_seed)
always-$(CONFIG_RANDSTRUCT) += randstruct.seed

View File

@ -7,24 +7,31 @@
# This software may be used and distributed according to the terms # This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference. # of the GNU General Public License, incorporated herein by reference.
import sys, os, re import sys, os, re, argparse
from signal import signal, SIGPIPE, SIG_DFL from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE, SIG_DFL) signal(SIGPIPE, SIG_DFL)
if len(sys.argv) < 3: parser = argparse.ArgumentParser(description="Simple script used to compare the symbol sizes of 2 object files")
sys.stderr.write("usage: %s [option] file1 file2\n" % sys.argv[0]) group = parser.add_mutually_exclusive_group()
sys.stderr.write("The options are:\n") group.add_argument('-c', help='categorize output based on symbol type', action='store_true')
sys.stderr.write("-c categorize output based on symbol type\n") group.add_argument('-d', help='Show delta of Data Section', action='store_true')
sys.stderr.write("-d Show delta of Data Section\n") group.add_argument('-t', help='Show delta of text Section', action='store_true')
sys.stderr.write("-t Show delta of text Section\n") parser.add_argument('-p', dest='prefix', help='Arch prefix for the tool being used. Useful in cross build scenarios')
sys.exit(-1) parser.add_argument('file1', help='First file to compare')
parser.add_argument('file2', help='Second file to compare')
args = parser.parse_args()
re_NUMBER = re.compile(r'\.[0-9]+') re_NUMBER = re.compile(r'\.[0-9]+')
def getsizes(file, format): def getsizes(file, format):
sym = {} sym = {}
with os.popen("nm --size-sort " + file) as f: nm = "nm"
if args.prefix:
nm = "{}nm".format(args.prefix)
with os.popen("{} --size-sort {}".format(nm, file)) as f:
for line in f: for line in f:
if line.startswith("\n") or ":" in line: if line.startswith("\n") or ":" in line:
continue continue
@ -36,6 +43,7 @@ def getsizes(file, format):
if name.startswith("__se_compat_sys"): continue if name.startswith("__se_compat_sys"): continue
if name.startswith("__addressable_"): continue if name.startswith("__addressable_"): continue
if name == "linux_banner": continue if name == "linux_banner": continue
if name == "vermagic": continue
# statics and some other optimizations adds random .NUMBER # statics and some other optimizations adds random .NUMBER
name = re_NUMBER.sub('', name) name = re_NUMBER.sub('', name)
sym[name] = sym.get(name, 0) + int(size, 16) sym[name] = sym.get(name, 0) + int(size, 16)
@ -76,9 +84,9 @@ def calc(oldfile, newfile, format):
delta.reverse() delta.reverse()
return grow, shrink, add, remove, up, down, delta, old, new, otot, ntot return grow, shrink, add, remove, up, down, delta, old, new, otot, ntot
def print_result(symboltype, symbolformat, argc): def print_result(symboltype, symbolformat):
grow, shrink, add, remove, up, down, delta, old, new, otot, ntot = \ grow, shrink, add, remove, up, down, delta, old, new, otot, ntot = \
calc(sys.argv[argc - 1], sys.argv[argc], symbolformat) calc(args.file1, args.file2, symbolformat)
print("add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \ print("add/remove: %s/%s grow/shrink: %s/%s up/down: %s/%s (%s)" % \
(add, remove, grow, shrink, up, -down, up-down)) (add, remove, grow, shrink, up, -down, up-down))
@ -92,13 +100,13 @@ def print_result(symboltype, symbolformat, argc):
percent = 0 percent = 0
print("Total: Before=%d, After=%d, chg %+.2f%%" % (otot, ntot, percent)) print("Total: Before=%d, After=%d, chg %+.2f%%" % (otot, ntot, percent))
if sys.argv[1] == "-c": if args.c:
print_result("Function", "tT", 3) print_result("Function", "tT")
print_result("Data", "dDbB", 3) print_result("Data", "dDbB")
print_result("RO Data", "rR", 3) print_result("RO Data", "rR")
elif sys.argv[1] == "-d": elif args.d:
print_result("Data", "dDbBrR", 3) print_result("Data", "dDbBrR")
elif sys.argv[1] == "-t": elif args.t:
print_result("Function", "tT", 3) print_result("Function", "tT")
else: else:
print_result("Function", "tTdDbBrR", 2) print_result("Function", "tTdDbBrR")

View File

@ -333,27 +333,7 @@ class PrinterRST(Printer):
.. Copyright (C) All BPF authors and contributors from 2014 to present. .. Copyright (C) All BPF authors and contributors from 2014 to present.
.. See git log include/uapi/linux/bpf.h in kernel tree for details. .. See git log include/uapi/linux/bpf.h in kernel tree for details.
.. ..
.. %%%LICENSE_START(VERBATIM) .. SPDX-License-Identifier: Linux-man-pages-copyleft
.. Permission is granted to make and distribute verbatim copies of this
.. manual provided the copyright notice and this permission notice are
.. preserved on all copies.
..
.. Permission is granted to copy and distribute modified versions of this
.. manual under the conditions for verbatim copying, provided that the
.. entire resulting derived work is distributed under the terms of a
.. permission notice identical to this one.
..
.. Since the Linux kernel and libraries are constantly changing, this
.. manual page may be incorrect or out-of-date. The author(s) assume no
.. responsibility for errors or omissions, or for damages resulting from
.. the use of the information contained herein. The author(s) may not
.. have taken the same level of care in the production of this manual,
.. which is licensed free of charge, as they might when working
.. professionally.
..
.. Formatted or processed versions of this manual, if unaccompanied by
.. the source, must acknowledge the copyright and authors of this work.
.. %%%LICENSE_END
.. ..
.. Please do not edit this file. It was generated from the documentation .. Please do not edit this file. It was generated from the documentation
.. located in file include/uapi/linux/bpf.h of the Linux kernel sources .. located in file include/uapi/linux/bpf.h of the Linux kernel sources
@ -633,6 +613,10 @@ class PrinterHelpers(Printer):
'struct socket', 'struct socket',
'struct file', 'struct file',
'struct bpf_timer', 'struct bpf_timer',
'struct mptcp_sock',
'struct bpf_dynptr',
'struct iphdr',
'struct ipv6hdr',
] ]
known_types = { known_types = {
'...', '...',
@ -682,6 +666,10 @@ class PrinterHelpers(Printer):
'struct socket', 'struct socket',
'struct file', 'struct file',
'struct bpf_timer', 'struct bpf_timer',
'struct mptcp_sock',
'struct bpf_dynptr',
'struct iphdr',
'struct ipv6hdr',
} }
mapped_types = { mapped_types = {
'u8': '__u8', 'u8': '__u8',

View File

@ -1042,7 +1042,8 @@ our $FuncArg = qr{$Typecast{0,1}($LvalOrFunc|$Constant|$String)};
our $declaration_macros = qr{(?x: our $declaration_macros = qr{(?x:
(?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(| (?:$Storage\s+)?(?:[A-Z_][A-Z0-9]*_){0,2}(?:DEFINE|DECLARE)(?:_[A-Z0-9]+){1,6}\s*\(|
(?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(| (?:$Storage\s+)?[HLP]?LIST_HEAD\s*\(|
(?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\( (?:SKCIPHER_REQUEST|SHASH_DESC|AHASH_REQUEST)_ON_STACK\s*\(|
(?:$Storage\s+)?(?:XA_STATE|XA_STATE_ORDER)\s*\(
)}; )};
our %allow_repeated_words = ( our %allow_repeated_words = (
@ -5720,7 +5721,7 @@ sub process {
$var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ && $var !~ /^(?:[a-z0-9_]*|[A-Z0-9_]*)?_?[a-z][A-Z](?:_[a-z0-9_]+|_[A-Z0-9_]+)?$/ &&
#Ignore some three character SI units explicitly, like MiB and KHz #Ignore some three character SI units explicitly, like MiB and KHz
$var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) { $var !~ /^(?:[a-z_]*?)_?(?:[KMGT]iB|[KMGT]?Hz)(?:_[a-z_]+)?$/) {
while ($var =~ m{($Ident)}g) { while ($var =~ m{\b($Ident)}g) {
my $word = $1; my $word = $1;
next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/); next if ($word !~ /[A-Z][a-z]|[a-z][A-Z]/);
if ($check) { if ($check) {
@ -7033,14 +7034,16 @@ sub process {
"Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr); "Prefer $3(sizeof(*$1)...) over $3($4...)\n" . $herecurr);
} }
# check for k[mz]alloc with multiplies that could be kmalloc_array/kcalloc # check for (kv|k)[mz]alloc with multiplies that could be kmalloc_array/kvmalloc_array/kvcalloc/kcalloc
if ($perl_version_ok && if ($perl_version_ok &&
defined $stat && defined $stat &&
$stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) { $stat =~ /^\+\s*($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k)[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)\s*,/) {
my $oldfunc = $3; my $oldfunc = $3;
my $a1 = $4; my $a1 = $4;
my $a2 = $10; my $a2 = $10;
my $newfunc = "kmalloc_array"; my $newfunc = "kmalloc_array";
$newfunc = "kvmalloc_array" if ($oldfunc eq "kvmalloc");
$newfunc = "kvcalloc" if ($oldfunc eq "kvzalloc");
$newfunc = "kcalloc" if ($oldfunc eq "kzalloc"); $newfunc = "kcalloc" if ($oldfunc eq "kzalloc");
my $r1 = $a1; my $r1 = $a1;
my $r2 = $a2; my $r2 = $a2;
@ -7057,7 +7060,7 @@ sub process {
"Prefer $newfunc over $oldfunc with multiply\n" . $herectx) && "Prefer $newfunc over $oldfunc with multiply\n" . $herectx) &&
$cnt == 1 && $cnt == 1 &&
$fix) { $fix) {
$fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*(k[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e; $fixed[$fixlinenr] =~ s/\b($Lval)\s*\=\s*(?:$balanced_parens)?\s*((?:kv|k)[mz]alloc)\s*\(\s*($FuncArg)\s*\*\s*($FuncArg)/$1 . ' = ' . "$newfunc(" . trim($r1) . ', ' . trim($r2)/e;
} }
} }
} }

View File

@ -16,6 +16,7 @@
# AArch64, PARISC ports by Kyle McMartin # AArch64, PARISC ports by Kyle McMartin
# sparc port by Martin Habets <errandir_news@mph.eclipse.co.uk> # sparc port by Martin Habets <errandir_news@mph.eclipse.co.uk>
# ppc64le port by Breno Leitao <leitao@debian.org> # ppc64le port by Breno Leitao <leitao@debian.org>
# riscv port by Wadim Mueller <wafgo01@gmail.com>
# #
# Usage: # Usage:
# objdump -d vmlinux | scripts/checkstack.pl [arch] # objdump -d vmlinux | scripts/checkstack.pl [arch]
@ -108,6 +109,9 @@ my (@stack, $re, $dre, $sub, $x, $xs, $funcre, $min_stack);
} elsif ($arch eq 'sparc' || $arch eq 'sparc64') { } elsif ($arch eq 'sparc' || $arch eq 'sparc64') {
# f0019d10: 9d e3 bf 90 save %sp, -112, %sp # f0019d10: 9d e3 bf 90 save %sp, -112, %sp
$re = qr/.*save.*%sp, -(([0-9]{2}|[3-9])[0-9]{2}), %sp/o; $re = qr/.*save.*%sp, -(([0-9]{2}|[3-9])[0-9]{2}), %sp/o;
} elsif ($arch =~ /^riscv(64)?$/) {
#ffffffff8036e868: c2010113 addi sp,sp,-992
$re = qr/.*addi.*sp,sp,-(([0-9]{2}|[3-9])[0-9]{2})/o;
} else { } else {
print("wrong or unknown architecture \"$arch\"\n"); print("wrong or unknown architecture \"$arch\"\n");
exit exit

View File

@ -268,4 +268,4 @@ syscall_list() {
} }
(ignore_list && syscall_list $(dirname $0)/../arch/x86/entry/syscalls/syscall_32.tbl) | \ (ignore_list && syscall_list $(dirname $0)/../arch/x86/entry/syscalls/syscall_32.tbl) | \
$* -Wno-error -E -x c - > /dev/null $* -Wno-error -Wno-unused-macros -E -x c - > /dev/null

View File

@ -157,10 +157,10 @@ def cmdfiles_for_modorder(modorder):
if ext != '.ko': if ext != '.ko':
sys.exit('{}: module path must end with .ko'.format(ko)) sys.exit('{}: module path must end with .ko'.format(ko))
mod = base + '.mod' mod = base + '.mod'
# The first line of *.mod lists the objects that compose the module. # Read from *.mod, to get a list of objects that compose the module.
with open(mod) as m: with open(mod) as m:
for obj in m.readline().split(): for mod_line in m:
yield to_cmdfile(obj) yield to_cmdfile(mod_line.rstrip())
def process_line(root_directory, command_prefix, file_path): def process_line(root_directory, command_prefix, file_path):

View File

@ -51,6 +51,7 @@ def run_analysis(entry):
checks += "linuxkernel-*" checks += "linuxkernel-*"
else: else:
checks += "clang-analyzer-*" checks += "clang-analyzer-*"
checks += ",-clang-analyzer-security.insecureAPI.DeprecatedOrUnsafeBufferHandling"
p = subprocess.run(["clang-tidy", "-p", args.path, checks, entry["file"]], p = subprocess.run(["clang-tidy", "-p", args.path, checks, entry["file"]],
stdout=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.STDOUT, stderr=subprocess.STDOUT,

View File

@ -10,7 +10,7 @@
// Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU. // Copyright: (C) 2009-2010 Julia Lawall, Nicolas Palix, DIKU.
// Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2009-2010 Gilles Muller, INRIA/LiP6.
// Copyright: (C) 2017 Himanshu Jha // Copyright: (C) 2017 Himanshu Jha
// URL: http://coccinelle.lip6.fr/rules/kzalloc.html // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --no-includes --include-headers // Options: --no-includes --include-headers
// //
// Keywords: kmalloc, kzalloc // Keywords: kmalloc, kzalloc

View File

@ -5,7 +5,7 @@
// Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation // Copyright (c) 2016-2017, Elena Reshetova, Intel Corporation
// //
// Confidence: Moderate // Confidence: Moderate
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --include-headers --very-quiet // Options: --include-headers --very-quiet
virtual report virtual report

View File

@ -6,7 +6,7 @@
/// ///
// Confidence: High // Confidence: High
// Copyright: (C) 2017 Julia Lawall, Inria/LIP6, // Copyright: (C) 2017 Julia Lawall, Inria/LIP6,
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Requires: 1.0.7 // Requires: 1.0.7
// Keywords: BQ27XXX_DATA // Keywords: BQ27XXX_DATA

View File

@ -4,7 +4,7 @@
// Keywords: d_find_alias, dput // Keywords: d_find_alias, dput
// //
// Confidence: Moderate // Confidence: Moderate
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --include-headers // Options: --include-headers
virtual context virtual context

View File

@ -6,7 +6,7 @@
// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU. // Copyright: (C) 2009, 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2009, 2010 Julia Lawall, DIKU. // Copyright: (C) 2009, 2010 Julia Lawall, DIKU.
// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: // Options:
// //
// Keywords: ERR_PTR, PTR_ERR, ERR_CAST // Keywords: ERR_PTR, PTR_ERR, ERR_CAST

View File

@ -5,7 +5,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -5,7 +5,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -6,7 +6,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -4,7 +4,7 @@
// Keywords: pm_runtime // Keywords: pm_runtime
// Confidence: Medium // Confidence: Medium
// Copyright (C) 2013 Texas Instruments Incorporated - // Copyright (C) 2013 Texas Instruments Incorporated -
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --include-headers // Options: --include-headers
virtual patch virtual patch

View File

@ -7,7 +7,7 @@
// Copyright: (C) 2009, 2010 Nicolas Palix, DIKU. // Copyright: (C) 2009, 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2009, 2010 Julia Lawall, DIKU. // Copyright: (C) 2009, 2010 Julia Lawall, DIKU.
// Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2009, 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: // Options:
// //
// Keywords: resource_size // Keywords: resource_size

View File

@ -8,7 +8,7 @@
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: // Options:

View File

@ -17,7 +17,7 @@
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2011 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2011 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2011 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2011 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -8,7 +8,7 @@
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: // Options:

View File

@ -9,7 +9,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -3,7 +3,7 @@
/// ///
// Confidence: High // Confidence: High
// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2013 Julia Lawall, INRIA/LIP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -3,7 +3,7 @@
/// ///
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2013 Petr Strnad. // Copyright: (C) 2013 Petr Strnad.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Keywords: pci_free_consistent, pci_alloc_consistent // Keywords: pci_free_consistent, pci_alloc_consistent
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -4,7 +4,7 @@
/// ///
// Confidence: High // Confidence: High
// Copyright: (C) 2015 Julia Lawall, Inria. // Copyright: (C) 2015 Julia Lawall, Inria.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --no-includes --include-headers // Options: --no-includes --include-headers
// Requires: 1.0.4 // Requires: 1.0.4
// Keywords: for_each_child_of_node, etc. // Keywords: for_each_child_of_node, etc.

View File

@ -5,7 +5,7 @@
/// ///
// Confidence: High // Confidence: High
// Copyright: (C) 2020 Sumera Priyadarsini // Copyright: (C) 2020 Sumera Priyadarsini
// URL: http://coccinelle.lip6.fr // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --no-includes --include-headers // Options: --no-includes --include-headers
virtual patch virtual patch

View File

@ -10,7 +10,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -8,7 +8,7 @@
// Copyright: (C) 2010 Nicolas Palix, DIKU. // Copyright: (C) 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2010 Julia Lawall, DIKU. // Copyright: (C) 2010 Julia Lawall, DIKU.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -10,7 +10,7 @@
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LIP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LIP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -8,7 +8,7 @@
// Copyright: (C) 2012 Nicolas Palix. // Copyright: (C) 2012 Nicolas Palix.
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -7,7 +7,7 @@
// Copyright: (C) 2010 Nicolas Palix, DIKU. // Copyright: (C) 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2010 Julia Lawall, DIKU. // Copyright: (C) 2010 Julia Lawall, DIKU.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -5,7 +5,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -10,7 +10,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -5,7 +5,7 @@
// Confidence: High // Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -7,7 +7,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise // Comments: requires at least Coccinelle 0.2.4, lex or parse error otherwise
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -12,7 +12,7 @@
// Copyright: (C) 2010 Nicolas Palix, DIKU. // Copyright: (C) 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2010 Julia Lawall, DIKU. // Copyright: (C) 2010 Julia Lawall, DIKU.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -5,7 +5,7 @@
/// ///
// Confidence: Very High // Confidence: Very High
// Copyright: (C) 2020 Intel Corporation // Copyright: (C) 2020 Intel Corporation
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --no-includes --include-headers // Options: --no-includes --include-headers
virtual context virtual context

View File

@ -5,7 +5,7 @@
// Confidence: High // Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -6,7 +6,7 @@
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2013 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2013 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2013 Gilles Muller, INRIA/LIP6. // Copyright: (C) 2013 Gilles Muller, INRIA/LIP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -4,7 +4,7 @@
/// ///
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. // Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: Comments on code can be deleted if near code that is removed. // Comments: Comments on code can be deleted if near code that is removed.
// "when strict" can be removed to get more hits, but adds false // "when strict" can be removed to get more hits, but adds false
// positives // positives

View File

@ -4,7 +4,7 @@
/// ///
// Confidence: Moderate // Confidence: Moderate
// Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6. // Copyright: (C) 2012 Peter Senna Tschudin, INRIA/LIP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: Some false positives on empty default cases in switch statements. // Comments: Some false positives on empty default cases in switch statements.
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -4,7 +4,7 @@
// Confidence: High // Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -10,7 +10,7 @@
// Confidence: High // Confidence: High
// Copyright: (C) 2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Requires: 1.0.0 // Requires: 1.0.0
// Options: // Options:

View File

@ -7,7 +7,7 @@
// Copyright: (C) 2010 Nicolas Palix, DIKU. // Copyright: (C) 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2010 Julia Lawall, DIKU. // Copyright: (C) 2010 Julia Lawall, DIKU.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: -I ... -all_includes can give more complete results // Comments: -I ... -all_includes can give more complete results
// Options: // Options:

View File

@ -5,7 +5,7 @@
// Copyright: (C) 2010-2012 Nicolas Palix. // Copyright: (C) 2010-2012 Nicolas Palix.
// Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6. // Copyright: (C) 2010-2012 Julia Lawall, INRIA/LIP6.
// Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010-2012 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -9,7 +9,7 @@
// Copyright: (C) 2010 Nicolas Palix, DIKU. // Copyright: (C) 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2010 Julia Lawall, DIKU. // Copyright: (C) 2010 Julia Lawall, DIKU.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -9,7 +9,7 @@
// Copyright: (C) 2010 Nicolas Palix, DIKU. // Copyright: (C) 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2010 Julia Lawall, DIKU. // Copyright: (C) 2010 Julia Lawall, DIKU.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -8,7 +8,7 @@
// Copyright: (C) 2010 Nicolas Palix, DIKU. // Copyright: (C) 2010 Nicolas Palix, DIKU.
// Copyright: (C) 2010 Julia Lawall, DIKU. // Copyright: (C) 2010 Julia Lawall, DIKU.
// Copyright: (C) 2010 Gilles Muller, INRIA/LiP6. // Copyright: (C) 2010 Gilles Muller, INRIA/LiP6.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Comments: // Comments:
// Options: --no-includes --include-headers // Options: --no-includes --include-headers

View File

@ -6,7 +6,7 @@
// Confidence: High // Confidence: High
// Copyright: (C) 2012, 2015 Julia Lawall, INRIA. // Copyright: (C) 2012, 2015 Julia Lawall, INRIA.
// Copyright: (C) 2012, 2015 Gilles Muller, INRIA. // Copyright: (C) 2012, 2015 Gilles Muller, INRIA.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --no-includes --include-headers // Options: --no-includes --include-headers
virtual patch virtual patch

View File

@ -13,7 +13,7 @@
/// ///
// Confidence: Average // Confidence: Average
// Copyright: (C) 2015 Andrzej Hajda, Samsung Electronics Co., Ltd. // Copyright: (C) 2015 Andrzej Hajda, Samsung Electronics Co., Ltd.
// URL: http://coccinelle.lip6.fr/ // URL: https://coccinelle.gitlabpages.inria.fr/website
// Options: --all-includes // Options: --all-includes
virtual context virtual context

View File

@ -45,8 +45,13 @@ else
fi fi
fi fi
declare -A cache declare aarray_support=true
declare -A modcache declare -A cache 2>/dev/null
if [[ $? != 0 ]]; then
aarray_support=false
else
declare -A modcache
fi
find_module() { find_module() {
if [[ -n $debuginfod ]] ; then if [[ -n $debuginfod ]] ; then
@ -97,7 +102,7 @@ parse_symbol() {
if [[ $module == "" ]] ; then if [[ $module == "" ]] ; then
local objfile=$vmlinux local objfile=$vmlinux
elif [[ "${modcache[$module]+isset}" == "isset" ]]; then elif [[ $aarray_support == true && "${modcache[$module]+isset}" == "isset" ]]; then
local objfile=${modcache[$module]} local objfile=${modcache[$module]}
else else
local objfile=$(find_module) local objfile=$(find_module)
@ -105,7 +110,9 @@ parse_symbol() {
echo "WARNING! Modules path isn't set, but is needed to parse this symbol" >&2 echo "WARNING! Modules path isn't set, but is needed to parse this symbol" >&2
return return
fi fi
modcache[$module]=$objfile if [[ $aarray_support == true ]]; then
modcache[$module]=$objfile
fi
fi fi
# Remove the englobing parenthesis # Remove the englobing parenthesis
@ -125,7 +132,7 @@ parse_symbol() {
# Use 'nm vmlinux' to figure out the base address of said symbol. # Use 'nm vmlinux' to figure out the base address of said symbol.
# It's actually faster to call it every time than to load it # It's actually faster to call it every time than to load it
# all into bash. # all into bash.
if [[ "${cache[$module,$name]+isset}" == "isset" ]]; then if [[ $aarray_support == true && "${cache[$module,$name]+isset}" == "isset" ]]; then
local base_addr=${cache[$module,$name]} local base_addr=${cache[$module,$name]}
else else
local base_addr=$(nm "$objfile" 2>/dev/null | awk '$3 == "'$name'" && ($2 == "t" || $2 == "T") {print $1; exit}') local base_addr=$(nm "$objfile" 2>/dev/null | awk '$3 == "'$name'" && ($2 == "t" || $2 == "T") {print $1; exit}')
@ -133,7 +140,9 @@ parse_symbol() {
# address not found # address not found
return return
fi fi
cache[$module,$name]="$base_addr" if [[ $aarray_support == true ]]; then
cache[$module,$name]="$base_addr"
fi
fi fi
# Let's start doing the math to get the exact address into the # Let's start doing the math to get the exact address into the
# symbol. First, strip out the symbol total length. # symbol. First, strip out the symbol total length.
@ -149,11 +158,13 @@ parse_symbol() {
# Pass it to addr2line to get filename and line number # Pass it to addr2line to get filename and line number
# Could get more than one result # Could get more than one result
if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then if [[ $aarray_support == true && "${cache[$module,$address]+isset}" == "isset" ]]; then
local code=${cache[$module,$address]} local code=${cache[$module,$address]}
else else
local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address" 2>/dev/null) local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address" 2>/dev/null)
cache[$module,$address]=$code if [[ $aarray_support == true ]]; then
cache[$module,$address]=$code
fi
fi fi
# addr2line doesn't return a proper error code if it fails, so # addr2line doesn't return a proper error code if it fails, so

View File

@ -1 +0,0 @@
../../../arch/arc/boot/dts

View File

@ -1 +0,0 @@
../../../arch/arm/boot/dts

View File

@ -1 +0,0 @@
../../../arch/arm64/boot/dts

View File

@ -1 +0,0 @@
../../../include/dt-bindings

View File

@ -1 +0,0 @@
../../../arch/microblaze/boot/dts

View File

@ -1 +0,0 @@
../../../arch/mips/boot/dts

View File

@ -1 +0,0 @@
../../../arch/nios2/boot/dts

View File

@ -1 +0,0 @@
../../../arch/openrisc/boot/dts

View File

@ -1 +0,0 @@
../../../arch/powerpc/boot/dts

View File

@ -1 +0,0 @@
../../../arch/sh/boot/dts

View File

@ -1 +0,0 @@
../../../arch/xtensa/boot/dts

View File

@ -59,7 +59,7 @@ fi
if arg_contain -E "$@"; then if arg_contain -E "$@"; then
# For scripts/cc-version.sh; This emulates GCC 20.0.0 # For scripts/cc-version.sh; This emulates GCC 20.0.0
if arg_contain - "$@"; then if arg_contain - "$@"; then
sed -n '/^GCC/{s/__GNUC__/20/; s/__GNUC_MINOR__/0/; s/__GNUC_PATCHLEVEL__/0/; p;}' sed -n '/^GCC/{s/__GNUC__/20/; s/__GNUC_MINOR__/0/; s/__GNUC_PATCHLEVEL__/0/; p;}; s/__LONG_DOUBLE_128__/1/ p'
exit 0 exit 0
else else
echo "no input files" >&2 echo "no input files" >&2
@ -96,12 +96,8 @@ fi
# To set GCC_PLUGINS # To set GCC_PLUGINS
if arg_contain -print-file-name=plugin "$@"; then if arg_contain -print-file-name=plugin "$@"; then
plugin_dir=$(mktemp -d) # Use $0 to find the in-tree dummy directory
echo "$(dirname "$(readlink -f "$0")")/dummy-plugin-dir"
mkdir -p $plugin_dir/include
touch $plugin_dir/include/plugin-version.h
echo $plugin_dir
exit 0 exit 0
fi fi

View File

@ -1,30 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-only
# Dummy script that always succeeds.
# Check if the first parameter appears in the rest. Succeeds if found.
# This helper is useful if a particular option was passed to this script.
# Typically used like this:
# arg_contain <word-you-are-searching-for> "$@"
arg_contain ()
{
search="$1"
shift
while [ $# -gt 0 ]
do
if [ "$search" = "$1" ]; then
return 0
fi
shift
done
return 1
}
if arg_contain --version "$@" || arg_contain -v "$@"; then
progname=$(basename $0)
echo "GNU $progname (scripts/dummy-tools/$progname) 2.50"
exit 0
fi

View File

@ -1,30 +0,0 @@
#!/bin/sh
# SPDX-License-Identifier: GPL-2.0-only
# Dummy script that always succeeds.
# Check if the first parameter appears in the rest. Succeeds if found.
# This helper is useful if a particular option was passed to this script.
# Typically used like this:
# arg_contain <word-you-are-searching-for> "$@"
arg_contain ()
{
search="$1"
shift
while [ $# -gt 0 ]
do
if [ "$search" = "$1" ]; then
return 0
fi
shift
done
return 1
}
if arg_contain --version "$@" || arg_contain -v "$@"; then
progname=$(basename $0)
echo "GNU $progname (scripts/dummy-tools/$progname) 2.50"
exit 0
fi

View File

@ -44,17 +44,6 @@
set -o errexit set -o errexit
set -o nounset set -o nounset
READELF="${CROSS_COMPILE:-}readelf"
ADDR2LINE="${CROSS_COMPILE:-}addr2line"
SIZE="${CROSS_COMPILE:-}size"
NM="${CROSS_COMPILE:-}nm"
command -v awk >/dev/null 2>&1 || die "awk isn't installed"
command -v ${READELF} >/dev/null 2>&1 || die "readelf isn't installed"
command -v ${ADDR2LINE} >/dev/null 2>&1 || die "addr2line isn't installed"
command -v ${SIZE} >/dev/null 2>&1 || die "size isn't installed"
command -v ${NM} >/dev/null 2>&1 || die "nm isn't installed"
usage() { usage() {
echo "usage: faddr2line [--list] <object file> <func+offset> <func+offset>..." >&2 echo "usage: faddr2line [--list] <object file> <func+offset> <func+offset>..." >&2
exit 1 exit 1
@ -69,6 +58,15 @@ die() {
exit 1 exit 1
} }
READELF="${CROSS_COMPILE:-}readelf"
ADDR2LINE="${CROSS_COMPILE:-}addr2line"
AWK="awk"
GREP="grep"
command -v ${AWK} >/dev/null 2>&1 || die "${AWK} isn't installed"
command -v ${READELF} >/dev/null 2>&1 || die "${READELF} isn't installed"
command -v ${ADDR2LINE} >/dev/null 2>&1 || die "${ADDR2LINE} isn't installed"
# Try to figure out the source directory prefix so we can remove it from the # Try to figure out the source directory prefix so we can remove it from the
# addr2line output. HACK ALERT: This assumes that start_kernel() is in # addr2line output. HACK ALERT: This assumes that start_kernel() is in
# init/main.c! This only works for vmlinux. Otherwise it falls back to # init/main.c! This only works for vmlinux. Otherwise it falls back to
@ -76,7 +74,7 @@ die() {
find_dir_prefix() { find_dir_prefix() {
local objfile=$1 local objfile=$1
local start_kernel_addr=$(${READELF} -sW $objfile | awk '$8 == "start_kernel" {printf "0x%s", $2}') local start_kernel_addr=$(${READELF} --symbols --wide $objfile | ${AWK} '$8 == "start_kernel" {printf "0x%s", $2}')
[[ -z $start_kernel_addr ]] && return [[ -z $start_kernel_addr ]] && return
local file_line=$(${ADDR2LINE} -e $objfile $start_kernel_addr) local file_line=$(${ADDR2LINE} -e $objfile $start_kernel_addr)
@ -97,86 +95,158 @@ __faddr2line() {
local dir_prefix=$3 local dir_prefix=$3
local print_warnings=$4 local print_warnings=$4
local func=${func_addr%+*} local sym_name=${func_addr%+*}
local offset=${func_addr#*+} local func_offset=${func_addr#*+}
offset=${offset%/*} func_offset=${func_offset%/*}
local size= local user_size=
[[ $func_addr =~ "/" ]] && size=${func_addr#*/} local file_type
local is_vmlinux=0
[[ $func_addr =~ "/" ]] && user_size=${func_addr#*/}
if [[ -z $func ]] || [[ -z $offset ]] || [[ $func = $func_addr ]]; then if [[ -z $sym_name ]] || [[ -z $func_offset ]] || [[ $sym_name = $func_addr ]]; then
warn "bad func+offset $func_addr" warn "bad func+offset $func_addr"
DONE=1 DONE=1
return return
fi fi
# Go through each of the object's symbols which match the func name. # vmlinux uses absolute addresses in the section table rather than
# In rare cases there might be duplicates. # section offsets.
file_end=$(${SIZE} -Ax $objfile | awk '$1 == ".text" {print $2}') local file_type=$(${READELF} --file-header $objfile |
while read symbol; do ${AWK} '$1 == "Type:" { print $2; exit }')
local fields=($symbol) if [[ $file_type = "EXEC" ]] || [[ $file_type == "DYN" ]]; then
local sym_base=0x${fields[0]} is_vmlinux=1
local sym_type=${fields[1]} fi
local sym_end=${fields[3]}
# calculate the size # Go through each of the object's symbols which match the func name.
local sym_size=$(($sym_end - $sym_base)) # In rare cases there might be duplicates, in which case we print all
if [[ -z $sym_size ]] || [[ $sym_size -le 0 ]]; then # matches.
warn "bad symbol size: base: $sym_base end: $sym_end" while read line; do
local fields=($line)
local sym_addr=0x${fields[1]}
local sym_elf_size=${fields[2]}
local sym_sec=${fields[6]}
local sec_size
local sec_name
# Get the section size:
sec_size=$(${READELF} --section-headers --wide $objfile |
sed 's/\[ /\[/' |
${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print "0x" $6; exit }')
if [[ -z $sec_size ]]; then
warn "bad section size: section: $sym_sec"
DONE=1 DONE=1
return return
fi fi
# Get the section name:
sec_name=$(${READELF} --section-headers --wide $objfile |
sed 's/\[ /\[/' |
${AWK} -v sec=$sym_sec '$1 == "[" sec "]" { print $2; exit }')
if [[ -z $sec_name ]]; then
warn "bad section name: section: $sym_sec"
DONE=1
return
fi
# Calculate the symbol size.
#
# Unfortunately we can't use the ELF size, because kallsyms
# also includes the padding bytes in its size calculation. For
# kallsyms, the size calculation is the distance between the
# symbol and the next symbol in a sorted list.
local sym_size
local cur_sym_addr
local found=0
while read line; do
local fields=($line)
cur_sym_addr=0x${fields[1]}
local cur_sym_elf_size=${fields[2]}
local cur_sym_name=${fields[7]:-}
if [[ $cur_sym_addr = $sym_addr ]] &&
[[ $cur_sym_elf_size = $sym_elf_size ]] &&
[[ $cur_sym_name = $sym_name ]]; then
found=1
continue
fi
if [[ $found = 1 ]]; then
sym_size=$(($cur_sym_addr - $sym_addr))
[[ $sym_size -lt $sym_elf_size ]] && continue;
found=2
break
fi
done < <(${READELF} --symbols --wide $objfile | ${AWK} -v sec=$sym_sec '$7 == sec' | sort --key=2)
if [[ $found = 0 ]]; then
warn "can't find symbol: sym_name: $sym_name sym_sec: $sym_sec sym_addr: $sym_addr sym_elf_size: $sym_elf_size"
DONE=1
return
fi
# If nothing was found after the symbol, assume it's the last
# symbol in the section.
[[ $found = 1 ]] && sym_size=$(($sec_size - $sym_addr))
if [[ -z $sym_size ]] || [[ $sym_size -le 0 ]]; then
warn "bad symbol size: sym_addr: $sym_addr cur_sym_addr: $cur_sym_addr"
DONE=1
return
fi
sym_size=0x$(printf %x $sym_size) sym_size=0x$(printf %x $sym_size)
# calculate the address # Calculate the address from user-supplied offset:
local addr=$(($sym_base + $offset)) local addr=$(($sym_addr + $func_offset))
if [[ -z $addr ]] || [[ $addr = 0 ]]; then if [[ -z $addr ]] || [[ $addr = 0 ]]; then
warn "bad address: $sym_base + $offset" warn "bad address: $sym_addr + $func_offset"
DONE=1 DONE=1
return return
fi fi
addr=0x$(printf %x $addr) addr=0x$(printf %x $addr)
# weed out non-function symbols # If the user provided a size, make sure it matches the symbol's size:
if [[ $sym_type != t ]] && [[ $sym_type != T ]]; then if [[ -n $user_size ]] && [[ $user_size -ne $sym_size ]]; then
[[ $print_warnings = 1 ]] && [[ $print_warnings = 1 ]] &&
echo "skipping $func address at $addr due to non-function symbol of type '$sym_type'" echo "skipping $sym_name address at $addr due to size mismatch ($user_size != $sym_size)"
continue
fi
# if the user provided a size, make sure it matches the symbol's size
if [[ -n $size ]] && [[ $size -ne $sym_size ]]; then
[[ $print_warnings = 1 ]] &&
echo "skipping $func address at $addr due to size mismatch ($size != $sym_size)"
continue; continue;
fi fi
# make sure the provided offset is within the symbol's range # Make sure the provided offset is within the symbol's range:
if [[ $offset -gt $sym_size ]]; then if [[ $func_offset -gt $sym_size ]]; then
[[ $print_warnings = 1 ]] && [[ $print_warnings = 1 ]] &&
echo "skipping $func address at $addr due to size mismatch ($offset > $sym_size)" echo "skipping $sym_name address at $addr due to size mismatch ($func_offset > $sym_size)"
continue continue
fi fi
# separate multiple entries with a blank line # In case of duplicates or multiple addresses specified on the
# cmdline, separate multiple entries with a blank line:
[[ $FIRST = 0 ]] && echo [[ $FIRST = 0 ]] && echo
FIRST=0 FIRST=0
# pass real address to addr2line echo "$sym_name+$func_offset/$sym_size:"
echo "$func+$offset/$sym_size:"
local file_lines=$(${ADDR2LINE} -fpie $objfile $addr | sed "s; $dir_prefix\(\./\)*; ;")
[[ -z $file_lines ]] && return
# Pass section address to addr2line and strip absolute paths
# from the output:
local args="--functions --pretty-print --inlines --exe=$objfile"
[[ $is_vmlinux = 0 ]] && args="$args --section=$sec_name"
local output=$(${ADDR2LINE} $args $addr | sed "s; $dir_prefix\(\./\)*; ;")
[[ -z $output ]] && continue
# Default output (non --list):
if [[ $LIST = 0 ]]; then if [[ $LIST = 0 ]]; then
echo "$file_lines" | while read -r line echo "$output" | while read -r line
do do
echo $line echo $line
done done
DONE=1; DONE=1;
return continue
fi fi
# show each line with context # For --list, show each line with its corresponding source code:
echo "$file_lines" | while read -r line echo "$output" | while read -r line
do do
echo echo
echo $line echo $line
@ -184,12 +254,12 @@ __faddr2line() {
n1=$[$n-5] n1=$[$n-5]
n2=$[$n+5] n2=$[$n+5]
f=$(echo $line | sed 's/.*at \(.\+\):.*/\1/g') f=$(echo $line | sed 's/.*at \(.\+\):.*/\1/g')
awk 'NR>=strtonum("'$n1'") && NR<=strtonum("'$n2'") { if (NR=='$n') printf(">%d<", NR); else printf(" %d ", NR); printf("\t%s\n", $0)}' $f ${AWK} 'NR>=strtonum("'$n1'") && NR<=strtonum("'$n2'") { if (NR=='$n') printf(">%d<", NR); else printf(" %d ", NR); printf("\t%s\n", $0)}' $f
done done
DONE=1 DONE=1
done < <(${NM} -n $objfile | awk -v fn=$func -v end=$file_end '$3 == fn { found=1; line=$0; start=$1; next } found == 1 { found=0; print line, "0x"$1 } END {if (found == 1) print line, end; }') done < <(${READELF} --symbols --wide $objfile | ${AWK} -v fn=$sym_name '$4 == "FUNC" && $8 == fn')
} }
[[ $# -lt 2 ]] && usage [[ $# -lt 2 ]] && usage
@ -202,6 +272,8 @@ LIST=0
[[ ! -f $objfile ]] && die "can't find objfile $objfile" [[ ! -f $objfile ]] && die "can't find objfile $objfile"
shift shift
${READELF} --section-headers --wide $objfile | ${GREP} -q '\.debug_info' || die "CONFIG_DEBUG_INFO not enabled"
DIR_PREFIX=supercalifragilisticexpialidocious DIR_PREFIX=supercalifragilisticexpialidocious
find_dir_prefix $objfile find_dir_prefix $objfile

View File

@ -46,44 +46,6 @@ config GCC_PLUGIN_LATENT_ENTROPY
* https://grsecurity.net/ * https://grsecurity.net/
* https://pax.grsecurity.net/ * https://pax.grsecurity.net/
config GCC_PLUGIN_RANDSTRUCT
bool "Randomize layout of sensitive kernel structures"
select MODVERSIONS if MODULES
help
If you say Y here, the layouts of structures that are entirely
function pointers (and have not been manually annotated with
__no_randomize_layout), or structures that have been explicitly
marked with __randomize_layout, will be randomized at compile-time.
This can introduce the requirement of an additional information
exposure vulnerability for exploits targeting these structure
types.
Enabling this feature will introduce some performance impact,
slightly increase memory usage, and prevent the use of forensic
tools like Volatility against the system (unless the kernel
source tree isn't cleaned after kernel installation).
The seed used for compilation is located at
scripts/gcc-plugins/randomize_layout_seed.h. It remains after
a make clean to allow for external modules to be compiled with
the existing seed and will be removed by a make mrproper or
make distclean.
This plugin was ported from grsecurity/PaX. More information at:
* https://grsecurity.net/
* https://pax.grsecurity.net/
config GCC_PLUGIN_RANDSTRUCT_PERFORMANCE
bool "Use cacheline-aware structure randomization"
depends on GCC_PLUGIN_RANDSTRUCT
depends on !COMPILE_TEST # do not reduce test coverage
help
If you say Y here, the RANDSTRUCT randomization will make a
best effort at restricting randomization to cacheline-sized
groups of elements. It will further not randomize bitfields
in structures. This reduces the performance hit of RANDSTRUCT
at the cost of weakened randomization.
config GCC_PLUGIN_ARM_SSP_PER_TASK config GCC_PLUGIN_ARM_SSP_PER_TASK
bool bool
depends on GCC_PLUGINS && ARM depends on GCC_PLUGINS && ARM

View File

@ -1,12 +1,17 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
$(obj)/randomize_layout_plugin.so: $(objtree)/$(obj)/randomize_layout_seed.h $(obj)/randomize_layout_plugin.so: $(obj)/randomize_layout_seed.h
quiet_cmd_create_randomize_layout_seed = GENSEED $@ quiet_cmd_create_randomize_layout_seed = SEEDHDR $@
cmd_create_randomize_layout_seed = \ cmd_create_randomize_layout_seed = \
$(CONFIG_SHELL) $(srctree)/$(src)/gen-random-seed.sh $@ $(objtree)/include/generated/randomize_layout_hash.h SEED=$$(cat $(filter-out FORCE,$^) </dev/null); \
$(objtree)/$(obj)/randomize_layout_seed.h: FORCE echo '/*' > $@; \
echo ' * This file is automatically generated. Keep it private.' >> $@; \
echo ' * Exposing this value will expose the layout of randomized structures.' >> $@; \
echo ' */' >> $@; \
echo "const char *randstruct_seed = \"$$SEED\";" >> $@
$(obj)/randomize_layout_seed.h: $(objtree)/scripts/basic/randstruct.seed FORCE
$(call if_changed,create_randomize_layout_seed) $(call if_changed,create_randomize_layout_seed)
targets += randomize_layout_seed.h randomize_layout_hash.h targets += randomize_layout_seed.h
# Build rules for plugins # Build rules for plugins
# #
@ -23,10 +28,11 @@ GCC_PLUGINS_DIR = $(shell $(CC) -print-file-name=plugin)
plugin_cxxflags = -Wp,-MMD,$(depfile) $(KBUILD_HOSTCXXFLAGS) -fPIC \ plugin_cxxflags = -Wp,-MMD,$(depfile) $(KBUILD_HOSTCXXFLAGS) -fPIC \
-include $(srctree)/include/linux/compiler-version.h \ -include $(srctree)/include/linux/compiler-version.h \
-I $(GCC_PLUGINS_DIR)/include -I $(obj) -std=gnu++11 \ -DPLUGIN_VERSION=$(call stringify,$(KERNELVERSION)) \
-fno-rtti -fno-exceptions -fasynchronous-unwind-tables \ -I $(GCC_PLUGINS_DIR)/include -I $(obj) -std=gnu++11 \
-ggdb -Wno-narrowing -Wno-unused-variable \ -fno-rtti -fno-exceptions -fasynchronous-unwind-tables \
-Wno-format-diag -ggdb -Wno-narrowing -Wno-unused-variable \
-Wno-format-diag
plugin_ldflags = -shared plugin_ldflags = -shared

View File

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/* /*
* Copyright 2012-2016 by the PaX Team <pageexec@freemail.hu> * Copyright 2012-2016 by the PaX Team <pageexec@freemail.hu>
* Copyright 2016 by Emese Revfy <re.emese@gmail.com> * Copyright 2016 by Emese Revfy <re.emese@gmail.com>
* Licensed under the GPL v2
* *
* Note: the choice of the license means that the compilation process is * Note: the choice of the license means that the compilation process is
* NOT 'eligible' as defined by gcc's library exception to the GPL v3, * NOT 'eligible' as defined by gcc's library exception to the GPL v3,
@ -82,7 +82,7 @@ __visible int plugin_is_GPL_compatible;
static GTY(()) tree latent_entropy_decl; static GTY(()) tree latent_entropy_decl;
static struct plugin_info latent_entropy_plugin_info = { static struct plugin_info latent_entropy_plugin_info = {
.version = "201606141920vanilla", .version = PLUGIN_VERSION,
.help = "disable\tturn off latent entropy instrumentation\n", .help = "disable\tturn off latent entropy instrumentation\n",
}; };

View File

@ -34,29 +34,11 @@ __visible int plugin_is_GPL_compatible;
static int performance_mode; static int performance_mode;
static struct plugin_info randomize_layout_plugin_info = { static struct plugin_info randomize_layout_plugin_info = {
.version = "201402201816vanilla", .version = PLUGIN_VERSION,
.help = "disable\t\t\tdo not activate plugin\n" .help = "disable\t\t\tdo not activate plugin\n"
"performance-mode\tenable cacheline-aware layout randomization\n" "performance-mode\tenable cacheline-aware layout randomization\n"
}; };
struct whitelist_entry {
const char *pathname;
const char *lhs;
const char *rhs;
};
static const struct whitelist_entry whitelist[] = {
/* NIU overloads mapping with page struct */
{ "drivers/net/ethernet/sun/niu.c", "page", "address_space" },
/* unix_skb_parms via UNIXCB() buffer */
{ "net/unix/af_unix.c", "unix_skb_parms", "char" },
/* big_key payload.data struct splashing */
{ "security/keys/big_key.c", "path", "void *" },
/* walk struct security_hook_heads as an array of struct hlist_head */
{ "security/security.c", "hlist_head", "security_hook_heads" },
{ }
};
/* from old Linux dcache.h */ /* from old Linux dcache.h */
static inline unsigned long static inline unsigned long
partial_name_hash(unsigned long c, unsigned long prevhash) partial_name_hash(unsigned long c, unsigned long prevhash)
@ -742,60 +724,6 @@ static void handle_local_var_initializers(void)
} }
} }
static bool type_name_eq(gimple stmt, const_tree type_tree, const char *wanted_name)
{
const char *type_name;
if (type_tree == NULL_TREE)
return false;
switch (TREE_CODE(type_tree)) {
case RECORD_TYPE:
type_name = TYPE_NAME_POINTER(type_tree);
break;
case INTEGER_TYPE:
if (TYPE_PRECISION(type_tree) == CHAR_TYPE_SIZE)
type_name = "char";
else {
INFORM(gimple_location(stmt), "found non-char INTEGER_TYPE cast comparison: %qT\n", type_tree);
debug_tree(type_tree);
return false;
}
break;
case POINTER_TYPE:
if (TREE_CODE(TREE_TYPE(type_tree)) == VOID_TYPE) {
type_name = "void *";
break;
} else {
INFORM(gimple_location(stmt), "found non-void POINTER_TYPE cast comparison %qT\n", type_tree);
debug_tree(type_tree);
return false;
}
default:
INFORM(gimple_location(stmt), "unhandled cast comparison: %qT\n", type_tree);
debug_tree(type_tree);
return false;
}
return strcmp(type_name, wanted_name) == 0;
}
static bool whitelisted_cast(gimple stmt, const_tree lhs_tree, const_tree rhs_tree)
{
const struct whitelist_entry *entry;
expanded_location xloc = expand_location(gimple_location(stmt));
for (entry = whitelist; entry->pathname; entry++) {
if (!strstr(xloc.file, entry->pathname))
continue;
if (type_name_eq(stmt, lhs_tree, entry->lhs) && type_name_eq(stmt, rhs_tree, entry->rhs))
return true;
}
return false;
}
/* /*
* iterate over all statements to find "bad" casts: * iterate over all statements to find "bad" casts:
* those where the address of the start of a structure is cast * those where the address of the start of a structure is cast
@ -872,10 +800,7 @@ static unsigned int find_bad_casts_execute(void)
#ifndef __DEBUG_PLUGIN #ifndef __DEBUG_PLUGIN
if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_lhs_type))) if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_lhs_type)))
#endif #endif
{ MISMATCH(gimple_location(stmt), "rhs", ptr_lhs_type, ptr_rhs_type);
if (!whitelisted_cast(stmt, ptr_lhs_type, ptr_rhs_type))
MISMATCH(gimple_location(stmt), "rhs", ptr_lhs_type, ptr_rhs_type);
}
continue; continue;
} }
@ -898,10 +823,7 @@ static unsigned int find_bad_casts_execute(void)
#ifndef __DEBUG_PLUGIN #ifndef __DEBUG_PLUGIN
if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(op0_type))) if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(op0_type)))
#endif #endif
{ MISMATCH(gimple_location(stmt), "op0", ptr_lhs_type, op0_type);
if (!whitelisted_cast(stmt, ptr_lhs_type, op0_type))
MISMATCH(gimple_location(stmt), "op0", ptr_lhs_type, op0_type);
}
} else { } else {
const_tree ssa_name_var = SSA_NAME_VAR(rhs1); const_tree ssa_name_var = SSA_NAME_VAR(rhs1);
/* skip bogus type casts introduced by container_of */ /* skip bogus type casts introduced by container_of */
@ -911,10 +833,7 @@ static unsigned int find_bad_casts_execute(void)
#ifndef __DEBUG_PLUGIN #ifndef __DEBUG_PLUGIN
if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_rhs_type))) if (lookup_attribute("randomize_performed", TYPE_ATTRIBUTES(ptr_rhs_type)))
#endif #endif
{ MISMATCH(gimple_location(stmt), "ssa", ptr_lhs_type, ptr_rhs_type);
if (!whitelisted_cast(stmt, ptr_lhs_type, ptr_rhs_type))
MISMATCH(gimple_location(stmt), "ssa", ptr_lhs_type, ptr_rhs_type);
}
} }
} }

View File

@ -26,7 +26,7 @@ __visible int plugin_is_GPL_compatible;
tree sancov_fndecl; tree sancov_fndecl;
static struct plugin_info sancov_plugin_info = { static struct plugin_info sancov_plugin_info = {
.version = "20160402", .version = PLUGIN_VERSION,
.help = "sancov plugin\n", .help = "sancov plugin\n",
}; };

View File

@ -1,7 +1,7 @@
// SPDX-License-Identifier: GPL-2.0-only
/* /*
* Copyright 2011-2017 by the PaX Team <pageexec@freemail.hu> * Copyright 2011-2017 by the PaX Team <pageexec@freemail.hu>
* Modified by Alexander Popov <alex.popov@linux.com> * Modified by Alexander Popov <alex.popov@linux.com>
* Licensed under the GPL v2
* *
* Note: the choice of the license means that the compilation process is * Note: the choice of the license means that the compilation process is
* NOT 'eligible' as defined by gcc's library exception to the GPL v3, * NOT 'eligible' as defined by gcc's library exception to the GPL v3,
@ -44,7 +44,7 @@ static bool verbose = false;
static GTY(()) tree track_function_decl; static GTY(()) tree track_function_decl;
static struct plugin_info stackleak_plugin_info = { static struct plugin_info stackleak_plugin_info = {
.version = "201707101337", .version = PLUGIN_VERSION,
.help = "track-min-size=nn\ttrack stack for functions with a stack frame size >= nn bytes\n" .help = "track-min-size=nn\ttrack stack for functions with a stack frame size >= nn bytes\n"
"arch=target_arch\tspecify target build arch\n" "arch=target_arch\tspecify target build arch\n"
"disable\t\tdo not activate the plugin\n" "disable\t\tdo not activate the plugin\n"

View File

@ -1,6 +1,6 @@
// SPDX-License-Identifier: GPL-2.0-only
/* /*
* Copyright 2013-2017 by PaX Team <pageexec@freemail.hu> * Copyright 2013-2017 by PaX Team <pageexec@freemail.hu>
* Licensed under the GPL v2
* *
* Note: the choice of the license means that the compilation process is * Note: the choice of the license means that the compilation process is
* NOT 'eligible' as defined by gcc's library exception to the GPL v3, * NOT 'eligible' as defined by gcc's library exception to the GPL v3,
@ -37,7 +37,7 @@
__visible int plugin_is_GPL_compatible; __visible int plugin_is_GPL_compatible;
static struct plugin_info structleak_plugin_info = { static struct plugin_info structleak_plugin_info = {
.version = "20190125vanilla", .version = PLUGIN_VERSION,
.help = "disable\tdo not activate plugin\n" .help = "disable\tdo not activate plugin\n"
"byref\tinit structs passed by reference\n" "byref\tinit structs passed by reference\n"
"byref-all\tinit anything passed by reference\n" "byref-all\tinit anything passed by reference\n"

View File

@ -24,9 +24,9 @@ class LxConfigDump(gdb.Command):
filename = arg filename = arg
try: try:
py_config_ptr = gdb.parse_and_eval("kernel_config_data + 8") py_config_ptr = gdb.parse_and_eval("&kernel_config_data")
py_config_size = gdb.parse_and_eval( py_config_ptr_end = gdb.parse_and_eval("&kernel_config_data_end")
"sizeof(kernel_config_data) - 1 - 8 * 2") py_config_size = py_config_ptr_end - py_config_ptr
except gdb.error as e: except gdb.error as e:
raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?") raise gdb.GdbError("Can't find config, enable CONFIG_IKCONFIG?")

View File

@ -22,7 +22,6 @@ prb_desc_type = utils.CachedType("struct prb_desc")
prb_desc_ring_type = utils.CachedType("struct prb_desc_ring") prb_desc_ring_type = utils.CachedType("struct prb_desc_ring")
prb_data_ring_type = utils.CachedType("struct prb_data_ring") prb_data_ring_type = utils.CachedType("struct prb_data_ring")
printk_ringbuffer_type = utils.CachedType("struct printk_ringbuffer") printk_ringbuffer_type = utils.CachedType("struct printk_ringbuffer")
atomic_long_type = utils.CachedType("atomic_long_t")
class LxDmesg(gdb.Command): class LxDmesg(gdb.Command):
"""Print Linux kernel log buffer.""" """Print Linux kernel log buffer."""
@ -68,8 +67,6 @@ class LxDmesg(gdb.Command):
off = prb_data_ring_type.get_type()['data'].bitpos // 8 off = prb_data_ring_type.get_type()['data'].bitpos // 8
text_data_addr = utils.read_ulong(text_data_ring, off) text_data_addr = utils.read_ulong(text_data_ring, off)
counter_off = atomic_long_type.get_type()['counter'].bitpos // 8
sv_off = prb_desc_type.get_type()['state_var'].bitpos // 8 sv_off = prb_desc_type.get_type()['state_var'].bitpos // 8
off = prb_desc_type.get_type()['text_blk_lpos'].bitpos // 8 off = prb_desc_type.get_type()['text_blk_lpos'].bitpos // 8
@ -89,9 +86,9 @@ class LxDmesg(gdb.Command):
# read in tail and head descriptor ids # read in tail and head descriptor ids
off = prb_desc_ring_type.get_type()['tail_id'].bitpos // 8 off = prb_desc_ring_type.get_type()['tail_id'].bitpos // 8
tail_id = utils.read_u64(desc_ring, off + counter_off) tail_id = utils.read_atomic_long(desc_ring, off)
off = prb_desc_ring_type.get_type()['head_id'].bitpos // 8 off = prb_desc_ring_type.get_type()['head_id'].bitpos // 8
head_id = utils.read_u64(desc_ring, off + counter_off) head_id = utils.read_atomic_long(desc_ring, off)
did = tail_id did = tail_id
while True: while True:
@ -102,7 +99,7 @@ class LxDmesg(gdb.Command):
desc = utils.read_memoryview(inf, desc_addr + desc_off, desc_sz).tobytes() desc = utils.read_memoryview(inf, desc_addr + desc_off, desc_sz).tobytes()
# skip non-committed record # skip non-committed record
state = 3 & (utils.read_u64(desc, sv_off + counter_off) >> desc_flags_shift) state = 3 & (utils.read_atomic_long(desc, sv_off) >> desc_flags_shift)
if state != desc_committed and state != desc_finalized: if state != desc_committed and state != desc_finalized:
if did == head_id: if did == head_id:
break break

View File

@ -180,7 +180,7 @@ lx-symbols command."""
self.breakpoint.delete() self.breakpoint.delete()
self.breakpoint = None self.breakpoint = None
self.breakpoint = LoadModuleBreakpoint( self.breakpoint = LoadModuleBreakpoint(
"kernel/module.c:do_init_module", self) "kernel/module/main.c:do_init_module", self)
else: else:
gdb.write("Note: symbol update on module loading not supported " gdb.write("Note: symbol update on module loading not supported "
"with this gdb version\n") "with this gdb version\n")

View File

@ -35,13 +35,12 @@ class CachedType:
long_type = CachedType("long") long_type = CachedType("long")
atomic_long_type = CachedType("atomic_long_t")
def get_long_type(): def get_long_type():
global long_type global long_type
return long_type.get_type() return long_type.get_type()
def offset_of(typeobj, field): def offset_of(typeobj, field):
element = gdb.Value(0).cast(typeobj) element = gdb.Value(0).cast(typeobj)
return int(str(element[field].address).split()[0], 16) return int(str(element[field].address).split()[0], 16)
@ -129,6 +128,17 @@ def read_ulong(buffer, offset):
else: else:
return read_u32(buffer, offset) return read_u32(buffer, offset)
atomic_long_counter_offset = atomic_long_type.get_type()['counter'].bitpos
atomic_long_counter_sizeof = atomic_long_type.get_type()['counter'].type.sizeof
def read_atomic_long(buffer, offset):
global atomic_long_counter_offset
global atomic_long_counter_sizeof
if atomic_long_counter_sizeof == 8:
return read_u64(buffer, offset + atomic_long_counter_offset)
else:
return read_u32(buffer, offset + atomic_long_counter_offset)
target_arch = None target_arch = None

View File

@ -13,7 +13,7 @@
import os import os
sys.path.insert(0, os.path.dirname(__file__) + "/scripts/gdb") sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)) + "/scripts/gdb")
try: try:
gdb.parse_and_eval("0") gdb.parse_and_eval("0")

View File

@ -2,13 +2,10 @@
# SPDX-License-Identifier: GPL-2.0-only # SPDX-License-Identifier: GPL-2.0-only
# Create an autoksyms.h header file from the list of all module's needed symbols # Create an autoksyms.h header file from the list of all module's needed symbols
# as recorded on the second line of *.mod files and the user-provided symbol # as recorded in *.usyms files and the user-provided symbol whitelist.
# whitelist.
set -e set -e
output_file="$1"
# Use "make V=1" to debug this script. # Use "make V=1" to debug this script.
case "$KBUILD_VERBOSE" in case "$KBUILD_VERBOSE" in
*1*) *1*)
@ -16,6 +13,15 @@ case "$KBUILD_VERBOSE" in
;; ;;
esac esac
read_modorder=
if [ "$1" = --modorder ]; then
shift
read_modorder=1
fi
output_file="$1"
needed_symbols= needed_symbols=
# Special case for modversions (see modpost.c) # Special case for modversions (see modpost.c)
@ -41,10 +47,8 @@ cat > "$output_file" << EOT
EOT EOT
[ -f modules.order ] && modlist=modules.order || modlist=/dev/null
{ {
sed 's/ko$/mod/' $modlist | xargs -n1 sed -n -e '2p' [ -n "${read_modorder}" ] && sed 's/ko$/usyms/' modules.order | xargs cat
echo "$needed_symbols" echo "$needed_symbols"
[ -n "$ksym_wl" ] && cat "$ksym_wl" [ -n "$ksym_wl" ] && cat "$ksym_wl"
} | sed -e 's/ /\n/g' | sed -n -e '/^$/!p' | } | sed -e 's/ /\n/g' | sed -n -e '/^$/!p' |
@ -52,4 +56,7 @@ EOT
# point addresses. # point addresses.
sed -e 's/^\.//' | sed -e 's/^\.//' |
sort -u | sort -u |
# Ignore __this_module. It's not an exported symbol, and will be resolved
# when the final .ko's are linked.
grep -v '^__this_module$' |
sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$output_file" sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$output_file"

View File

@ -33,7 +33,7 @@ char *cur_filename;
int in_source_file; int in_source_file;
static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types, static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,
flag_preserve, flag_warnings, flag_rel_crcs; flag_preserve, flag_warnings;
static int errors; static int errors;
static int nsyms; static int nsyms;
@ -680,11 +680,7 @@ void export_symbol(const char *name)
if (flag_dump_defs) if (flag_dump_defs)
fputs(">\n", debugfile); fputs(">\n", debugfile);
/* Used as a linker script. */ printf("#SYMVER %s 0x%08lx\n", name, crc);
printf(!flag_rel_crcs ? "__crc_%s = 0x%08lx;\n" :
"SECTIONS { .rodata : ALIGN(4) { "
"__crc_%s = .; LONG(0x%08lx); } }\n",
name, crc);
} }
} }
@ -733,7 +729,6 @@ static void genksyms_usage(void)
" -q, --quiet Disable warnings (default)\n" " -q, --quiet Disable warnings (default)\n"
" -h, --help Print this message\n" " -h, --help Print this message\n"
" -V, --version Print the release version\n" " -V, --version Print the release version\n"
" -R, --relative-crc Emit section relative symbol CRCs\n"
#else /* __GNU_LIBRARY__ */ #else /* __GNU_LIBRARY__ */
" -s Select symbol prefix\n" " -s Select symbol prefix\n"
" -d Increment the debug level (repeatable)\n" " -d Increment the debug level (repeatable)\n"
@ -745,7 +740,6 @@ static void genksyms_usage(void)
" -q Disable warnings (default)\n" " -q Disable warnings (default)\n"
" -h Print this message\n" " -h Print this message\n"
" -V Print the release version\n" " -V Print the release version\n"
" -R Emit section relative symbol CRCs\n"
#endif /* __GNU_LIBRARY__ */ #endif /* __GNU_LIBRARY__ */
, stderr); , stderr);
} }
@ -766,14 +760,13 @@ int main(int argc, char **argv)
{"preserve", 0, 0, 'p'}, {"preserve", 0, 0, 'p'},
{"version", 0, 0, 'V'}, {"version", 0, 0, 'V'},
{"help", 0, 0, 'h'}, {"help", 0, 0, 'h'},
{"relative-crc", 0, 0, 'R'},
{0, 0, 0, 0} {0, 0, 0, 0}
}; };
while ((o = getopt_long(argc, argv, "s:dwqVDr:T:phR", while ((o = getopt_long(argc, argv, "s:dwqVDr:T:ph",
&long_opts[0], NULL)) != EOF) &long_opts[0], NULL)) != EOF)
#else /* __GNU_LIBRARY__ */ #else /* __GNU_LIBRARY__ */
while ((o = getopt(argc, argv, "s:dwqVDr:T:phR")) != EOF) while ((o = getopt(argc, argv, "s:dwqVDr:T:ph")) != EOF)
#endif /* __GNU_LIBRARY__ */ #endif /* __GNU_LIBRARY__ */
switch (o) { switch (o) {
case 'd': case 'd':
@ -813,9 +806,6 @@ int main(int argc, char **argv)
case 'h': case 'h':
genksyms_usage(); genksyms_usage();
return 0; return 0;
case 'R':
flag_rel_crcs = 1;
break;
default: default:
genksyms_usage(); genksyms_usage();
return 1; return 1;

View File

@ -981,11 +981,11 @@ __END__
=head1 NAME =head1 NAME
abi_book.pl - parse the Linux ABI files and produce a ReST book. get_abi.pl - parse the Linux ABI files and produce a ReST book.
=head1 SYNOPSIS =head1 SYNOPSIS
B<abi_book.pl> [--debug <level>] [--enable-lineno] [--man] [--help] B<get_abi.pl> [--debug <level>] [--enable-lineno] [--man] [--help]
[--(no-)rst-source] [--dir=<dir>] [--show-hints] [--(no-)rst-source] [--dir=<dir>] [--show-hints]
[--search-string <regex>] [--search-string <regex>]
<COMMAND> [<ARGUMENT>] <COMMAND> [<ARGUMENT>]

View File

@ -1,4 +1,4 @@
#!/usr/bin/perl #!/usr/bin/env perl
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
use strict; use strict;

View File

@ -983,6 +983,7 @@ sub get_maintainers {
} }
foreach my $email (@file_emails) { foreach my $email (@file_emails) {
$email = mailmap_email($email);
my ($name, $address) = parse_email($email); my ($name, $address) = parse_email($email);
my $tmp_email = format_email($name, $address, $email_usename); my $tmp_email = format_email($name, $address, $email_usename);

Some files were not shown because too many files have changed in this diff Show More