Merge git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild
* git://git.kernel.org/pub/scm/linux/kernel/git/sam/kbuild: (38 commits) kconfig: fix mconf segmentation fault kbuild: enable use of code from a different dir kconfig: error out if recursive dependencies are found kbuild: scripts/basic/fixdep segfault on pathological string-o-death kconfig: correct minor typo in Kconfig warning message. kconfig: fix path to modules.txt in Kconfig help usr/Kconfig: fix typo kernel-doc: alphabetically-sorted entries in index.html of 'htmldocs' kbuild: be more explicit on missing .config file kbuild: clarify the creation of the LOCALVERSION_AUTO string. kbuild: propagate errors from find in scripts/gen_initramfs_list.sh kconfig: refer to qt3 if we cannot find qt libraries kbuild: handle compressed cpio initramfs-es kbuild: ignore section mismatch warning for references from .paravirtprobe to .init.text kbuild: remove stale comment in modpost.c kbuild/mkuboot.sh: allow spaces in CROSS_COMPILE kbuild: fix make mrproper for Documentation/DocBook/man kbuild: remove kconfig binaries during make mrproper kconfig/menuconfig: do not hardcode '.config' kbuild: override build timestamp & version ...
This commit is contained in:
@ -131,13 +131,13 @@ $(multi-objs-y:.o=.lst) : modname = $(modname-multi)
|
||||
quiet_cmd_cc_s_c = CC $(quiet_modtag) $@
|
||||
cmd_cc_s_c = $(CC) $(c_flags) -fverbose-asm -S -o $@ $<
|
||||
|
||||
%.s: %.c FORCE
|
||||
$(obj)/%.s: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,cc_s_c)
|
||||
|
||||
quiet_cmd_cc_i_c = CPP $(quiet_modtag) $@
|
||||
cmd_cc_i_c = $(CPP) $(c_flags) -o $@ $<
|
||||
|
||||
%.i: %.c FORCE
|
||||
$(obj)/%.i: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,cc_i_c)
|
||||
|
||||
quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
|
||||
@ -146,7 +146,7 @@ cmd_cc_symtypes_c = \
|
||||
| $(GENKSYMS) -T $@ >/dev/null; \
|
||||
test -s $@ || rm -f $@
|
||||
|
||||
%.symtypes : %.c FORCE
|
||||
$(obj)/%.symtypes : $(src)/%.c FORCE
|
||||
$(call if_changed_dep,cc_symtypes_c)
|
||||
|
||||
# C (.c) files
|
||||
@ -198,14 +198,13 @@ define rule_cc_o_c
|
||||
endef
|
||||
|
||||
# Built-in and composite module parts
|
||||
|
||||
%.o: %.c FORCE
|
||||
$(obj)/%.o: $(src)/%.c FORCE
|
||||
$(call cmd,force_checksrc)
|
||||
$(call if_changed_rule,cc_o_c)
|
||||
|
||||
# Single-part modules are special since we need to mark them in $(MODVERDIR)
|
||||
|
||||
$(single-used-m): %.o: %.c FORCE
|
||||
$(single-used-m): $(obj)/%.o: $(src)/%.c FORCE
|
||||
$(call cmd,force_checksrc)
|
||||
$(call if_changed_rule,cc_o_c)
|
||||
@{ echo $(@:.o=.ko); echo $@; } > $(MODVERDIR)/$(@F:.o=.mod)
|
||||
@ -215,7 +214,7 @@ quiet_cmd_cc_lst_c = MKLST $@
|
||||
$(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
|
||||
System.map $(OBJDUMP) > $@
|
||||
|
||||
%.lst: %.c FORCE
|
||||
$(obj)/%.lst: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,cc_lst_c)
|
||||
|
||||
# Compile assembler sources (.S)
|
||||
@ -229,13 +228,13 @@ $(real-objs-m:.o=.s): modkern_aflags := $(AFLAGS_MODULE)
|
||||
quiet_cmd_as_s_S = CPP $(quiet_modtag) $@
|
||||
cmd_as_s_S = $(CPP) $(a_flags) -o $@ $<
|
||||
|
||||
%.s: %.S FORCE
|
||||
$(obj)/%.s: $(src)/%.S FORCE
|
||||
$(call if_changed_dep,as_s_S)
|
||||
|
||||
quiet_cmd_as_o_S = AS $(quiet_modtag) $@
|
||||
cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
|
||||
|
||||
%.o: %.S FORCE
|
||||
$(obj)/%.o: $(src)/%.S FORCE
|
||||
$(call if_changed_dep,as_o_S)
|
||||
|
||||
targets += $(real-objs-y) $(real-objs-m) $(lib-y)
|
||||
@ -246,7 +245,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(always)
|
||||
quiet_cmd_cpp_lds_S = LDS $@
|
||||
cmd_cpp_lds_S = $(CPP) $(cpp_flags) -D__ASSEMBLY__ -o $@ $<
|
||||
|
||||
%.lds: %.lds.S FORCE
|
||||
$(obj)/%.lds: $(src)/%.lds.S FORCE
|
||||
$(call if_changed_dep,cpp_lds_S)
|
||||
|
||||
# Build the compiled-in targets
|
||||
|
@ -114,7 +114,7 @@ hostcxx_flags = -Wp,-MD,$(depfile) $(__hostcxx_flags)
|
||||
quiet_cmd_host-csingle = HOSTCC $@
|
||||
cmd_host-csingle = $(HOSTCC) $(hostc_flags) -o $@ $< \
|
||||
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
||||
$(host-csingle): %: %.c FORCE
|
||||
$(host-csingle): $(obj)/%: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,host-csingle)
|
||||
|
||||
# Link an executable based on list of .o files, all plain c
|
||||
@ -123,14 +123,14 @@ quiet_cmd_host-cmulti = HOSTLD $@
|
||||
cmd_host-cmulti = $(HOSTCC) $(HOSTLDFLAGS) -o $@ \
|
||||
$(addprefix $(obj)/,$($(@F)-objs)) \
|
||||
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
||||
$(host-cmulti): %: $(host-cobjs) $(host-cshlib) FORCE
|
||||
$(host-cmulti): $(obj)/%: $(host-cobjs) $(host-cshlib) FORCE
|
||||
$(call if_changed,host-cmulti)
|
||||
|
||||
# Create .o file from a single .c file
|
||||
# host-cobjs -> .o
|
||||
quiet_cmd_host-cobjs = HOSTCC $@
|
||||
cmd_host-cobjs = $(HOSTCC) $(hostc_flags) -c -o $@ $<
|
||||
$(host-cobjs): %.o: %.c FORCE
|
||||
$(host-cobjs): $(obj)/%.o: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,host-cobjs)
|
||||
|
||||
# Link an executable based on list of .o files, a mixture of .c and .cc
|
||||
@ -140,20 +140,20 @@ quiet_cmd_host-cxxmulti = HOSTLD $@
|
||||
$(foreach o,objs cxxobjs,\
|
||||
$(addprefix $(obj)/,$($(@F)-$(o)))) \
|
||||
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
||||
$(host-cxxmulti): %: $(host-cobjs) $(host-cxxobjs) $(host-cshlib) FORCE
|
||||
$(host-cxxmulti): $(obj)/%: $(host-cobjs) $(host-cxxobjs) $(host-cshlib) FORCE
|
||||
$(call if_changed,host-cxxmulti)
|
||||
|
||||
# Create .o file from a single .cc (C++) file
|
||||
quiet_cmd_host-cxxobjs = HOSTCXX $@
|
||||
cmd_host-cxxobjs = $(HOSTCXX) $(hostcxx_flags) -c -o $@ $<
|
||||
$(host-cxxobjs): %.o: %.cc FORCE
|
||||
$(host-cxxobjs): $(obj)/%.o: $(src)/%.cc FORCE
|
||||
$(call if_changed_dep,host-cxxobjs)
|
||||
|
||||
# Compile .c file, create position independent .o file
|
||||
# host-cshobjs -> .o
|
||||
quiet_cmd_host-cshobjs = HOSTCC -fPIC $@
|
||||
cmd_host-cshobjs = $(HOSTCC) $(hostc_flags) -fPIC -c -o $@ $<
|
||||
$(host-cshobjs): %.o: %.c FORCE
|
||||
$(host-cshobjs): $(obj)/%.o: $(src)/%.c FORCE
|
||||
$(call if_changed_dep,host-cshobjs)
|
||||
|
||||
# Link a shared library, based on position independent .o files
|
||||
@ -162,7 +162,7 @@ quiet_cmd_host-cshlib = HOSTLLD -shared $@
|
||||
cmd_host-cshlib = $(HOSTCC) $(HOSTLDFLAGS) -shared -o $@ \
|
||||
$(addprefix $(obj)/,$($(@F:.so=-objs))) \
|
||||
$(HOST_LOADLIBES) $(HOSTLOADLIBES_$(@F))
|
||||
$(host-cshlib): %: $(host-cshobjs) FORCE
|
||||
$(host-cshlib): $(obj)/%: $(host-cshobjs) FORCE
|
||||
$(call if_changed,host-cshlib)
|
||||
|
||||
targets += $(host-csingle) $(host-cmulti) $(host-cobjs)\
|
||||
|
@ -63,16 +63,16 @@ quiet_cmd_modpost = MODPOST $(words $(filter-out vmlinux FORCE, $^)) modules
|
||||
$(if $(KBUILD_EXTMOD),-i,-o) $(kernelsymfile) \
|
||||
$(if $(KBUILD_EXTMOD),-I $(modulesymfile)) \
|
||||
$(if $(KBUILD_EXTMOD),-o $(modulesymfile)) \
|
||||
$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w) \
|
||||
$(wildcard vmlinux) $(filter-out FORCE,$^)
|
||||
$(if $(KBUILD_EXTMOD)$(KBUILD_MODPOST_WARN),-w)
|
||||
|
||||
PHONY += __modpost
|
||||
__modpost: $(modules:.ko=.o) FORCE
|
||||
$(call cmd,modpost)
|
||||
$(call cmd,modpost) $(wildcard vmlinux) $(filter-out FORCE,$^)
|
||||
|
||||
quiet_cmd_kernel-mod = MODPOST $@
|
||||
cmd_kernel-mod = $(cmd_modpost)
|
||||
cmd_kernel-mod = $(cmd_modpost) $(KBUILD_VMLINUX_OBJS)
|
||||
|
||||
PHONY += vmlinux
|
||||
vmlinux: FORCE
|
||||
$(call cmd,kernel-mod)
|
||||
|
||||
|
@ -249,6 +249,8 @@ void parse_config_file(char *map, size_t len)
|
||||
found:
|
||||
if (!memcmp(q - 7, "_MODULE", 7))
|
||||
q -= 7;
|
||||
if( (q-p-7) < 0 )
|
||||
continue;
|
||||
use_config(p+7, q-p-7);
|
||||
}
|
||||
}
|
||||
|
118
scripts/checksyscalls.sh
Executable file
118
scripts/checksyscalls.sh
Executable file
@ -0,0 +1,118 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Check if current architecture are missing any function calls compared
|
||||
# to i386.
|
||||
# i386 define a number of legacy system calls that are i386 specific
|
||||
# and listed below so they are ignored.
|
||||
#
|
||||
# Usage:
|
||||
# syscallchk gcc gcc-options
|
||||
#
|
||||
|
||||
ignore_list() {
|
||||
cat << EOF
|
||||
#include <asm/types.h>
|
||||
#include <asm/unistd.h>
|
||||
|
||||
/* System calls for 32-bit kernels only */
|
||||
#if BITS_PER_LONG == 64
|
||||
#define __IGNORE_sendfile64
|
||||
#define __IGNORE_ftruncate64
|
||||
#define __IGNORE_truncate64
|
||||
#define __IGNORE_stat64
|
||||
#define __IGNORE_lstat64
|
||||
#define __IGNORE_fstat64
|
||||
#define __IGNORE_fcntl64
|
||||
#define __IGNORE_fadvise64_64
|
||||
#define __IGNORE_fstatat64
|
||||
#define __IGNORE_fstatfs64
|
||||
#define __IGNORE_statfs64
|
||||
#endif
|
||||
|
||||
/* i386-specific or historical system calls */
|
||||
#define __IGNORE_break
|
||||
#define __IGNORE_stty
|
||||
#define __IGNORE_gtty
|
||||
#define __IGNORE_ftime
|
||||
#define __IGNORE_prof
|
||||
#define __IGNORE_lock
|
||||
#define __IGNORE_mpx
|
||||
#define __IGNORE_ulimit
|
||||
#define __IGNORE_profil
|
||||
#define __IGNORE_ioperm
|
||||
#define __IGNORE_iopl
|
||||
#define __IGNORE_idle
|
||||
#define __IGNORE_modify_ldt
|
||||
#define __IGNORE_ugetrlimit
|
||||
#define __IGNORE_mmap2
|
||||
#define __IGNORE_vm86
|
||||
#define __IGNORE_vm86old
|
||||
#define __IGNORE_set_thread_area
|
||||
#define __IGNORE_get_thread_area
|
||||
#define __IGNORE_madvise1
|
||||
#define __IGNORE_oldstat
|
||||
#define __IGNORE_oldfstat
|
||||
#define __IGNORE_oldlstat
|
||||
#define __IGNORE_oldolduname
|
||||
#define __IGNORE_olduname
|
||||
#define __IGNORE_umount2
|
||||
#define __IGNORE_umount
|
||||
#define __IGNORE_waitpid
|
||||
#define __IGNORE_stime
|
||||
#define __IGNORE_nice
|
||||
#define __IGNORE_signal
|
||||
#define __IGNORE_sigaction
|
||||
#define __IGNORE_sgetmask
|
||||
#define __IGNORE_sigsuspend
|
||||
#define __IGNORE_sigpending
|
||||
#define __IGNORE_ssetmask
|
||||
#define __IGNORE_readdir
|
||||
#define __IGNORE_socketcall
|
||||
#define __IGNORE_ipc
|
||||
#define __IGNORE_sigreturn
|
||||
#define __IGNORE_sigprocmask
|
||||
#define __IGNORE_bdflush
|
||||
#define __IGNORE__llseek
|
||||
#define __IGNORE__newselect
|
||||
#define __IGNORE_create_module
|
||||
#define __IGNORE_delete_module
|
||||
#define __IGNORE_query_module
|
||||
#define __IGNORE_get_kernel_syms
|
||||
/* ... including the "new" 32-bit uid syscalls */
|
||||
#define __IGNORE_lchown32
|
||||
#define __IGNORE_getuid32
|
||||
#define __IGNORE_getgid32
|
||||
#define __IGNORE_geteuid32
|
||||
#define __IGNORE_getegid32
|
||||
#define __IGNORE_setreuid32
|
||||
#define __IGNORE_setregid32
|
||||
#define __IGNORE_getgroups32
|
||||
#define __IGNORE_setgroups32
|
||||
#define __IGNORE_fchown32
|
||||
#define __IGNORE_setresuid32
|
||||
#define __IGNORE_getresuid32
|
||||
#define __IGNORE_setresgid32
|
||||
#define __IGNORE_getresgid32
|
||||
#define __IGNORE_chown32
|
||||
#define __IGNORE_setuid32
|
||||
#define __IGNORE_setgid32
|
||||
#define __IGNORE_setfsuid32
|
||||
#define __IGNORE_setfsgid32
|
||||
|
||||
/* Unmerged syscalls for AFS, STREAMS, etc. */
|
||||
#define __IGNORE_afs_syscall
|
||||
#define __IGNORE_getpmsg
|
||||
#define __IGNORE_putpmsg
|
||||
#define __IGNORE_vserver
|
||||
EOF
|
||||
}
|
||||
|
||||
syscall_list() {
|
||||
sed -n -e '/^\#define/ { s/[^_]*__NR_\([^[:space:]]*\).*/\
|
||||
\#if !defined \(__NR_\1\) \&\& !defined \(__IGNORE_\1\)\
|
||||
\#warning syscall \1 not implemented\
|
||||
\#endif/p }' $1
|
||||
}
|
||||
|
||||
(ignore_list && syscall_list ${srctree}/include/asm-i386/unistd.h) | \
|
||||
$* -E -x c - > /dev/null
|
126
scripts/cleanfile
Executable file
126
scripts/cleanfile
Executable file
@ -0,0 +1,126 @@
|
||||
#!/usr/bin/perl -w
|
||||
#
|
||||
# Clean a text file -- or directory of text files -- of stealth whitespace.
|
||||
# WARNING: this can be a highly destructive operation. Use with caution.
|
||||
#
|
||||
|
||||
use bytes;
|
||||
use File::Basename;
|
||||
|
||||
#
|
||||
# Clean up space-tab sequences, either by removing spaces or
|
||||
# replacing them with tabs.
|
||||
sub clean_space_tabs($)
|
||||
{
|
||||
no bytes; # Tab alignment depends on characters
|
||||
|
||||
my($li) = @_;
|
||||
my($lo) = '';
|
||||
my $pos = 0;
|
||||
my $nsp = 0;
|
||||
my($i, $c);
|
||||
|
||||
for ($i = 0; $i < length($li); $i++) {
|
||||
$c = substr($li, $i, 1);
|
||||
if ($c eq "\t") {
|
||||
my $npos = ($pos+$nsp+8) & ~7;
|
||||
my $ntab = ($npos >> 3) - ($pos >> 3);
|
||||
$lo .= "\t" x $ntab;
|
||||
$pos = $npos;
|
||||
$nsp = 0;
|
||||
} elsif ($c eq "\n" || $c eq "\r") {
|
||||
$lo .= " " x $nsp;
|
||||
$pos += $nsp;
|
||||
$nsp = 0;
|
||||
$lo .= $c;
|
||||
$pos = 0;
|
||||
} elsif ($c eq " ") {
|
||||
$nsp++;
|
||||
} else {
|
||||
$lo .= " " x $nsp;
|
||||
$pos += $nsp;
|
||||
$nsp = 0;
|
||||
$lo .= $c;
|
||||
$pos++;
|
||||
}
|
||||
}
|
||||
$lo .= " " x $nsp;
|
||||
return $lo;
|
||||
}
|
||||
|
||||
$name = basename($0);
|
||||
|
||||
foreach $f ( @ARGV ) {
|
||||
print STDERR "$name: $f\n";
|
||||
|
||||
if (! -f $f) {
|
||||
print STDERR "$f: not a file\n";
|
||||
next;
|
||||
}
|
||||
|
||||
if (!open(FILE, '+<', $f)) {
|
||||
print STDERR "$name: Cannot open file: $f: $!\n";
|
||||
next;
|
||||
}
|
||||
|
||||
binmode FILE;
|
||||
|
||||
# First, verify that it is not a binary file; consider any file
|
||||
# with a zero byte to be a binary file. Is there any better, or
|
||||
# additional, heuristic that should be applied?
|
||||
$is_binary = 0;
|
||||
|
||||
while (read(FILE, $data, 65536) > 0) {
|
||||
if ($data =~ /\0/) {
|
||||
$is_binary = 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
if ($is_binary) {
|
||||
print STDERR "$name: $f: binary file\n";
|
||||
next;
|
||||
}
|
||||
|
||||
seek(FILE, 0, 0);
|
||||
|
||||
$in_bytes = 0;
|
||||
$out_bytes = 0;
|
||||
$blank_bytes = 0;
|
||||
|
||||
@blanks = ();
|
||||
@lines = ();
|
||||
|
||||
while ( defined($line = <FILE>) ) {
|
||||
$in_bytes += length($line);
|
||||
$line =~ s/[ \t\r]*$//; # Remove trailing spaces
|
||||
$line = clean_space_tabs($line);
|
||||
|
||||
if ( $line eq "\n" ) {
|
||||
push(@blanks, $line);
|
||||
$blank_bytes += length($line);
|
||||
} else {
|
||||
push(@lines, @blanks);
|
||||
$out_bytes += $blank_bytes;
|
||||
push(@lines, $line);
|
||||
$out_bytes += length($line);
|
||||
@blanks = ();
|
||||
$blank_bytes = 0;
|
||||
}
|
||||
}
|
||||
|
||||
# Any blanks at the end of the file are discarded
|
||||
|
||||
if ($in_bytes != $out_bytes) {
|
||||
# Only write to the file if changed
|
||||
seek(FILE, 0, 0);
|
||||
print FILE @lines;
|
||||
|
||||
if ( !defined($where = tell(FILE)) ||
|
||||
!truncate(FILE, $where) ) {
|
||||
die "$name: Failed to truncate modified file: $f: $!\n";
|
||||
}
|
||||
}
|
||||
|
||||
close(FILE);
|
||||
}
|
206
scripts/cleanpatch
Executable file
206
scripts/cleanpatch
Executable file
@ -0,0 +1,206 @@
|
||||
#!/usr/bin/perl -w
|
||||
#
|
||||
# Clean a patch file -- or directory of patch files -- of stealth whitespace.
|
||||
# WARNING: this can be a highly destructive operation. Use with caution.
|
||||
#
|
||||
|
||||
use bytes;
|
||||
use File::Basename;
|
||||
|
||||
#
|
||||
# Clean up space-tab sequences, either by removing spaces or
|
||||
# replacing them with tabs.
|
||||
sub clean_space_tabs($)
|
||||
{
|
||||
no bytes; # Tab alignment depends on characters
|
||||
|
||||
my($li) = @_;
|
||||
my($lo) = '';
|
||||
my $pos = 0;
|
||||
my $nsp = 0;
|
||||
my($i, $c);
|
||||
|
||||
for ($i = 0; $i < length($li); $i++) {
|
||||
$c = substr($li, $i, 1);
|
||||
if ($c eq "\t") {
|
||||
my $npos = ($pos+$nsp+8) & ~7;
|
||||
my $ntab = ($npos >> 3) - ($pos >> 3);
|
||||
$lo .= "\t" x $ntab;
|
||||
$pos = $npos;
|
||||
$nsp = 0;
|
||||
} elsif ($c eq "\n" || $c eq "\r") {
|
||||
$lo .= " " x $nsp;
|
||||
$pos += $nsp;
|
||||
$nsp = 0;
|
||||
$lo .= $c;
|
||||
$pos = 0;
|
||||
} elsif ($c eq " ") {
|
||||
$nsp++;
|
||||
} else {
|
||||
$lo .= " " x $nsp;
|
||||
$pos += $nsp;
|
||||
$nsp = 0;
|
||||
$lo .= $c;
|
||||
$pos++;
|
||||
}
|
||||
}
|
||||
$lo .= " " x $nsp;
|
||||
return $lo;
|
||||
}
|
||||
|
||||
$name = basename($0);
|
||||
|
||||
foreach $f ( @ARGV ) {
|
||||
print STDERR "$name: $f\n";
|
||||
|
||||
if (! -f $f) {
|
||||
print STDERR "$f: not a file\n";
|
||||
next;
|
||||
}
|
||||
|
||||
if (!open(FILE, '+<', $f)) {
|
||||
print STDERR "$name: Cannot open file: $f: $!\n";
|
||||
next;
|
||||
}
|
||||
|
||||
binmode FILE;
|
||||
|
||||
# First, verify that it is not a binary file; consider any file
|
||||
# with a zero byte to be a binary file. Is there any better, or
|
||||
# additional, heuristic that should be applied?
|
||||
$is_binary = 0;
|
||||
|
||||
while (read(FILE, $data, 65536) > 0) {
|
||||
if ($data =~ /\0/) {
|
||||
$is_binary = 1;
|
||||
last;
|
||||
}
|
||||
}
|
||||
|
||||
if ($is_binary) {
|
||||
print STDERR "$name: $f: binary file\n";
|
||||
next;
|
||||
}
|
||||
|
||||
seek(FILE, 0, 0);
|
||||
|
||||
$in_bytes = 0;
|
||||
$out_bytes = 0;
|
||||
|
||||
@lines = ();
|
||||
|
||||
$in_hunk = 0;
|
||||
$err = 0;
|
||||
|
||||
while ( defined($line = <FILE>) ) {
|
||||
$in_bytes += length($line);
|
||||
|
||||
if (!$in_hunk) {
|
||||
if ($line =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@/) {
|
||||
$minus_lines = $2;
|
||||
$plus_lines = $4;
|
||||
if ($minus_lines || $plus_lines) {
|
||||
$in_hunk = 1;
|
||||
@hunk_lines = ($line);
|
||||
}
|
||||
} else {
|
||||
push(@lines, $line);
|
||||
$out_bytes += length($line);
|
||||
}
|
||||
} else {
|
||||
# We're in a hunk
|
||||
|
||||
if ($line =~ /^\+/) {
|
||||
$plus_lines--;
|
||||
|
||||
$text = substr($line, 1);
|
||||
$text =~ s/[ \t\r]*$//; # Remove trailing spaces
|
||||
$text = clean_space_tabs($text);
|
||||
|
||||
push(@hunk_lines, '+'.$text);
|
||||
} elsif ($line =~ /^\-/) {
|
||||
$minus_lines--;
|
||||
push(@hunk_lines, $line);
|
||||
} elsif ($line =~ /^ /) {
|
||||
$plus_lines--;
|
||||
$minus_lines--;
|
||||
push(@hunk_lines, $line);
|
||||
} else {
|
||||
print STDERR "$name: $f: malformed patch\n";
|
||||
$err = 1;
|
||||
last;
|
||||
}
|
||||
|
||||
if ($plus_lines < 0 || $minus_lines < 0) {
|
||||
print STDERR "$name: $f: malformed patch\n";
|
||||
$err = 1;
|
||||
last;
|
||||
} elsif ($plus_lines == 0 && $minus_lines == 0) {
|
||||
# End of a hunk. Process this hunk.
|
||||
my $i;
|
||||
my $l;
|
||||
my @h = ();
|
||||
my $adj = 0;
|
||||
my $done = 0;
|
||||
|
||||
for ($i = scalar(@hunk_lines)-1; $i > 0; $i--) {
|
||||
$l = $hunk_lines[$i];
|
||||
if (!$done && $l eq "+\n") {
|
||||
$adj++; # Skip this line
|
||||
} elsif ($l =~ /^[ +]/) {
|
||||
$done = 1;
|
||||
unshift(@h, $l);
|
||||
} else {
|
||||
unshift(@h, $l);
|
||||
}
|
||||
}
|
||||
|
||||
$l = $hunk_lines[0]; # Hunk header
|
||||
undef @hunk_lines; # Free memory
|
||||
|
||||
if ($adj) {
|
||||
die unless
|
||||
($l =~ /^\@\@\s+\-([0-9]+),([0-9]+)\s+\+([0-9]+),([0-9]+)\s\@\@(.*)$/);
|
||||
my $mstart = $1;
|
||||
my $mlin = $2;
|
||||
my $pstart = $3;
|
||||
my $plin = $4;
|
||||
my $tail = $5; # doesn't include the final newline
|
||||
|
||||
$l = sprintf("@@ -%d,%d +%d,%d @@%s\n",
|
||||
$mstart, $mlin, $pstart, $plin-$adj,
|
||||
$tail);
|
||||
}
|
||||
unshift(@h, $l);
|
||||
|
||||
# Transfer to the output array
|
||||
foreach $l (@h) {
|
||||
$out_bytes += length($l);
|
||||
push(@lines, $l);
|
||||
}
|
||||
|
||||
$in_hunk = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($in_hunk) {
|
||||
print STDERR "$name: $f: malformed patch\n";
|
||||
$err = 1;
|
||||
}
|
||||
|
||||
if (!$err) {
|
||||
if ($in_bytes != $out_bytes) {
|
||||
# Only write to the file if changed
|
||||
seek(FILE, 0, 0);
|
||||
print FILE @lines;
|
||||
|
||||
if ( !defined($where = tell(FILE)) ||
|
||||
!truncate(FILE, $where) ) {
|
||||
die "$name: Failed to truncate modified file: $f: $!\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
close(FILE);
|
||||
}
|
@ -171,7 +171,7 @@ dir_filelist() {
|
||||
${dep_list}header "$1"
|
||||
|
||||
srcdir=$(echo "$1" | sed -e 's://*:/:g')
|
||||
dirlist=$(find "${srcdir}" -printf "%p %m %U %G\n" 2>/dev/null)
|
||||
dirlist=$(find "${srcdir}" -printf "%p %m %U %G\n")
|
||||
|
||||
# If $dirlist is only one line, then the directory is empty
|
||||
if [ "$(echo "${dirlist}" | wc -l)" -gt 1 ]; then
|
||||
@ -191,9 +191,10 @@ input_file() {
|
||||
source="$1"
|
||||
if [ -f "$1" ]; then
|
||||
${dep_list}header "$1"
|
||||
is_cpio="$(echo "$1" | sed 's/^.*\.cpio/cpio/')"
|
||||
is_cpio="$(echo "$1" | sed 's/^.*\.cpio\(\..*\)\?/cpio/')"
|
||||
if [ $2 -eq 0 -a ${is_cpio} == "cpio" ]; then
|
||||
cpio_file=$1
|
||||
echo "$1" | grep -q '^.*\.cpio\..*' && is_cpio_compressed="compressed"
|
||||
[ ! -z ${dep_list} ] && echo "$1"
|
||||
return 0
|
||||
fi
|
||||
@ -223,6 +224,7 @@ cpio_file=
|
||||
cpio_list=
|
||||
output="/dev/stdout"
|
||||
output_file=""
|
||||
is_cpio_compressed=
|
||||
|
||||
arg="$1"
|
||||
case "$arg" in
|
||||
@ -282,7 +284,11 @@ if [ ! -z ${output_file} ]; then
|
||||
cpio_tfile=${cpio_file}
|
||||
fi
|
||||
rm ${cpio_list}
|
||||
cat ${cpio_tfile} | gzip -f -9 - > ${output_file}
|
||||
if [ "${is_cpio_compressed}" = "compressed" ]; then
|
||||
cat ${cpio_tfile} > ${output_file}
|
||||
else
|
||||
cat ${cpio_tfile} | gzip -f -9 - > ${output_file}
|
||||
fi
|
||||
[ -z ${cpio_file} ] && rm ${cpio_tfile}
|
||||
fi
|
||||
exit 0
|
||||
|
@ -140,6 +140,7 @@ endif
|
||||
|
||||
clean-files := lkc_defs.h qconf.moc .tmp_qtcheck \
|
||||
.tmp_gtkcheck zconf.tab.c lex.zconf.c zconf.hash.c
|
||||
clean-files += mconf qconf gconf
|
||||
|
||||
# Needed for systems without gettext
|
||||
KBUILD_HAVE_NLS := $(shell \
|
||||
@ -183,8 +184,8 @@ $(obj)/.tmp_qtcheck:
|
||||
done; \
|
||||
if [ -z "$$dir" ]; then \
|
||||
echo "*"; \
|
||||
echo "* Unable to find the QT installation. Please make sure that"; \
|
||||
echo "* the QT development package is correctly installed and"; \
|
||||
echo "* Unable to find the QT3 installation. Please make sure that"; \
|
||||
echo "* the QT3 development package is correctly installed and"; \
|
||||
echo "* either install pkg-config or set the QTDIR environment"; \
|
||||
echo "* variable to the correct location."; \
|
||||
echo "*"; \
|
||||
|
@ -558,6 +558,7 @@ int main(int ac, char **av)
|
||||
if (stat(".config", &tmpstat)) {
|
||||
printf(_("***\n"
|
||||
"*** You have not yet configured your kernel!\n"
|
||||
"*** (missing kernel .config file)\n"
|
||||
"***\n"
|
||||
"*** Please run some configurator (e.g. \"make oldconfig\" or\n"
|
||||
"*** \"make menuconfig\" or \"make xconfig\").\n"
|
||||
|
@ -2264,7 +2264,7 @@ FILE *zconf_fopen(const char *name)
|
||||
FILE *f;
|
||||
|
||||
f = fopen(name, "r");
|
||||
if (!f && name[0] != '/') {
|
||||
if (!f && name != NULL && name[0] != '/') {
|
||||
env = getenv(SRCTREE);
|
||||
if (env) {
|
||||
sprintf(fullname, "%s/%s", env, name);
|
||||
|
@ -64,6 +64,7 @@ int zconf_lineno(void);
|
||||
char *zconf_curname(void);
|
||||
|
||||
/* confdata.c */
|
||||
const char *conf_get_configname(void);
|
||||
char *conf_get_default_confname(void);
|
||||
void sym_set_change_count(int count);
|
||||
void sym_add_change_count(int count);
|
||||
|
@ -188,6 +188,7 @@ int on_key_esc(WINDOW *win);
|
||||
int on_key_resize(void);
|
||||
|
||||
void init_dialog(const char *backtitle);
|
||||
void set_dialog_backtitle(const char *backtitle);
|
||||
void reset_dialog(void);
|
||||
void end_dialog(void);
|
||||
void attr_clear(WINDOW * win, int height, int width, chtype attr);
|
||||
|
@ -272,6 +272,11 @@ void init_dialog(const char *backtitle)
|
||||
color_setup(getenv("MENUCONFIG_COLOR"));
|
||||
}
|
||||
|
||||
void set_dialog_backtitle(const char *backtitle)
|
||||
{
|
||||
dlg.backtitle = backtitle;
|
||||
}
|
||||
|
||||
void reset_dialog(void)
|
||||
{
|
||||
initscr(); /* Init curses */
|
||||
@ -336,7 +341,7 @@ void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
|
||||
newl = 1;
|
||||
word = tempstr;
|
||||
while (word && *word) {
|
||||
sp = index(word, ' ');
|
||||
sp = strchr(word, ' ');
|
||||
if (sp)
|
||||
*sp++ = 0;
|
||||
|
||||
@ -348,7 +353,7 @@ void print_autowrap(WINDOW * win, const char *prompt, int width, int y, int x)
|
||||
if (wlen > room ||
|
||||
(newl && wlen < 4 && sp
|
||||
&& wlen + 1 + strlen(sp) > room
|
||||
&& (!(sp2 = index(sp, ' '))
|
||||
&& (!(sp2 = strchr(sp, ' '))
|
||||
|| wlen + 1 + (sp2 - sp) > room))) {
|
||||
cur_y++;
|
||||
cur_x = x;
|
||||
|
@ -26,7 +26,6 @@
|
||||
#include "lkc.h"
|
||||
#include "lxdialog/dialog.h"
|
||||
|
||||
static char menu_backtitle[128];
|
||||
static const char mconf_readme[] = N_(
|
||||
"Overview\n"
|
||||
"--------\n"
|
||||
@ -271,7 +270,6 @@ search_help[] = N_(
|
||||
" USB$ => find all CONFIG_ symbols ending with USB\n"
|
||||
"\n");
|
||||
|
||||
static char filename[PATH_MAX+1] = ".config";
|
||||
static int indent;
|
||||
static struct termios ios_org;
|
||||
static int rows = 0, cols = 0;
|
||||
@ -395,6 +393,28 @@ static struct gstr get_relations_str(struct symbol **sym_arr)
|
||||
return res;
|
||||
}
|
||||
|
||||
static char filename[PATH_MAX+1];
|
||||
static void set_config_filename(const char *config_filename)
|
||||
{
|
||||
static char menu_backtitle[PATH_MAX+128];
|
||||
int size;
|
||||
struct symbol *sym;
|
||||
|
||||
sym = sym_lookup("KERNELVERSION", 0);
|
||||
sym_calc_value(sym);
|
||||
size = snprintf(menu_backtitle, sizeof(menu_backtitle),
|
||||
_("%s - Linux Kernel v%s Configuration"),
|
||||
config_filename, sym_get_string_value(sym));
|
||||
if (size >= sizeof(menu_backtitle))
|
||||
menu_backtitle[sizeof(menu_backtitle)-1] = '\0';
|
||||
set_dialog_backtitle(menu_backtitle);
|
||||
|
||||
size = snprintf(filename, sizeof(filename), "%s", config_filename);
|
||||
if (size >= sizeof(filename))
|
||||
filename[sizeof(filename)-1] = '\0';
|
||||
}
|
||||
|
||||
|
||||
static void search_conf(void)
|
||||
{
|
||||
struct symbol **sym_arr;
|
||||
@ -816,8 +836,10 @@ static void conf_load(void)
|
||||
case 0:
|
||||
if (!dialog_input_result[0])
|
||||
return;
|
||||
if (!conf_read(dialog_input_result))
|
||||
if (!conf_read(dialog_input_result)) {
|
||||
set_config_filename(dialog_input_result);
|
||||
return;
|
||||
}
|
||||
show_textbox(NULL, _("File does not exist!"), 5, 38);
|
||||
break;
|
||||
case 1:
|
||||
@ -840,8 +862,10 @@ static void conf_save(void)
|
||||
case 0:
|
||||
if (!dialog_input_result[0])
|
||||
return;
|
||||
if (!conf_write(dialog_input_result))
|
||||
if (!conf_write(dialog_input_result)) {
|
||||
set_config_filename(dialog_input_result);
|
||||
return;
|
||||
}
|
||||
show_textbox(NULL, _("Can't create file! Probably a nonexistent directory."), 5, 60);
|
||||
break;
|
||||
case 1:
|
||||
@ -860,7 +884,6 @@ static void conf_cleanup(void)
|
||||
|
||||
int main(int ac, char **av)
|
||||
{
|
||||
struct symbol *sym;
|
||||
char *mode;
|
||||
int res;
|
||||
|
||||
@ -871,11 +894,6 @@ int main(int ac, char **av)
|
||||
conf_parse(av[1]);
|
||||
conf_read(NULL);
|
||||
|
||||
sym = sym_lookup("KERNELVERSION", 0);
|
||||
sym_calc_value(sym);
|
||||
sprintf(menu_backtitle, _("Linux Kernel v%s Configuration"),
|
||||
sym_get_string_value(sym));
|
||||
|
||||
mode = getenv("MENUCONFIG_MODE");
|
||||
if (mode) {
|
||||
if (!strcasecmp(mode, "single_menu"))
|
||||
@ -886,7 +904,8 @@ int main(int ac, char **av)
|
||||
atexit(conf_cleanup);
|
||||
init_wsize();
|
||||
reset_dialog();
|
||||
init_dialog(menu_backtitle);
|
||||
init_dialog(NULL);
|
||||
set_config_filename(conf_get_configname());
|
||||
do {
|
||||
conf(&rootmenu);
|
||||
dialog_clear();
|
||||
@ -903,7 +922,7 @@ int main(int ac, char **av)
|
||||
|
||||
switch (res) {
|
||||
case 0:
|
||||
if (conf_write(NULL)) {
|
||||
if (conf_write(filename)) {
|
||||
fprintf(stderr, _("\n\n"
|
||||
"Error during writing of the kernel configuration.\n"
|
||||
"Your kernel configuration changes were NOT saved."
|
||||
|
@ -203,7 +203,7 @@ void sym_check_prop(struct symbol *sym)
|
||||
else if (sym2->type == S_UNKNOWN)
|
||||
prop_warn(prop,
|
||||
"'select' used by config symbol '%s' "
|
||||
"refer to undefined symbol '%s'",
|
||||
"refers to undefined symbol '%s'",
|
||||
sym->name, sym2->name);
|
||||
else if (sym2->type != S_BOOLEAN && sym2->type != S_TRISTATE)
|
||||
prop_warn(prop,
|
||||
|
@ -1182,7 +1182,7 @@ void ConfigInfoView::contentsContextMenuEvent(QContextMenuEvent *e)
|
||||
Parent::contentsContextMenuEvent(e);
|
||||
}
|
||||
|
||||
ConfigSearchWindow::ConfigSearchWindow(QWidget* parent, const char *name)
|
||||
ConfigSearchWindow::ConfigSearchWindow(ConfigMainWindow* parent, const char *name)
|
||||
: Parent(parent, name), result(NULL)
|
||||
{
|
||||
setCaption("Search Config");
|
||||
@ -1206,6 +1206,9 @@ ConfigSearchWindow::ConfigSearchWindow(QWidget* parent, const char *name)
|
||||
info = new ConfigInfoView(split, name);
|
||||
connect(list->list, SIGNAL(menuChanged(struct menu *)),
|
||||
info, SLOT(setInfo(struct menu *)));
|
||||
connect(list->list, SIGNAL(menuChanged(struct menu *)),
|
||||
parent, SLOT(setMenuLink(struct menu *)));
|
||||
|
||||
layout1->addWidget(split);
|
||||
|
||||
if (name) {
|
||||
|
@ -279,7 +279,7 @@ class ConfigSearchWindow : public QDialog {
|
||||
Q_OBJECT
|
||||
typedef class QDialog Parent;
|
||||
public:
|
||||
ConfigSearchWindow(QWidget* parent, const char *name = 0);
|
||||
ConfigSearchWindow(ConfigMainWindow* parent, const char *name = 0);
|
||||
|
||||
public slots:
|
||||
void saveSettings(void);
|
||||
|
@ -786,13 +786,15 @@ static struct symbol *sym_check_expr_deps(struct expr *e)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* return NULL when dependencies are OK */
|
||||
struct symbol *sym_check_deps(struct symbol *sym)
|
||||
{
|
||||
struct symbol *sym2;
|
||||
struct property *prop;
|
||||
|
||||
if (sym->flags & SYMBOL_CHECK) {
|
||||
printf("Warning! Found recursive dependency: %s", sym->name);
|
||||
fprintf(stderr, "%s:%d:error: found recursive dependency: %s",
|
||||
sym->prop->file->name, sym->prop->lineno, sym->name);
|
||||
return sym;
|
||||
}
|
||||
if (sym->flags & SYMBOL_CHECKED)
|
||||
@ -816,13 +818,8 @@ struct symbol *sym_check_deps(struct symbol *sym)
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
if (sym2) {
|
||||
printf(" %s", sym->name);
|
||||
if (sym2 == sym) {
|
||||
printf("\n");
|
||||
sym2 = NULL;
|
||||
}
|
||||
}
|
||||
if (sym2)
|
||||
fprintf(stderr, " -> %s%s", sym->name, sym2 == sym? "\n": "");
|
||||
sym->flags &= ~SYMBOL_CHECK;
|
||||
return sym2;
|
||||
}
|
||||
|
@ -265,7 +265,7 @@ FILE *zconf_fopen(const char *name)
|
||||
FILE *f;
|
||||
|
||||
f = fopen(name, "r");
|
||||
if (!f && name[0] != '/') {
|
||||
if (!f && name != NULL && name[0] != '/') {
|
||||
env = getenv(SRCTREE);
|
||||
if (env) {
|
||||
sprintf(fullname, "%s/%s", env, name);
|
||||
|
@ -2132,9 +2132,11 @@ void conf_parse(const char *name)
|
||||
}
|
||||
menu_finalize(&rootmenu);
|
||||
for_all_symbols(i, sym) {
|
||||
sym_check_deps(sym);
|
||||
if (sym_check_deps(sym))
|
||||
zconfnerrs++;
|
||||
}
|
||||
|
||||
if (zconfnerrs)
|
||||
exit(1);
|
||||
sym_set_change_count(1);
|
||||
}
|
||||
|
||||
|
@ -501,9 +501,11 @@ void conf_parse(const char *name)
|
||||
}
|
||||
menu_finalize(&rootmenu);
|
||||
for_all_symbols(i, sym) {
|
||||
sym_check_deps(sym);
|
||||
if (sym_check_deps(sym))
|
||||
zconfnerrs++;
|
||||
}
|
||||
|
||||
if (zconfnerrs)
|
||||
exit(1);
|
||||
sym_set_change_count(1);
|
||||
}
|
||||
|
||||
|
@ -18,19 +18,32 @@ fi
|
||||
# Do not expand names
|
||||
set -f
|
||||
|
||||
if [ -r .version ]; then
|
||||
VERSION=`cat .version`
|
||||
# Fix the language to get consistent output
|
||||
LC_ALL=C
|
||||
export LC_ALL
|
||||
|
||||
if [ -z "$KBUILD_BUILD_VERSION" ]; then
|
||||
if [ -r .version ]; then
|
||||
VERSION=`cat .version`
|
||||
else
|
||||
VERSION=0
|
||||
echo 0 > .version
|
||||
fi
|
||||
else
|
||||
VERSION=0
|
||||
echo 0 > .version
|
||||
VERSION=$KBUILD_BUILD_VERSION
|
||||
fi
|
||||
|
||||
if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then
|
||||
TIMESTAMP=`date`
|
||||
else
|
||||
TIMESTAMP=$KBUILD_BUILD_TIMESTAMP
|
||||
fi
|
||||
|
||||
UTS_VERSION="#$VERSION"
|
||||
CONFIG_FLAGS=""
|
||||
if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi
|
||||
if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi
|
||||
UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS `LC_ALL=C LANG=C date`"
|
||||
UTS_VERSION="$UTS_VERSION $CONFIG_FLAGS $TIMESTAMP"
|
||||
|
||||
# Truncate to maximum length
|
||||
|
||||
@ -46,7 +59,7 @@ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}\).*/\1/"
|
||||
|
||||
echo \#define UTS_VERSION \"`echo $UTS_VERSION | $UTS_TRUNCATE`\"
|
||||
|
||||
echo \#define LINUX_COMPILE_TIME \"`LC_ALL=C LANG=C date +%T`\"
|
||||
echo \#define LINUX_COMPILE_TIME \"`date +%T`\"
|
||||
echo \#define LINUX_COMPILE_BY \"`whoami`\"
|
||||
echo \#define LINUX_COMPILE_HOST \"`hostname | $UTS_TRUNCATE`\"
|
||||
|
||||
@ -58,7 +71,7 @@ UTS_TRUNCATE="sed -e s/\(.\{1,$UTS_LEN\}\).*/\1/"
|
||||
echo \#define LINUX_COMPILE_DOMAIN
|
||||
fi
|
||||
|
||||
echo \#define LINUX_COMPILER \"`LC_ALL=C LANG=C $CC -v 2>&1 | tail -n 1`\"
|
||||
echo \#define LINUX_COMPILER \"`$CC -v 2>&1 | tail -n 1`\"
|
||||
) > .tmpcompile
|
||||
|
||||
# Only replace the real compile.h if the new one is different,
|
||||
|
@ -4,7 +4,7 @@
|
||||
# Build U-Boot image when `mkimage' tool is available.
|
||||
#
|
||||
|
||||
MKIMAGE=$(type -path ${CROSS_COMPILE}mkimage)
|
||||
MKIMAGE=$(type -path "${CROSS_COMPILE}mkimage")
|
||||
|
||||
if [ -z "${MKIMAGE}" ]; then
|
||||
MKIMAGE=$(type -path mkimage)
|
||||
|
@ -37,7 +37,6 @@ typedef unsigned char __u8;
|
||||
* even potentially has different endianness and word sizes, since
|
||||
* we handle those differences explicitly below */
|
||||
#include "../../include/linux/mod_devicetable.h"
|
||||
#include "../../include/linux/input.h"
|
||||
|
||||
#define ADD(str, sep, cond, field) \
|
||||
do { \
|
||||
@ -416,31 +415,33 @@ static int do_input_entry(const char *filename, struct input_device_id *id,
|
||||
|
||||
sprintf(alias + strlen(alias), "-e*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_EVBIT)
|
||||
do_input(alias, id->evbit, 0, EV_MAX);
|
||||
do_input(alias, id->evbit, 0, INPUT_DEVICE_ID_EV_MAX);
|
||||
sprintf(alias + strlen(alias), "k*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_KEYBIT)
|
||||
do_input(alias, id->keybit, KEY_MIN_INTERESTING, KEY_MAX);
|
||||
do_input(alias, id->keybit,
|
||||
INPUT_DEVICE_ID_KEY_MIN_INTERESTING,
|
||||
INPUT_DEVICE_ID_KEY_MAX);
|
||||
sprintf(alias + strlen(alias), "r*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_RELBIT)
|
||||
do_input(alias, id->relbit, 0, REL_MAX);
|
||||
do_input(alias, id->relbit, 0, INPUT_DEVICE_ID_REL_MAX);
|
||||
sprintf(alias + strlen(alias), "a*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_ABSBIT)
|
||||
do_input(alias, id->absbit, 0, ABS_MAX);
|
||||
do_input(alias, id->absbit, 0, INPUT_DEVICE_ID_ABS_MAX);
|
||||
sprintf(alias + strlen(alias), "m*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_MSCIT)
|
||||
do_input(alias, id->mscbit, 0, MSC_MAX);
|
||||
do_input(alias, id->mscbit, 0, INPUT_DEVICE_ID_MSC_MAX);
|
||||
sprintf(alias + strlen(alias), "l*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_LEDBIT)
|
||||
do_input(alias, id->ledbit, 0, LED_MAX);
|
||||
do_input(alias, id->ledbit, 0, INPUT_DEVICE_ID_LED_MAX);
|
||||
sprintf(alias + strlen(alias), "s*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_SNDBIT)
|
||||
do_input(alias, id->sndbit, 0, SND_MAX);
|
||||
do_input(alias, id->sndbit, 0, INPUT_DEVICE_ID_SND_MAX);
|
||||
sprintf(alias + strlen(alias), "f*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_FFBIT)
|
||||
do_input(alias, id->ffbit, 0, FF_MAX);
|
||||
do_input(alias, id->ffbit, 0, INPUT_DEVICE_ID_FF_MAX);
|
||||
sprintf(alias + strlen(alias), "w*");
|
||||
if (id->flags & INPUT_DEVICE_ID_MATCH_SWBIT)
|
||||
do_input(alias, id->swbit, 0, SW_MAX);
|
||||
do_input(alias, id->swbit, 0, INPUT_DEVICE_ID_SW_MAX);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -55,6 +55,17 @@ void warn(const char *fmt, ...)
|
||||
va_end(arglist);
|
||||
}
|
||||
|
||||
void merror(const char *fmt, ...)
|
||||
{
|
||||
va_list arglist;
|
||||
|
||||
fprintf(stderr, "ERROR: ");
|
||||
|
||||
va_start(arglist, fmt);
|
||||
vfprintf(stderr, fmt, arglist);
|
||||
va_end(arglist);
|
||||
}
|
||||
|
||||
static int is_vmlinux(const char *modname)
|
||||
{
|
||||
const char *myname;
|
||||
@ -333,10 +344,10 @@ void release_file(void *file, unsigned long size)
|
||||
munmap(file, size);
|
||||
}
|
||||
|
||||
static void parse_elf(struct elf_info *info, const char *filename)
|
||||
static int parse_elf(struct elf_info *info, const char *filename)
|
||||
{
|
||||
unsigned int i;
|
||||
Elf_Ehdr *hdr = info->hdr;
|
||||
Elf_Ehdr *hdr;
|
||||
Elf_Shdr *sechdrs;
|
||||
Elf_Sym *sym;
|
||||
|
||||
@ -346,9 +357,18 @@ static void parse_elf(struct elf_info *info, const char *filename)
|
||||
exit(1);
|
||||
}
|
||||
info->hdr = hdr;
|
||||
if (info->size < sizeof(*hdr))
|
||||
goto truncated;
|
||||
|
||||
if (info->size < sizeof(*hdr)) {
|
||||
/* file too small, assume this is an empty .o file */
|
||||
return 0;
|
||||
}
|
||||
/* Is this a valid ELF file? */
|
||||
if ((hdr->e_ident[EI_MAG0] != ELFMAG0) ||
|
||||
(hdr->e_ident[EI_MAG1] != ELFMAG1) ||
|
||||
(hdr->e_ident[EI_MAG2] != ELFMAG2) ||
|
||||
(hdr->e_ident[EI_MAG3] != ELFMAG3)) {
|
||||
/* Not an ELF file - silently ignore it */
|
||||
return 0;
|
||||
}
|
||||
/* Fix endianness in ELF header */
|
||||
hdr->e_shoff = TO_NATIVE(hdr->e_shoff);
|
||||
hdr->e_shstrndx = TO_NATIVE(hdr->e_shstrndx);
|
||||
@ -371,8 +391,10 @@ static void parse_elf(struct elf_info *info, const char *filename)
|
||||
= (void *)hdr + sechdrs[hdr->e_shstrndx].sh_offset;
|
||||
const char *secname;
|
||||
|
||||
if (sechdrs[i].sh_offset > info->size)
|
||||
goto truncated;
|
||||
if (sechdrs[i].sh_offset > info->size) {
|
||||
fatal("%s is truncated. sechdrs[i].sh_offset=%u > sizeof(*hrd)=%ul\n", filename, (unsigned int)sechdrs[i].sh_offset, sizeof(*hdr));
|
||||
return 0;
|
||||
}
|
||||
secname = secstrings + sechdrs[i].sh_name;
|
||||
if (strcmp(secname, ".modinfo") == 0) {
|
||||
info->modinfo = (void *)hdr + sechdrs[i].sh_offset;
|
||||
@ -407,10 +429,7 @@ static void parse_elf(struct elf_info *info, const char *filename)
|
||||
sym->st_value = TO_NATIVE(sym->st_value);
|
||||
sym->st_size = TO_NATIVE(sym->st_size);
|
||||
}
|
||||
return;
|
||||
|
||||
truncated:
|
||||
fatal("%s is truncated.\n", filename);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void parse_elf_finish(struct elf_info *info)
|
||||
@ -581,9 +600,17 @@ static int strrcmp(const char *s, const char *sub)
|
||||
* the pattern is identified by:
|
||||
* tosec = .init.text | .exit.text | .init.data
|
||||
* fromsec = .data
|
||||
* atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one
|
||||
* atsym = *driver, *_template, *_sht, *_ops, *_probe, *probe_one, *_console
|
||||
*
|
||||
* Pattern 3:
|
||||
* Whitelist all references from .pci_fixup* section to .init.text
|
||||
* This is part of the PCI init when built-in
|
||||
*
|
||||
* Pattern 4:
|
||||
* Whitelist all refereces from .text.head to .init.data
|
||||
* Whitelist all refereces from .text.head to .init.text
|
||||
*
|
||||
* Pattern 5:
|
||||
* Some symbols belong to init section but still it is ok to reference
|
||||
* these from non-init sections as these symbols don't have any memory
|
||||
* allocated for them and symbol address and value are same. So even
|
||||
@ -591,6 +618,30 @@ static int strrcmp(const char *s, const char *sub)
|
||||
* For ex. symbols marking the init section boundaries.
|
||||
* This pattern is identified by
|
||||
* refsymname = __init_begin, _sinittext, _einittext
|
||||
*
|
||||
* Pattern 6:
|
||||
* During the early init phase we have references from .init.text to
|
||||
* .text we have an intended section mismatch - do not warn about it.
|
||||
* See kernel_init() in init/main.c
|
||||
* tosec = .init.text
|
||||
* fromsec = .text
|
||||
* atsym = kernel_init
|
||||
*
|
||||
* Pattern 7:
|
||||
* Logos used in drivers/video/logo reside in __initdata but the
|
||||
* funtion that references them are EXPORT_SYMBOL() so cannot be
|
||||
* marker __init. So we whitelist them here.
|
||||
* The pattern is:
|
||||
* tosec = .init.data
|
||||
* fromsec = .text*
|
||||
* refsymname = logo_
|
||||
*
|
||||
* Pattern 8:
|
||||
* Symbols contained in .paravirtprobe may safely reference .init.text.
|
||||
* The pattern is:
|
||||
* tosec = .init.text
|
||||
* fromsec = .paravirtprobe
|
||||
*
|
||||
**/
|
||||
static int secref_whitelist(const char *modname, const char *tosec,
|
||||
const char *fromsec, const char *atsym,
|
||||
@ -642,25 +693,39 @@ static int secref_whitelist(const char *modname, const char *tosec,
|
||||
if (f1 && f2)
|
||||
return 1;
|
||||
|
||||
/* Whitelist all references from .pci_fixup section if vmlinux
|
||||
* Whitelist all refereces from .text.head to .init.data if vmlinux
|
||||
* Whitelist all refereces from .text.head to .init.text if vmlinux
|
||||
*/
|
||||
if (is_vmlinux(modname)) {
|
||||
if ((strcmp(fromsec, ".pci_fixup") == 0) &&
|
||||
(strcmp(tosec, ".init.text") == 0))
|
||||
/* Check for pattern 3 */
|
||||
if ((strncmp(fromsec, ".pci_fixup", strlen(".pci_fixup")) == 0) &&
|
||||
(strcmp(tosec, ".init.text") == 0))
|
||||
return 1;
|
||||
|
||||
/* Check for pattern 4 */
|
||||
if ((strcmp(fromsec, ".text.head") == 0) &&
|
||||
((strcmp(tosec, ".init.data") == 0) ||
|
||||
(strcmp(tosec, ".init.text") == 0)))
|
||||
return 1;
|
||||
|
||||
/* Check for pattern 5 */
|
||||
for (s = pat3refsym; *s; s++)
|
||||
if (strcmp(refsymname, *s) == 0)
|
||||
return 1;
|
||||
|
||||
/* Check for pattern 6 */
|
||||
if ((strcmp(tosec, ".init.text") == 0) &&
|
||||
(strcmp(fromsec, ".text") == 0) &&
|
||||
(strcmp(refsymname, "kernel_init") == 0))
|
||||
return 1;
|
||||
|
||||
if ((strcmp(fromsec, ".text.head") == 0) &&
|
||||
((strcmp(tosec, ".init.data") == 0) ||
|
||||
(strcmp(tosec, ".init.text") == 0)))
|
||||
/* Check for pattern 7 */
|
||||
if ((strcmp(tosec, ".init.data") == 0) &&
|
||||
(strncmp(fromsec, ".text", strlen(".text")) == 0) &&
|
||||
(strncmp(refsymname, "logo_", strlen("logo_")) == 0))
|
||||
return 1;
|
||||
|
||||
/* Check for pattern 8 */
|
||||
if ((strcmp(tosec, ".init.text") == 0) &&
|
||||
(strcmp(fromsec, ".paravirtprobe") == 0))
|
||||
return 1;
|
||||
|
||||
/* Check for pattern 3 */
|
||||
for (s = pat3refsym; *s; s++)
|
||||
if (strcmp(refsymname, *s) == 0)
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1090,7 +1155,8 @@ static void read_symbols(char *modname)
|
||||
struct elf_info info = { };
|
||||
Elf_Sym *sym;
|
||||
|
||||
parse_elf(&info, modname);
|
||||
if (!parse_elf(&info, modname))
|
||||
return;
|
||||
|
||||
mod = new_module(modname);
|
||||
|
||||
@ -1265,9 +1331,14 @@ static int add_versions(struct buffer *b, struct module *mod)
|
||||
exp = find_symbol(s->name);
|
||||
if (!exp || exp->module == mod) {
|
||||
if (have_vmlinux && !s->weak) {
|
||||
warn("\"%s\" [%s.ko] undefined!\n",
|
||||
s->name, mod->name);
|
||||
err = warn_unresolved ? 0 : 1;
|
||||
if (warn_unresolved) {
|
||||
warn("\"%s\" [%s.ko] undefined!\n",
|
||||
s->name, mod->name);
|
||||
} else {
|
||||
merror("\"%s\" [%s.ko] undefined!\n",
|
||||
s->name, mod->name);
|
||||
err = 1;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@ -1318,6 +1389,7 @@ static void add_depends(struct buffer *b, struct module *mod,
|
||||
buf_printf(b, "__attribute__((section(\".modinfo\"))) =\n");
|
||||
buf_printf(b, "\"depends=");
|
||||
for (s = mod->unres; s; s = s->next) {
|
||||
const char *p;
|
||||
if (!s->module)
|
||||
continue;
|
||||
|
||||
@ -1325,8 +1397,11 @@ static void add_depends(struct buffer *b, struct module *mod,
|
||||
continue;
|
||||
|
||||
s->module->seen = 1;
|
||||
buf_printf(b, "%s%s", first ? "" : ",",
|
||||
strrchr(s->module->name, '/') + 1);
|
||||
if ((p = strrchr(s->module->name, '/')) != NULL)
|
||||
p++;
|
||||
else
|
||||
p = s->module->name;
|
||||
buf_printf(b, "%s%s", first ? "" : ",", p);
|
||||
first = 0;
|
||||
}
|
||||
buf_printf(b, "\";\n");
|
||||
|
@ -145,3 +145,4 @@ void release_file(void *file, unsigned long size);
|
||||
|
||||
void fatal(const char *fmt, ...);
|
||||
void warn(const char *fmt, ...);
|
||||
void merror(const char *fmt, ...);
|
||||
|
@ -397,10 +397,9 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen)
|
||||
(int) strlen(basename) - 2, basename);
|
||||
|
||||
file = grab_file(filelist, &len);
|
||||
if (!file) {
|
||||
warn("could not find versions for %s\n", filelist);
|
||||
if (!file)
|
||||
/* not a module or .mod file missing - ignore */
|
||||
return;
|
||||
}
|
||||
|
||||
sources = strchr(file, '\n');
|
||||
if (!sources) {
|
||||
|
Reference in New Issue
Block a user