Merge 4.9.212 branch 'android-4.9-q' into tw10-android-4.9-q
Documentation/filesystems/fscrypt.rst arch/arm/common/Kconfig arch/arm64/boot/dts/altera/socfpga_stratix10.dtsi arch/arm64/boot/dts/amd/amd-seattle-soc.dtsi arch/arm64/boot/dts/arm/juno-clocks.dtsi arch/arm64/boot/dts/broadcom/ns2.dtsi arch/arm64/boot/dts/lg/lg1312.dtsi arch/arm64/boot/dts/lg/lg1313.dtsi arch/arm64/boot/dts/marvell/armada-37xx.dtsi arch/arm64/boot/dts/nvidia/tegra210-p2180.dtsi arch/arm64/boot/dts/nvidia/tegra210-p2597.dtsi arch/arm64/boot/dts/nvidia/tegra210.dtsi arch/arm64/boot/dts/qcom/apq8016-sbc.dtsi arch/arm64/boot/dts/qcom/msm8996.dtsi arch/arm64/configs/ranchu64_defconfig arch/arm64/include/asm/cpucaps.h arch/arm64/kernel/cpufeature.c arch/arm64/kernel/traps.c arch/arm64/mm/mmu.c crypto/Makefile crypto/ablkcipher.c crypto/blkcipher.c crypto/testmgr.h crypto/zstd.c drivers/android/binder.c drivers/android/binder_alloc.c drivers/char/random.c drivers/clocksource/exynos_mct.c drivers/dma/pl330.c drivers/hid/hid-sony.c drivers/hid/uhid.c drivers/hid/usbhid/hiddev.c drivers/i2c/i2c-core.c drivers/md/dm-crypt.c drivers/media/v4l2-core/videobuf2-v4l2.c drivers/mmc/host/dw_mmc.c drivers/net/ethernet/broadcom/tg3.c drivers/net/usb/r8152.c drivers/scsi/scsi_logging.c drivers/scsi/sd.c drivers/scsi/ufs/ufshcd-pci.c drivers/scsi/ufs/ufshcd-pltfrm.c drivers/staging/android/Kconfig drivers/staging/android/ion/ion.c drivers/staging/android/ion/ion_priv.h drivers/staging/android/ion/ion_system_heap.c drivers/staging/android/lowmemorykiller.c drivers/tty/serial/samsung.c drivers/usb/dwc3/core.c drivers/usb/dwc3/gadget.c drivers/usb/host/xhci-hub.c drivers/video/fbdev/core/fbmon.c drivers/video/fbdev/core/modedb.c fs/crypto/fname.c fs/crypto/fscrypt_private.h fs/crypto/keyinfo.c fs/ext4/ialloc.c fs/ext4/namei.c fs/ext4/xattr.c fs/f2fs/checkpoint.c fs/f2fs/data.c fs/f2fs/debug.c fs/f2fs/dir.c fs/f2fs/f2fs.h fs/f2fs/file.c fs/f2fs/gc.c fs/f2fs/inline.c fs/f2fs/inode.c fs/f2fs/namei.c fs/f2fs/node.c fs/f2fs/recovery.c fs/f2fs/segment.c fs/f2fs/segment.h fs/f2fs/super.c fs/f2fs/sysfs.c fs/fat/dir.c fs/fat/fatent.c fs/file.c fs/namespace.c fs/pnode.c fs/proc/inode.c fs/proc/root.c fs/proc/task_mmu.c fs/sdcardfs/dentry.c fs/sdcardfs/derived_perm.c fs/sdcardfs/file.c fs/sdcardfs/inode.c fs/sdcardfs/lookup.c fs/sdcardfs/main.c fs/sdcardfs/sdcardfs.h fs/sdcardfs/super.c include/linux/blk_types.h include/linux/cpuhotplug.h include/linux/cred.h include/linux/fb.h include/linux/power_supply.h include/linux/sched.h include/linux/zstd.h include/trace/events/sched.h include/uapi/linux/android/binder.h init/Kconfig init/main.c kernel/bpf/hashtab.c kernel/cpu.c kernel/cred.c kernel/fork.c kernel/locking/spinlock_debug.c kernel/panic.c kernel/printk/printk.c kernel/sched/Makefile kernel/sched/core.c kernel/sched/fair.c kernel/sched/rt.c kernel/sched/walt.c kernel/sched/walt.h kernel/trace/trace.c lib/bug.c lib/list_debug.c lib/vsprintf.c lib/zstd/bitstream.h lib/zstd/compress.c lib/zstd/decompress.c lib/zstd/fse.h lib/zstd/fse_compress.c lib/zstd/fse_decompress.c lib/zstd/huf_compress.c lib/zstd/huf_decompress.c lib/zstd/zstd_internal.h mm/debug.c mm/filemap.c mm/rmap.c net/core/filter.c net/ipv4/sysctl_net_ipv4.c net/ipv4/sysfs_net_ipv4.c net/ipv4/tcp_input.c net/ipv4/tcp_output.c net/ipv4/udp.c net/ipv6/netfilter/nf_conntrack_reasm.c net/netfilter/Kconfig net/netfilter/Makefile net/netfilter/xt_qtaguid.c net/netfilter/xt_qtaguid_internal.h net/xfrm/xfrm_policy.c net/xfrm/xfrm_state.c scripts/checkpatch.pl security/selinux/hooks.c sound/core/compress_offload.c
This commit is contained in:
commit
af1d3ae977
4823 changed files with 128774 additions and 44493 deletions
|
@ -193,12 +193,11 @@ cc-if-fullversion = $(gcc-if-fullversion)
|
|||
# cc-ldoption
|
||||
# Usage: ldflags += $(call cc-ldoption, -Wl$(comma)--hash-style=both)
|
||||
cc-ldoption = $(call try-run,\
|
||||
$(CC) $(1) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
|
||||
$(CC) $(1) $(KBUILD_CPPFLAGS) $(CC_OPTION_CFLAGS) -nostdlib -x c /dev/null -o "$$TMP",$(1),$(2))
|
||||
|
||||
# ld-option
|
||||
# Usage: LDFLAGS += $(call ld-option, -X)
|
||||
ld-option = $(call try-run,\
|
||||
$(CC) -x c /dev/null -c -o "$$TMPO" ; $(LD) $(1) "$$TMPO" -o "$$TMP",$(1),$(2))
|
||||
ld-option = $(call try-run, $(LD) $(LDFLAGS) $(1) -v,$(1),$(2))
|
||||
|
||||
# ar-option
|
||||
# Usage: KBUILD_ARFLAGS := $(call ar-option,D)
|
||||
|
@ -451,3 +450,6 @@ endif
|
|||
endef
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
# delete partially updated (i.e. corrupted) files on error
|
||||
.DELETE_ON_ERROR:
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
# are not supported by all versions of the compiler
|
||||
# ==========================================================================
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, packed-not-aligned)
|
||||
|
||||
ifeq ("$(origin W)", "command line")
|
||||
export KBUILD_ENABLE_EXTRA_GCC_CHECKS := $(W)
|
||||
endif
|
||||
|
@ -25,6 +27,7 @@ warning-1 += -Wold-style-definition
|
|||
warning-1 += $(call cc-option, -Wmissing-include-dirs)
|
||||
warning-1 += $(call cc-option, -Wunused-but-set-variable)
|
||||
warning-1 += $(call cc-option, -Wunused-const-variable)
|
||||
warning-1 += $(call cc-option, -Wpacked-not-aligned)
|
||||
warning-1 += $(call cc-disable-warning, missing-field-initializers)
|
||||
warning-1 += $(call cc-disable-warning, sign-compare)
|
||||
|
||||
|
|
|
@ -39,4 +39,7 @@ else
|
|||
endif
|
||||
|
||||
endif
|
||||
|
||||
CFLAGS_KASAN_NOSANITIZE := -fno-builtin
|
||||
|
||||
endif
|
||||
|
|
|
@ -127,7 +127,7 @@ endif
|
|||
ifeq ($(CONFIG_KASAN),y)
|
||||
_c_flags += $(if $(patsubst n%,, \
|
||||
$(KASAN_SANITIZE_$(basetarget).o)$(KASAN_SANITIZE)y), \
|
||||
$(CFLAGS_KASAN))
|
||||
$(CFLAGS_KASAN), $(CFLAGS_KASAN_NOSANITIZE))
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_UBSAN),y)
|
||||
|
|
|
@ -74,7 +74,7 @@ modpost = scripts/mod/modpost \
|
|||
$(if $(CONFIG_MODULE_SRCVERSION_ALL),-a,) \
|
||||
$(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \
|
||||
$(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \
|
||||
$(if $(KBUILD_EXTRA_SYMBOLS), $(patsubst %, -e %,$(KBUILD_EXTRA_SYMBOLS))) \
|
||||
$(if $(KBUILD_EXTMOD),$(addprefix -e ,$(KBUILD_EXTRA_SYMBOLS))) \
|
||||
$(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
|
||||
$(if $(CONFIG_DEBUG_SECTION_MISMATCH),,-S) \
|
||||
$(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E) \
|
||||
|
|
|
@ -5737,7 +5737,7 @@ sub process {
|
|||
for (my $count = $linenr; $count <= $lc; $count++) {
|
||||
my $fmt = get_quoted_string($lines[$count - 1], raw_line($count, 0));
|
||||
$fmt =~ s/%%//g;
|
||||
if ($fmt =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGNO]).)/) {
|
||||
if ($fmt =~ /(\%[\*\d\.]*p(?![\WFfSsBKRraEhMmIiUDdgVCbGNOx]).)/) {
|
||||
$bad_extension = $1;
|
||||
last;
|
||||
}
|
||||
|
|
|
@ -45,9 +45,9 @@ my (@stack, $re, $dre, $x, $xs, $funcre);
|
|||
$x = "[0-9a-f]"; # hex character
|
||||
$xs = "[0-9a-f ]"; # hex character or space
|
||||
$funcre = qr/^$x* <(.*)>:$/;
|
||||
if ($arch eq 'aarch64') {
|
||||
#ffffffc0006325cc: a9bb7bfd stp x29, x30, [sp,#-80]!
|
||||
$re = qr/^.*stp.*sp,\#-([0-9]{1,8})\]\!/o;
|
||||
if ($arch =~ '^(aarch|arm)64$') {
|
||||
#ffffffc0006325cc: a9bb7bfd stp x29, x30, [sp, #-80]!
|
||||
$re = qr/^.*stp.*sp, \#-([0-9]{1,8})\]\!/o;
|
||||
} elsif ($arch eq 'arm') {
|
||||
#c0008ffc: e24dd064 sub sp, sp, #100 ; 0x64
|
||||
$re = qr/.*sub.*sp, sp, #(([0-9]{2}|[3-9])[0-9]{2})/o;
|
||||
|
|
4
scripts/clang-android.sh
Executable file
4
scripts/clang-android.sh
Executable file
|
@ -0,0 +1,4 @@
|
|||
#!/bin/sh
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
$* -dM -E - </dev/null 2>&1 | grep -q __ANDROID__ && echo "y"
|
363
scripts/coccinelle/api/stream_open.cocci
Normal file
363
scripts/coccinelle/api/stream_open.cocci
Normal file
|
@ -0,0 +1,363 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
// Author: Kirill Smelkov (kirr@nexedi.com)
|
||||
//
|
||||
// Search for stream-like files that are using nonseekable_open and convert
|
||||
// them to stream_open. A stream-like file is a file that does not use ppos in
|
||||
// its read and write. Rationale for the conversion is to avoid deadlock in
|
||||
// between read and write.
|
||||
|
||||
virtual report
|
||||
virtual patch
|
||||
virtual explain // explain decisions in the patch (SPFLAGS="-D explain")
|
||||
|
||||
// stream-like reader & writer - ones that do not depend on f_pos.
|
||||
@ stream_reader @
|
||||
identifier readstream, ppos;
|
||||
identifier f, buf, len;
|
||||
type loff_t;
|
||||
@@
|
||||
ssize_t readstream(struct file *f, char *buf, size_t len, loff_t *ppos)
|
||||
{
|
||||
... when != ppos
|
||||
}
|
||||
|
||||
@ stream_writer @
|
||||
identifier writestream, ppos;
|
||||
identifier f, buf, len;
|
||||
type loff_t;
|
||||
@@
|
||||
ssize_t writestream(struct file *f, const char *buf, size_t len, loff_t *ppos)
|
||||
{
|
||||
... when != ppos
|
||||
}
|
||||
|
||||
|
||||
// a function that blocks
|
||||
@ blocks @
|
||||
identifier block_f;
|
||||
identifier wait_event =~ "^wait_event_.*";
|
||||
@@
|
||||
block_f(...) {
|
||||
... when exists
|
||||
wait_event(...)
|
||||
... when exists
|
||||
}
|
||||
|
||||
// stream_reader that can block inside.
|
||||
//
|
||||
// XXX wait_* can be called not directly from current function (e.g. func -> f -> g -> wait())
|
||||
// XXX currently reader_blocks supports only direct and 1-level indirect cases.
|
||||
@ reader_blocks_direct @
|
||||
identifier stream_reader.readstream;
|
||||
identifier wait_event =~ "^wait_event_.*";
|
||||
@@
|
||||
readstream(...)
|
||||
{
|
||||
... when exists
|
||||
wait_event(...)
|
||||
... when exists
|
||||
}
|
||||
|
||||
@ reader_blocks_1 @
|
||||
identifier stream_reader.readstream;
|
||||
identifier blocks.block_f;
|
||||
@@
|
||||
readstream(...)
|
||||
{
|
||||
... when exists
|
||||
block_f(...)
|
||||
... when exists
|
||||
}
|
||||
|
||||
@ reader_blocks depends on reader_blocks_direct || reader_blocks_1 @
|
||||
identifier stream_reader.readstream;
|
||||
@@
|
||||
readstream(...) {
|
||||
...
|
||||
}
|
||||
|
||||
|
||||
// file_operations + whether they have _any_ .read, .write, .llseek ... at all.
|
||||
//
|
||||
// XXX add support for file_operations xxx[N] = ... (sound/core/pcm_native.c)
|
||||
@ fops0 @
|
||||
identifier fops;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
...
|
||||
};
|
||||
|
||||
@ has_read @
|
||||
identifier fops0.fops;
|
||||
identifier read_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.read = read_f,
|
||||
};
|
||||
|
||||
@ has_read_iter @
|
||||
identifier fops0.fops;
|
||||
identifier read_iter_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.read_iter = read_iter_f,
|
||||
};
|
||||
|
||||
@ has_write @
|
||||
identifier fops0.fops;
|
||||
identifier write_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.write = write_f,
|
||||
};
|
||||
|
||||
@ has_write_iter @
|
||||
identifier fops0.fops;
|
||||
identifier write_iter_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.write_iter = write_iter_f,
|
||||
};
|
||||
|
||||
@ has_llseek @
|
||||
identifier fops0.fops;
|
||||
identifier llseek_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.llseek = llseek_f,
|
||||
};
|
||||
|
||||
@ has_no_llseek @
|
||||
identifier fops0.fops;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.llseek = no_llseek,
|
||||
};
|
||||
|
||||
@ has_mmap @
|
||||
identifier fops0.fops;
|
||||
identifier mmap_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.mmap = mmap_f,
|
||||
};
|
||||
|
||||
@ has_copy_file_range @
|
||||
identifier fops0.fops;
|
||||
identifier copy_file_range_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.copy_file_range = copy_file_range_f,
|
||||
};
|
||||
|
||||
@ has_remap_file_range @
|
||||
identifier fops0.fops;
|
||||
identifier remap_file_range_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.remap_file_range = remap_file_range_f,
|
||||
};
|
||||
|
||||
@ has_splice_read @
|
||||
identifier fops0.fops;
|
||||
identifier splice_read_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.splice_read = splice_read_f,
|
||||
};
|
||||
|
||||
@ has_splice_write @
|
||||
identifier fops0.fops;
|
||||
identifier splice_write_f;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.splice_write = splice_write_f,
|
||||
};
|
||||
|
||||
|
||||
// file_operations that is candidate for stream_open conversion - it does not
|
||||
// use mmap and other methods that assume @offset access to file.
|
||||
//
|
||||
// XXX for simplicity require no .{read/write}_iter and no .splice_{read/write} for now.
|
||||
// XXX maybe_steam.fops cannot be used in other rules - it gives "bad rule maybe_stream or bad variable fops".
|
||||
@ maybe_stream depends on (!has_llseek || has_no_llseek) && !has_mmap && !has_copy_file_range && !has_remap_file_range && !has_read_iter && !has_write_iter && !has_splice_read && !has_splice_write @
|
||||
identifier fops0.fops;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
};
|
||||
|
||||
|
||||
// ---- conversions ----
|
||||
|
||||
// XXX .open = nonseekable_open -> .open = stream_open
|
||||
// XXX .open = func -> openfunc -> nonseekable_open
|
||||
|
||||
// read & write
|
||||
//
|
||||
// if both are used in the same file_operations together with an opener -
|
||||
// under that conditions we can use stream_open instead of nonseekable_open.
|
||||
@ fops_rw depends on maybe_stream @
|
||||
identifier fops0.fops, openfunc;
|
||||
identifier stream_reader.readstream;
|
||||
identifier stream_writer.writestream;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.open = openfunc,
|
||||
.read = readstream,
|
||||
.write = writestream,
|
||||
};
|
||||
|
||||
@ report_rw depends on report @
|
||||
identifier fops_rw.openfunc;
|
||||
position p1;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
nonseekable_open@p1
|
||||
...>
|
||||
}
|
||||
|
||||
@ script:python depends on report && reader_blocks @
|
||||
fops << fops0.fops;
|
||||
p << report_rw.p1;
|
||||
@@
|
||||
coccilib.report.print_report(p[0],
|
||||
"ERROR: %s: .read() can deadlock .write(); change nonseekable_open -> stream_open to fix." % (fops,))
|
||||
|
||||
@ script:python depends on report && !reader_blocks @
|
||||
fops << fops0.fops;
|
||||
p << report_rw.p1;
|
||||
@@
|
||||
coccilib.report.print_report(p[0],
|
||||
"WARNING: %s: .read() and .write() have stream semantic; safe to change nonseekable_open -> stream_open." % (fops,))
|
||||
|
||||
|
||||
@ explain_rw_deadlocked depends on explain && reader_blocks @
|
||||
identifier fops_rw.openfunc;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
- nonseekable_open
|
||||
+ nonseekable_open /* read & write (was deadlock) */
|
||||
...>
|
||||
}
|
||||
|
||||
|
||||
@ explain_rw_nodeadlock depends on explain && !reader_blocks @
|
||||
identifier fops_rw.openfunc;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
- nonseekable_open
|
||||
+ nonseekable_open /* read & write (no direct deadlock) */
|
||||
...>
|
||||
}
|
||||
|
||||
@ patch_rw depends on patch @
|
||||
identifier fops_rw.openfunc;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
- nonseekable_open
|
||||
+ stream_open
|
||||
...>
|
||||
}
|
||||
|
||||
|
||||
// read, but not write
|
||||
@ fops_r depends on maybe_stream && !has_write @
|
||||
identifier fops0.fops, openfunc;
|
||||
identifier stream_reader.readstream;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.open = openfunc,
|
||||
.read = readstream,
|
||||
};
|
||||
|
||||
@ report_r depends on report @
|
||||
identifier fops_r.openfunc;
|
||||
position p1;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
nonseekable_open@p1
|
||||
...>
|
||||
}
|
||||
|
||||
@ script:python depends on report @
|
||||
fops << fops0.fops;
|
||||
p << report_r.p1;
|
||||
@@
|
||||
coccilib.report.print_report(p[0],
|
||||
"WARNING: %s: .read() has stream semantic; safe to change nonseekable_open -> stream_open." % (fops,))
|
||||
|
||||
@ explain_r depends on explain @
|
||||
identifier fops_r.openfunc;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
- nonseekable_open
|
||||
+ nonseekable_open /* read only */
|
||||
...>
|
||||
}
|
||||
|
||||
@ patch_r depends on patch @
|
||||
identifier fops_r.openfunc;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
- nonseekable_open
|
||||
+ stream_open
|
||||
...>
|
||||
}
|
||||
|
||||
|
||||
// write, but not read
|
||||
@ fops_w depends on maybe_stream && !has_read @
|
||||
identifier fops0.fops, openfunc;
|
||||
identifier stream_writer.writestream;
|
||||
@@
|
||||
struct file_operations fops = {
|
||||
.open = openfunc,
|
||||
.write = writestream,
|
||||
};
|
||||
|
||||
@ report_w depends on report @
|
||||
identifier fops_w.openfunc;
|
||||
position p1;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
nonseekable_open@p1
|
||||
...>
|
||||
}
|
||||
|
||||
@ script:python depends on report @
|
||||
fops << fops0.fops;
|
||||
p << report_w.p1;
|
||||
@@
|
||||
coccilib.report.print_report(p[0],
|
||||
"WARNING: %s: .write() has stream semantic; safe to change nonseekable_open -> stream_open." % (fops,))
|
||||
|
||||
@ explain_w depends on explain @
|
||||
identifier fops_w.openfunc;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
- nonseekable_open
|
||||
+ nonseekable_open /* write only */
|
||||
...>
|
||||
}
|
||||
|
||||
@ patch_w depends on patch @
|
||||
identifier fops_w.openfunc;
|
||||
@@
|
||||
openfunc(...) {
|
||||
<...
|
||||
- nonseekable_open
|
||||
+ stream_open
|
||||
...>
|
||||
}
|
||||
|
||||
|
||||
// no read, no write - don't change anything
|
|
@ -65,7 +65,7 @@ parse_symbol() {
|
|||
if [[ "${cache[$module,$address]+isset}" == "isset" ]]; then
|
||||
local code=${cache[$module,$address]}
|
||||
else
|
||||
local code=$(addr2line -i -e "$objfile" "$address")
|
||||
local code=$(${CROSS_COMPILE}addr2line -i -e "$objfile" "$address")
|
||||
cache[$module,$address]=$code
|
||||
fi
|
||||
|
||||
|
@ -77,7 +77,7 @@ parse_symbol() {
|
|||
fi
|
||||
|
||||
# Strip out the base of the path
|
||||
code=${code//$basepath/""}
|
||||
code=${code#$basepath/}
|
||||
|
||||
# In the case of inlines, move everything to same line
|
||||
code=${code//$'\n'/' '}
|
||||
|
|
|
@ -10,7 +10,13 @@ DEPMOD=$1
|
|||
KERNELRELEASE=$2
|
||||
SYMBOL_PREFIX=$3
|
||||
|
||||
if ! test -r System.map -a -x "$DEPMOD"; then
|
||||
if ! test -r System.map ; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ -z $(command -v $DEPMOD) ]; then
|
||||
echo "Warning: 'make modules_install' requires $DEPMOD. Please install it." >&2
|
||||
echo "This is probably in the kmod package." >&2
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
|
|
@ -135,8 +135,12 @@ extern void print_gimple_expr(FILE *, gimple, int, int);
|
|||
extern void dump_gimple_stmt(pretty_printer *, gimple, int, int);
|
||||
#endif
|
||||
|
||||
#ifndef __unused
|
||||
#define __unused __attribute__((__unused__))
|
||||
#endif
|
||||
#ifndef __visible
|
||||
#define __visible __attribute__((visibility("default")))
|
||||
#endif
|
||||
|
||||
#define DECL_NAME_POINTER(node) IDENTIFIER_POINTER(DECL_NAME(node))
|
||||
#define DECL_NAME_LENGTH(node) IDENTIFIER_LENGTH(DECL_NAME(node))
|
||||
|
|
|
@ -99,7 +99,8 @@ lx-symbols command."""
|
|||
attrs[n]['name'].string(): attrs[n]['address']
|
||||
for n in range(int(sect_attrs['nsections']))}
|
||||
args = []
|
||||
for section_name in [".data", ".data..read_mostly", ".rodata", ".bss"]:
|
||||
for section_name in [".data", ".data..read_mostly", ".rodata", ".bss",
|
||||
".text", ".text.hot", ".text.unlikely"]:
|
||||
address = section_name_to_address.get(section_name)
|
||||
if address:
|
||||
args.append(" -s {name} {addr}".format(
|
||||
|
|
|
@ -161,6 +161,9 @@ static int read_symbol(FILE *in, struct sym_entry *s)
|
|||
/* exclude debugging symbols */
|
||||
else if (stype == 'N')
|
||||
return -1;
|
||||
/* exclude s390 kasan local symbols */
|
||||
else if (!strncmp(sym, ".LASANPC", 8))
|
||||
return -1;
|
||||
|
||||
/* include the type field in the symbol name, so that it gets
|
||||
* compressed together */
|
||||
|
@ -495,6 +498,8 @@ static void build_initial_tok_table(void)
|
|||
table[pos] = table[i];
|
||||
learn_symbol(table[pos].sym, table[pos].len);
|
||||
pos++;
|
||||
} else {
|
||||
free(table[i].sym);
|
||||
}
|
||||
}
|
||||
table_cnt = pos;
|
||||
|
|
|
@ -201,6 +201,13 @@ static int expr_eq(struct expr *e1, struct expr *e2)
|
|||
{
|
||||
int res, old_count;
|
||||
|
||||
/*
|
||||
* A NULL expr is taken to be yes, but there's also a different way to
|
||||
* represent yes. expr_is_yes() checks for either representation.
|
||||
*/
|
||||
if (!e1 || !e2)
|
||||
return expr_is_yes(e1) && expr_is_yes(e2);
|
||||
|
||||
if (e1->type != e2->type)
|
||||
return 0;
|
||||
switch (e1->type) {
|
||||
|
|
|
@ -126,7 +126,8 @@ do_resize:
|
|||
case KEY_DOWN:
|
||||
break;
|
||||
case KEY_BACKSPACE:
|
||||
case 127:
|
||||
case 8: /* ^H */
|
||||
case 127: /* ^? */
|
||||
if (pos) {
|
||||
wattrset(dialog, dlg.inputbox.atr);
|
||||
if (input_x == 0) {
|
||||
|
|
|
@ -1046,7 +1046,7 @@ static int do_match(int key, struct match_state *state, int *ans)
|
|||
state->match_direction = FIND_NEXT_MATCH_UP;
|
||||
*ans = get_mext_match(state->pattern,
|
||||
state->match_direction);
|
||||
} else if (key == KEY_BACKSPACE || key == 127) {
|
||||
} else if (key == KEY_BACKSPACE || key == 8 || key == 127) {
|
||||
state->pattern[strlen(state->pattern)-1] = '\0';
|
||||
adj_match_dir(&state->match_direction);
|
||||
} else
|
||||
|
|
|
@ -439,7 +439,8 @@ int dialog_inputbox(WINDOW *main_window,
|
|||
case KEY_F(F_EXIT):
|
||||
case KEY_F(F_BACK):
|
||||
break;
|
||||
case 127:
|
||||
case 8: /* ^H */
|
||||
case 127: /* ^? */
|
||||
case KEY_BACKSPACE:
|
||||
if (cursor_position > 0) {
|
||||
memmove(&result[cursor_position-1],
|
||||
|
|
|
@ -71,7 +71,7 @@ static void warn_ignored_character(char chr)
|
|||
{
|
||||
fprintf(stderr,
|
||||
"%s:%d:warning: ignoring unsupported character '%c'\n",
|
||||
zconf_curname(), zconf_lineno(), chr);
|
||||
current_file->name, yylineno, chr);
|
||||
}
|
||||
%}
|
||||
|
||||
|
@ -191,6 +191,8 @@ n [A-Za-z0-9_-]
|
|||
}
|
||||
<<EOF>> {
|
||||
BEGIN(INITIAL);
|
||||
yylval.string = text;
|
||||
return T_WORD_QUOTE;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,49 +47,9 @@ typedef struct {
|
|||
struct devtable {
|
||||
const char *device_id; /* name of table, __mod_<name>__*_device_table. */
|
||||
unsigned long id_size;
|
||||
void *function;
|
||||
int (*do_entry)(const char *filename, void *symval, char *alias);
|
||||
};
|
||||
|
||||
#define ___cat(a,b) a ## b
|
||||
#define __cat(a,b) ___cat(a,b)
|
||||
|
||||
/* we need some special handling for this host tool running eventually on
|
||||
* Darwin. The Mach-O section handling is a bit different than ELF section
|
||||
* handling. The differnces in detail are:
|
||||
* a) we have segments which have sections
|
||||
* b) we need a API call to get the respective section symbols */
|
||||
#if defined(__MACH__)
|
||||
#include <mach-o/getsect.h>
|
||||
|
||||
#define INIT_SECTION(name) do { \
|
||||
unsigned long name ## _len; \
|
||||
char *__cat(pstart_,name) = getsectdata("__TEXT", \
|
||||
#name, &__cat(name,_len)); \
|
||||
char *__cat(pstop_,name) = __cat(pstart_,name) + \
|
||||
__cat(name, _len); \
|
||||
__cat(__start_,name) = (void *)__cat(pstart_,name); \
|
||||
__cat(__stop_,name) = (void *)__cat(pstop_,name); \
|
||||
} while (0)
|
||||
#define SECTION(name) __attribute__((section("__TEXT, " #name)))
|
||||
|
||||
struct devtable **__start___devtable, **__stop___devtable;
|
||||
#else
|
||||
#define INIT_SECTION(name) /* no-op for ELF */
|
||||
#define SECTION(name) __attribute__((section(#name)))
|
||||
|
||||
/* We construct a table of pointers in an ELF section (pointers generally
|
||||
* go unpadded by gcc). ld creates boundary syms for us. */
|
||||
extern struct devtable *__start___devtable[], *__stop___devtable[];
|
||||
#endif /* __MACH__ */
|
||||
|
||||
#if !defined(__used)
|
||||
# if __GNUC__ == 3 && __GNUC_MINOR__ < 3
|
||||
# define __used __attribute__((__unused__))
|
||||
# else
|
||||
# define __used __attribute__((__used__))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* Define a variable f that holds the value of field f of struct devid
|
||||
* based at address m.
|
||||
*/
|
||||
|
@ -102,16 +62,6 @@ extern struct devtable *__start___devtable[], *__stop___devtable[];
|
|||
#define DEF_FIELD_ADDR(m, devid, f) \
|
||||
typeof(((struct devid *)0)->f) *f = ((m) + OFF_##devid##_##f)
|
||||
|
||||
/* Add a table entry. We test function type matches while we're here. */
|
||||
#define ADD_TO_DEVTABLE(device_id, type, function) \
|
||||
static struct devtable __cat(devtable,__LINE__) = { \
|
||||
device_id + 0*sizeof((function)((const char *)NULL, \
|
||||
(void *)NULL, \
|
||||
(char *)NULL)), \
|
||||
SIZE_##type, (function) }; \
|
||||
static struct devtable *SECTION(__devtable) __used \
|
||||
__cat(devtable_ptr,__LINE__) = &__cat(devtable,__LINE__)
|
||||
|
||||
#define ADD(str, sep, cond, field) \
|
||||
do { \
|
||||
strcat(str, sep); \
|
||||
|
@ -431,7 +381,6 @@ static int do_hid_entry(const char *filename,
|
|||
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("hid", hid_device_id, do_hid_entry);
|
||||
|
||||
/* Looks like: ieee1394:venNmoNspNverN */
|
||||
static int do_ieee1394_entry(const char *filename,
|
||||
|
@ -456,7 +405,6 @@ static int do_ieee1394_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("ieee1394", ieee1394_device_id, do_ieee1394_entry);
|
||||
|
||||
/* Looks like: pci:vNdNsvNsdNbcNscNiN. */
|
||||
static int do_pci_entry(const char *filename,
|
||||
|
@ -500,7 +448,6 @@ static int do_pci_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("pci", pci_device_id, do_pci_entry);
|
||||
|
||||
/* looks like: "ccw:tNmNdtNdmN" */
|
||||
static int do_ccw_entry(const char *filename,
|
||||
|
@ -524,7 +471,6 @@ static int do_ccw_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("ccw", ccw_device_id, do_ccw_entry);
|
||||
|
||||
/* looks like: "ap:tN" */
|
||||
static int do_ap_entry(const char *filename,
|
||||
|
@ -535,7 +481,6 @@ static int do_ap_entry(const char *filename,
|
|||
sprintf(alias, "ap:t%02X*", dev_type);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("ap", ap_device_id, do_ap_entry);
|
||||
|
||||
/* looks like: "css:tN" */
|
||||
static int do_css_entry(const char *filename,
|
||||
|
@ -546,7 +491,6 @@ static int do_css_entry(const char *filename,
|
|||
sprintf(alias, "css:t%01X", type);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("css", css_device_id, do_css_entry);
|
||||
|
||||
/* Looks like: "serio:tyNprNidNexN" */
|
||||
static int do_serio_entry(const char *filename,
|
||||
|
@ -566,7 +510,6 @@ static int do_serio_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("serio", serio_device_id, do_serio_entry);
|
||||
|
||||
/* looks like: "acpi:ACPI0003" or "acpi:PNP0C0B" or "acpi:LNXVIDEO" or
|
||||
* "acpi:bbsspp" (bb=base-class, ss=sub-class, pp=prog-if)
|
||||
|
@ -604,7 +547,6 @@ static int do_acpi_entry(const char *filename,
|
|||
}
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("acpi", acpi_device_id, do_acpi_entry);
|
||||
|
||||
/* looks like: "pnp:dD" */
|
||||
static void do_pnp_device_entry(void *symval, unsigned long size,
|
||||
|
@ -725,7 +667,6 @@ static int do_pcmcia_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("pcmcia", pcmcia_device_id, do_pcmcia_entry);
|
||||
|
||||
static int do_vio_entry(const char *filename, void *symval,
|
||||
char *alias)
|
||||
|
@ -745,7 +686,6 @@ static int do_vio_entry(const char *filename, void *symval,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("vio", vio_device_id, do_vio_entry);
|
||||
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
|
||||
|
@ -818,7 +758,6 @@ static int do_input_entry(const char *filename, void *symval,
|
|||
do_input(alias, *swbit, 0, INPUT_DEVICE_ID_SW_MAX);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("input", input_device_id, do_input_entry);
|
||||
|
||||
static int do_eisa_entry(const char *filename, void *symval,
|
||||
char *alias)
|
||||
|
@ -830,7 +769,6 @@ static int do_eisa_entry(const char *filename, void *symval,
|
|||
strcat(alias, "*");
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("eisa", eisa_device_id, do_eisa_entry);
|
||||
|
||||
/* Looks like: parisc:tNhvNrevNsvN */
|
||||
static int do_parisc_entry(const char *filename, void *symval,
|
||||
|
@ -850,7 +788,6 @@ static int do_parisc_entry(const char *filename, void *symval,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("parisc", parisc_device_id, do_parisc_entry);
|
||||
|
||||
/* Looks like: sdio:cNvNdN. */
|
||||
static int do_sdio_entry(const char *filename,
|
||||
|
@ -867,7 +804,6 @@ static int do_sdio_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("sdio", sdio_device_id, do_sdio_entry);
|
||||
|
||||
/* Looks like: ssb:vNidNrevN. */
|
||||
static int do_ssb_entry(const char *filename,
|
||||
|
@ -884,7 +820,6 @@ static int do_ssb_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("ssb", ssb_device_id, do_ssb_entry);
|
||||
|
||||
/* Looks like: bcma:mNidNrevNclN. */
|
||||
static int do_bcma_entry(const char *filename,
|
||||
|
@ -903,7 +838,6 @@ static int do_bcma_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("bcma", bcma_device_id, do_bcma_entry);
|
||||
|
||||
/* Looks like: virtio:dNvN */
|
||||
static int do_virtio_entry(const char *filename, void *symval,
|
||||
|
@ -919,7 +853,6 @@ static int do_virtio_entry(const char *filename, void *symval,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("virtio", virtio_device_id, do_virtio_entry);
|
||||
|
||||
/*
|
||||
* Looks like: vmbus:guid
|
||||
|
@ -942,7 +875,6 @@ static int do_vmbus_entry(const char *filename, void *symval,
|
|||
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("vmbus", hv_vmbus_device_id, do_vmbus_entry);
|
||||
|
||||
/* Looks like: i2c:S */
|
||||
static int do_i2c_entry(const char *filename, void *symval,
|
||||
|
@ -953,7 +885,6 @@ static int do_i2c_entry(const char *filename, void *symval,
|
|||
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("i2c", i2c_device_id, do_i2c_entry);
|
||||
|
||||
/* Looks like: spi:S */
|
||||
static int do_spi_entry(const char *filename, void *symval,
|
||||
|
@ -964,7 +895,6 @@ static int do_spi_entry(const char *filename, void *symval,
|
|||
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("spi", spi_device_id, do_spi_entry);
|
||||
|
||||
static const struct dmifield {
|
||||
const char *prefix;
|
||||
|
@ -1019,7 +949,6 @@ static int do_dmi_entry(const char *filename, void *symval,
|
|||
strcat(alias, ":");
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("dmi", dmi_system_id, do_dmi_entry);
|
||||
|
||||
static int do_platform_entry(const char *filename,
|
||||
void *symval, char *alias)
|
||||
|
@ -1028,7 +957,6 @@ static int do_platform_entry(const char *filename,
|
|||
sprintf(alias, PLATFORM_MODULE_PREFIX "%s", *name);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("platform", platform_device_id, do_platform_entry);
|
||||
|
||||
static int do_mdio_entry(const char *filename,
|
||||
void *symval, char *alias)
|
||||
|
@ -1053,7 +981,6 @@ static int do_mdio_entry(const char *filename,
|
|||
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("mdio", mdio_device_id, do_mdio_entry);
|
||||
|
||||
/* Looks like: zorro:iN. */
|
||||
static int do_zorro_entry(const char *filename, void *symval,
|
||||
|
@ -1064,7 +991,6 @@ static int do_zorro_entry(const char *filename, void *symval,
|
|||
ADD(alias, "i", id != ZORRO_WILDCARD, id);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("zorro", zorro_device_id, do_zorro_entry);
|
||||
|
||||
/* looks like: "pnp:dD" */
|
||||
static int do_isapnp_entry(const char *filename,
|
||||
|
@ -1080,7 +1006,6 @@ static int do_isapnp_entry(const char *filename,
|
|||
(function >> 12) & 0x0f, (function >> 8) & 0x0f);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("isapnp", isapnp_device_id, do_isapnp_entry);
|
||||
|
||||
/* Looks like: "ipack:fNvNdN". */
|
||||
static int do_ipack_entry(const char *filename,
|
||||
|
@ -1096,7 +1021,6 @@ static int do_ipack_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("ipack", ipack_device_id, do_ipack_entry);
|
||||
|
||||
/*
|
||||
* Append a match expression for a single masked hex digit.
|
||||
|
@ -1167,7 +1091,6 @@ static int do_amba_entry(const char *filename,
|
|||
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("amba", amba_id, do_amba_entry);
|
||||
|
||||
/*
|
||||
* looks like: "mipscdmm:tN"
|
||||
|
@ -1183,7 +1106,6 @@ static int do_mips_cdmm_entry(const char *filename,
|
|||
sprintf(alias, "mipscdmm:t%02X*", type);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("mipscdmm", mips_cdmm_device_id, do_mips_cdmm_entry);
|
||||
|
||||
/* LOOKS like cpu:type:x86,venVVVVfamFFFFmodMMMM:feature:*,FEAT,*
|
||||
* All fields are numbers. It would be nicer to use strings for vendor
|
||||
|
@ -1208,7 +1130,6 @@ static int do_x86cpu_entry(const char *filename, void *symval,
|
|||
sprintf(alias + strlen(alias), "%04X*", feature);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("x86cpu", x86_cpu_id, do_x86cpu_entry);
|
||||
|
||||
/* LOOKS like cpu:type:*:feature:*FEAT* */
|
||||
static int do_cpu_entry(const char *filename, void *symval, char *alias)
|
||||
|
@ -1218,7 +1139,6 @@ static int do_cpu_entry(const char *filename, void *symval, char *alias)
|
|||
sprintf(alias, "cpu:type:*:feature:*%04X*", feature);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("cpu", cpu_feature, do_cpu_entry);
|
||||
|
||||
/* Looks like: mei:S:uuid:N:* */
|
||||
static int do_mei_entry(const char *filename, void *symval,
|
||||
|
@ -1237,7 +1157,6 @@ static int do_mei_entry(const char *filename, void *symval,
|
|||
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("mei", mei_cl_device_id, do_mei_entry);
|
||||
|
||||
/* Looks like: rapidio:vNdNavNadN */
|
||||
static int do_rio_entry(const char *filename,
|
||||
|
@ -1257,7 +1176,6 @@ static int do_rio_entry(const char *filename,
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("rapidio", rio_device_id, do_rio_entry);
|
||||
|
||||
/* Looks like: ulpi:vNpN */
|
||||
static int do_ulpi_entry(const char *filename, void *symval,
|
||||
|
@ -1270,7 +1188,6 @@ static int do_ulpi_entry(const char *filename, void *symval,
|
|||
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("ulpi", ulpi_device_id, do_ulpi_entry);
|
||||
|
||||
/* Looks like: hdaudio:vNrNaN */
|
||||
static int do_hda_entry(const char *filename, void *symval, char *alias)
|
||||
|
@ -1287,7 +1204,6 @@ static int do_hda_entry(const char *filename, void *symval, char *alias)
|
|||
add_wildcard(alias);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("hdaudio", hda_device_id, do_hda_entry);
|
||||
|
||||
/* Looks like: fsl-mc:vNdN */
|
||||
static int do_fsl_mc_entry(const char *filename, void *symval,
|
||||
|
@ -1299,7 +1215,6 @@ static int do_fsl_mc_entry(const char *filename, void *symval,
|
|||
sprintf(alias, "fsl-mc:v%08Xd%s", vendor, *obj_type);
|
||||
return 1;
|
||||
}
|
||||
ADD_TO_DEVTABLE("fslmc", fsl_mc_device_id, do_fsl_mc_entry);
|
||||
|
||||
/* Does namelen bytes of name exactly match the symbol? */
|
||||
static bool sym_is(const char *name, unsigned namelen, const char *symbol)
|
||||
|
@ -1313,12 +1228,11 @@ static bool sym_is(const char *name, unsigned namelen, const char *symbol)
|
|||
static void do_table(void *symval, unsigned long size,
|
||||
unsigned long id_size,
|
||||
const char *device_id,
|
||||
void *function,
|
||||
int (*do_entry)(const char *filename, void *symval, char *alias),
|
||||
struct module *mod)
|
||||
{
|
||||
unsigned int i;
|
||||
char alias[500];
|
||||
int (*do_entry)(const char *, void *entry, char *alias) = function;
|
||||
|
||||
device_id_check(mod->name, device_id, size, id_size, symval);
|
||||
/* Leave last one: it's the terminator. */
|
||||
|
@ -1332,6 +1246,44 @@ static void do_table(void *symval, unsigned long size,
|
|||
}
|
||||
}
|
||||
|
||||
static const struct devtable devtable[] = {
|
||||
{"hid", SIZE_hid_device_id, do_hid_entry},
|
||||
{"ieee1394", SIZE_ieee1394_device_id, do_ieee1394_entry},
|
||||
{"pci", SIZE_pci_device_id, do_pci_entry},
|
||||
{"ccw", SIZE_ccw_device_id, do_ccw_entry},
|
||||
{"ap", SIZE_ap_device_id, do_ap_entry},
|
||||
{"css", SIZE_css_device_id, do_css_entry},
|
||||
{"serio", SIZE_serio_device_id, do_serio_entry},
|
||||
{"acpi", SIZE_acpi_device_id, do_acpi_entry},
|
||||
{"pcmcia", SIZE_pcmcia_device_id, do_pcmcia_entry},
|
||||
{"vio", SIZE_vio_device_id, do_vio_entry},
|
||||
{"input", SIZE_input_device_id, do_input_entry},
|
||||
{"eisa", SIZE_eisa_device_id, do_eisa_entry},
|
||||
{"parisc", SIZE_parisc_device_id, do_parisc_entry},
|
||||
{"sdio", SIZE_sdio_device_id, do_sdio_entry},
|
||||
{"ssb", SIZE_ssb_device_id, do_ssb_entry},
|
||||
{"bcma", SIZE_bcma_device_id, do_bcma_entry},
|
||||
{"virtio", SIZE_virtio_device_id, do_virtio_entry},
|
||||
{"vmbus", SIZE_hv_vmbus_device_id, do_vmbus_entry},
|
||||
{"i2c", SIZE_i2c_device_id, do_i2c_entry},
|
||||
{"spi", SIZE_spi_device_id, do_spi_entry},
|
||||
{"dmi", SIZE_dmi_system_id, do_dmi_entry},
|
||||
{"platform", SIZE_platform_device_id, do_platform_entry},
|
||||
{"mdio", SIZE_mdio_device_id, do_mdio_entry},
|
||||
{"zorro", SIZE_zorro_device_id, do_zorro_entry},
|
||||
{"isapnp", SIZE_isapnp_device_id, do_isapnp_entry},
|
||||
{"ipack", SIZE_ipack_device_id, do_ipack_entry},
|
||||
{"amba", SIZE_amba_id, do_amba_entry},
|
||||
{"mipscdmm", SIZE_mips_cdmm_device_id, do_mips_cdmm_entry},
|
||||
{"x86cpu", SIZE_x86_cpu_id, do_x86cpu_entry},
|
||||
{"cpu", SIZE_cpu_feature, do_cpu_entry},
|
||||
{"mei", SIZE_mei_cl_device_id, do_mei_entry},
|
||||
{"rapidio", SIZE_rio_device_id, do_rio_entry},
|
||||
{"ulpi", SIZE_ulpi_device_id, do_ulpi_entry},
|
||||
{"hdaudio", SIZE_hda_device_id, do_hda_entry},
|
||||
{"fslmc", SIZE_fsl_mc_device_id, do_fsl_mc_entry},
|
||||
};
|
||||
|
||||
/* Create MODULE_ALIAS() statements.
|
||||
* At this time, we cannot write the actual output C source yet,
|
||||
* so we write into the mod->dev_table_buf buffer. */
|
||||
|
@ -1386,13 +1338,14 @@ void handle_moddevtable(struct module *mod, struct elf_info *info,
|
|||
else if (sym_is(name, namelen, "pnp_card"))
|
||||
do_pnp_card_entries(symval, sym->st_size, mod);
|
||||
else {
|
||||
struct devtable **p;
|
||||
INIT_SECTION(__devtable);
|
||||
int i;
|
||||
|
||||
for (p = __start___devtable; p < __stop___devtable; p++) {
|
||||
if (sym_is(name, namelen, (*p)->device_id)) {
|
||||
do_table(symval, sym->st_size, (*p)->id_size,
|
||||
(*p)->device_id, (*p)->function, mod);
|
||||
for (i = 0; i < ARRAY_SIZE(devtable); i++) {
|
||||
const struct devtable *p = &devtable[i];
|
||||
|
||||
if (sym_is(name, namelen, p->device_id)) {
|
||||
do_table(symval, sym->st_size, p->id_size,
|
||||
p->device_id, p->do_entry, mod);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -649,7 +649,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
|
|||
if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER)
|
||||
break;
|
||||
if (symname[0] == '.') {
|
||||
char *munged = strdup(symname);
|
||||
char *munged = NOFAIL(strdup(symname));
|
||||
munged[0] = '_';
|
||||
munged[1] = toupper(munged[1]);
|
||||
symname = munged;
|
||||
|
@ -936,6 +936,7 @@ static const char *const head_sections[] = { ".head.text*", NULL };
|
|||
static const char *const linker_symbols[] =
|
||||
{ "__init_begin", "_sinittext", "_einittext", NULL };
|
||||
static const char *const optim_symbols[] = { "*.constprop.*", NULL };
|
||||
static const char *const cfi_symbols[] = { "*.cfi", NULL };
|
||||
|
||||
enum mismatch {
|
||||
TEXT_TO_ANY_INIT,
|
||||
|
@ -1157,6 +1158,25 @@ static const struct sectioncheck *section_mismatch(
|
|||
* fromsec = text section
|
||||
* refsymname = *.constprop.*
|
||||
*
|
||||
* Pattern 6:
|
||||
* Hide section mismatch warnings for ELF local symbols. The goal
|
||||
* is to eliminate false positive modpost warnings caused by
|
||||
* compiler-generated ELF local symbol names such as ".LANCHOR1".
|
||||
* Autogenerated symbol names bypass modpost's "Pattern 2"
|
||||
* whitelisting, which relies on pattern-matching against symbol
|
||||
* names to work. (One situation where gcc can autogenerate ELF
|
||||
* local symbols is when "-fsection-anchors" is used.)
|
||||
*
|
||||
* Pattern 7:
|
||||
* With CONFIG_CFI_CLANG, clang appends .cfi to all indirectly called
|
||||
* functions and creates a function stub with the original name. This
|
||||
* stub is always placed in .text, even if the actual function with the
|
||||
* .cfi postfix is in .init.text or .exit.text.
|
||||
* This pattern is identified by
|
||||
* tosec = init or exit section
|
||||
* fromsec = text section
|
||||
* tosym = *.cfi
|
||||
*
|
||||
**/
|
||||
static int secref_whitelist(const struct sectioncheck *mismatch,
|
||||
const char *fromsec, const char *fromsym,
|
||||
|
@ -1195,9 +1215,43 @@ static int secref_whitelist(const struct sectioncheck *mismatch,
|
|||
match(fromsym, optim_symbols))
|
||||
return 0;
|
||||
|
||||
/* Check for pattern 6 */
|
||||
if (strstarts(fromsym, ".L"))
|
||||
return 0;
|
||||
|
||||
/* Check for pattern 7 */
|
||||
if (match(fromsec, text_sections) &&
|
||||
match(tosec, init_exit_sections) &&
|
||||
match(tosym, cfi_symbols))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int is_arm_mapping_symbol(const char *str)
|
||||
{
|
||||
return str[0] == '$' && strchr("axtd", str[1])
|
||||
&& (str[2] == '\0' || str[2] == '.');
|
||||
}
|
||||
|
||||
/*
|
||||
* If there's no name there, ignore it; likewise, ignore it if it's
|
||||
* one of the magic symbols emitted used by current ARM tools.
|
||||
*
|
||||
* Otherwise if find_symbols_between() returns those symbols, they'll
|
||||
* fail the whitelist tests and cause lots of false alarms ... fixable
|
||||
* only by merging __exit and __init sections into __text, bloating
|
||||
* the kernel (which is especially evil on embedded platforms).
|
||||
*/
|
||||
static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
|
||||
{
|
||||
const char *name = elf->strtab + sym->st_name;
|
||||
|
||||
if (!name || !strlen(name))
|
||||
return 0;
|
||||
return !is_arm_mapping_symbol(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Find symbol based on relocation record info.
|
||||
* In some cases the symbol supplied is a valid symbol so
|
||||
|
@ -1223,6 +1277,8 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
|
|||
continue;
|
||||
if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
|
||||
continue;
|
||||
if (!is_valid_name(elf, sym))
|
||||
continue;
|
||||
if (sym->st_value == addr)
|
||||
return sym;
|
||||
/* Find a symbol nearby - addr are maybe negative */
|
||||
|
@ -1241,30 +1297,6 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf64_Sword addr,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
static inline int is_arm_mapping_symbol(const char *str)
|
||||
{
|
||||
return str[0] == '$' && strchr("axtd", str[1])
|
||||
&& (str[2] == '\0' || str[2] == '.');
|
||||
}
|
||||
|
||||
/*
|
||||
* If there's no name there, ignore it; likewise, ignore it if it's
|
||||
* one of the magic symbols emitted used by current ARM tools.
|
||||
*
|
||||
* Otherwise if find_symbols_between() returns those symbols, they'll
|
||||
* fail the whitelist tests and cause lots of false alarms ... fixable
|
||||
* only by merging __exit and __init sections into __text, bloating
|
||||
* the kernel (which is especially evil on embedded platforms).
|
||||
*/
|
||||
static inline int is_valid_name(struct elf_info *elf, Elf_Sym *sym)
|
||||
{
|
||||
const char *name = elf->strtab + sym->st_name;
|
||||
|
||||
if (!name || !strlen(name))
|
||||
return 0;
|
||||
return !is_arm_mapping_symbol(name);
|
||||
}
|
||||
|
||||
/*
|
||||
* Find symbols before or equal addr and after addr - in the section sec.
|
||||
* If we find two symbols with equal offset prefer one with a valid name.
|
||||
|
@ -1312,7 +1344,7 @@ static Elf_Sym *find_elf_symbol2(struct elf_info *elf, Elf_Addr addr,
|
|||
static char *sec2annotation(const char *s)
|
||||
{
|
||||
if (match(s, init_exit_sections)) {
|
||||
char *p = malloc(20);
|
||||
char *p = NOFAIL(malloc(20));
|
||||
char *r = p;
|
||||
|
||||
*p++ = '_';
|
||||
|
@ -1332,7 +1364,7 @@ static char *sec2annotation(const char *s)
|
|||
strcat(p, " ");
|
||||
return r;
|
||||
} else {
|
||||
return strdup("");
|
||||
return NOFAIL(strdup(""));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2033,7 +2065,7 @@ void buf_write(struct buffer *buf, const char *s, int len)
|
|||
{
|
||||
if (buf->size - buf->pos < len) {
|
||||
buf->size += len + SZ;
|
||||
buf->p = realloc(buf->p, buf->size);
|
||||
buf->p = NOFAIL(realloc(buf->p, buf->size));
|
||||
}
|
||||
strncpy(buf->p + buf->pos, s, len);
|
||||
buf->pos += len;
|
||||
|
|
|
@ -65,13 +65,14 @@
|
|||
require 5; # at least perl 5
|
||||
use strict;
|
||||
use File::Find;
|
||||
use File::Spec;
|
||||
|
||||
my $nm = ($ENV{'NM'} || "nm") . " -p";
|
||||
my $objdump = ($ENV{'OBJDUMP'} || "objdump") . " -s -j .comment";
|
||||
my $srctree = "";
|
||||
my $objtree = "";
|
||||
$srctree = "$ENV{'srctree'}/" if (exists($ENV{'srctree'}));
|
||||
$objtree = "$ENV{'objtree'}/" if (exists($ENV{'objtree'}));
|
||||
my $srctree = File::Spec->curdir();
|
||||
my $objtree = File::Spec->curdir();
|
||||
$srctree = File::Spec->rel2abs($ENV{'srctree'}) if (exists($ENV{'srctree'}));
|
||||
$objtree = File::Spec->rel2abs($ENV{'objtree'}) if (exists($ENV{'objtree'}));
|
||||
|
||||
if ($#ARGV != -1) {
|
||||
print STDERR "usage: $0 takes no parameters\n";
|
||||
|
@ -231,9 +232,9 @@ sub do_nm
|
|||
}
|
||||
($source = $basename) =~ s/\.o$//;
|
||||
if (-e "$source.c" || -e "$source.S") {
|
||||
$source = "$objtree$File::Find::dir/$source";
|
||||
$source = File::Spec->catfile($objtree, $File::Find::dir, $source)
|
||||
} else {
|
||||
$source = "$srctree$File::Find::dir/$source";
|
||||
$source = File::Spec->catfile($srctree, $File::Find::dir, $source)
|
||||
}
|
||||
if (! -e "$source.c" && ! -e "$source.S") {
|
||||
# No obvious source, exclude the object if it is conglomerate
|
||||
|
|
|
@ -53,6 +53,10 @@
|
|||
#define R_AARCH64_ABS64 257
|
||||
#endif
|
||||
|
||||
#define R_ARM_PC24 1
|
||||
#define R_ARM_THM_CALL 10
|
||||
#define R_ARM_CALL 28
|
||||
|
||||
static int fd_map; /* File descriptor for file being modified. */
|
||||
static int mmap_failed; /* Boolean flag. */
|
||||
static char gpfx; /* prefix for global symbol name (sometimes '_') */
|
||||
|
@ -375,6 +379,18 @@ is_mcounted_section_name(char const *const txtname)
|
|||
#define RECORD_MCOUNT_64
|
||||
#include "recordmcount.h"
|
||||
|
||||
static int arm_is_fake_mcount(Elf32_Rel const *rp)
|
||||
{
|
||||
switch (ELF32_R_TYPE(w(rp->r_info))) {
|
||||
case R_ARM_THM_CALL:
|
||||
case R_ARM_CALL:
|
||||
case R_ARM_PC24:
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* 64-bit EM_MIPS has weird ELF64_Rela.r_info.
|
||||
* http://techpubs.sgi.com/library/manuals/4000/007-4658-001/pdf/007-4658-001.pdf
|
||||
* We interpret Table 29 Relocation Operation (Elf64_Rel, Elf64_Rela) [p.40]
|
||||
|
@ -464,6 +480,7 @@ do_file(char const *const fname)
|
|||
break;
|
||||
case EM_ARM: reltype = R_ARM_ABS32;
|
||||
altmcount = "__gnu_mcount_nc";
|
||||
is_fake_mcount32 = arm_is_fake_mcount;
|
||||
break;
|
||||
case EM_AARCH64:
|
||||
reltype = R_AARCH64_ABS64;
|
||||
|
|
|
@ -326,7 +326,8 @@ static uint_t *sift_rel_mcount(uint_t *mlocp,
|
|||
if (!mcountsym)
|
||||
mcountsym = get_mcountsym(sym0, relp, str0);
|
||||
|
||||
if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) {
|
||||
if (mcountsym && mcountsym == Elf_r_sym(relp) &&
|
||||
!is_fake_mcount(relp)) {
|
||||
uint_t const addend =
|
||||
_w(_w(relp->r_offset) - recval + mcount_adjust);
|
||||
mrelp->r_offset = _w(offbase
|
||||
|
|
|
@ -72,8 +72,16 @@ scm_version()
|
|||
printf -- '-svn%s' "`git svn find-rev $head`"
|
||||
fi
|
||||
|
||||
# Check for uncommitted changes
|
||||
if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then
|
||||
# Check for uncommitted changes.
|
||||
# First, with git-status, but --no-optional-locks is only
|
||||
# supported in git >= 2.14, so fall back to git-diff-index if
|
||||
# it fails. Note that git-diff-index does not refresh the
|
||||
# index, so it may give misleading results. See
|
||||
# git-update-index(1), git-diff-index(1), and git-status(1).
|
||||
if {
|
||||
git --no-optional-locks status -uno --porcelain 2>/dev/null ||
|
||||
git diff-index --name-only HEAD
|
||||
} | grep -qvE '^(.. )?scripts/package'; then
|
||||
printf '%s' -dirty
|
||||
fi
|
||||
|
||||
|
|
|
@ -395,7 +395,7 @@ usage(void)
|
|||
* When we have processed a group that starts off with a known-false
|
||||
* #if/#elif sequence (which has therefore been deleted) followed by a
|
||||
* #elif that we don't understand and therefore must keep, we edit the
|
||||
* latter into a #if to keep the nesting correct. We use strncpy() to
|
||||
* latter into a #if to keep the nesting correct. We use memcpy() to
|
||||
* overwrite the 4 byte token "elif" with "if " without a '\0' byte.
|
||||
*
|
||||
* When we find a true #elif in a group, the following block will
|
||||
|
@ -450,7 +450,7 @@ static void Idrop (void) { Fdrop(); ignoreon(); }
|
|||
static void Itrue (void) { Ftrue(); ignoreon(); }
|
||||
static void Ifalse(void) { Ffalse(); ignoreon(); }
|
||||
/* modify this line */
|
||||
static void Mpass (void) { strncpy(keyword, "if ", 4); Pelif(); }
|
||||
static void Mpass (void) { memcpy(keyword, "if ", 4); Pelif(); }
|
||||
static void Mtrue (void) { keywordedit("else"); state(IS_TRUE_MIDDLE); }
|
||||
static void Melif (void) { keywordedit("endif"); state(IS_FALSE_TRAILER); }
|
||||
static void Melse (void) { keywordedit("endif"); state(IS_FALSE_ELSE); }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue