diff options
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/Makefile | 1 | ||||
| -rw-r--r-- | scripts/Makefile.build | 10 | ||||
| -rw-r--r-- | scripts/Makefile.lib | 11 | ||||
| -rw-r--r-- | scripts/basic/Makefile | 2 | ||||
| -rw-r--r-- | scripts/basic/hash.c | 64 | ||||
| -rw-r--r-- | scripts/gcc-goto.sh | 5 | ||||
| -rw-r--r-- | scripts/recordmcount.c | 363 | ||||
| -rw-r--r-- | scripts/recordmcount.h | 366 |
8 files changed, 747 insertions, 75 deletions
diff --git a/scripts/Makefile b/scripts/Makefile index 842dbc2d5ae..2e088109fbd 100644 --- a/scripts/Makefile +++ b/scripts/Makefile | |||
| @@ -11,6 +11,7 @@ hostprogs-$(CONFIG_KALLSYMS) += kallsyms | |||
| 11 | hostprogs-$(CONFIG_LOGO) += pnmtologo | 11 | hostprogs-$(CONFIG_LOGO) += pnmtologo |
| 12 | hostprogs-$(CONFIG_VT) += conmakehash | 12 | hostprogs-$(CONFIG_VT) += conmakehash |
| 13 | hostprogs-$(CONFIG_IKCONFIG) += bin2c | 13 | hostprogs-$(CONFIG_IKCONFIG) += bin2c |
| 14 | hostprogs-$(BUILD_C_RECORDMCOUNT) += recordmcount | ||
| 14 | 15 | ||
| 15 | always := $(hostprogs-y) $(hostprogs-m) | 16 | always := $(hostprogs-y) $(hostprogs-m) |
| 16 | 17 | ||
diff --git a/scripts/Makefile.build b/scripts/Makefile.build index a1a5cf95a68..843bd4f4ffc 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build | |||
| @@ -209,12 +209,22 @@ cmd_modversions = \ | |||
| 209 | endif | 209 | endif |
| 210 | 210 | ||
| 211 | ifdef CONFIG_FTRACE_MCOUNT_RECORD | 211 | ifdef CONFIG_FTRACE_MCOUNT_RECORD |
| 212 | ifdef BUILD_C_RECORDMCOUNT | ||
| 213 | # Due to recursion, we must skip empty.o. | ||
| 214 | # The empty.o file is created in the make process in order to determine | ||
| 215 | # the target endianness and word size. It is made before all other C | ||
| 216 | # files, including recordmcount. | ||
| 217 | cmd_record_mcount = if [ $(@) != "scripts/mod/empty.o" ]; then \ | ||
| 218 | $(objtree)/scripts/recordmcount "$(@)"; \ | ||
| 219 | fi; | ||
| 220 | else | ||
| 212 | cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ | 221 | cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ |
| 213 | "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \ | 222 | "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \ |
| 214 | "$(if $(CONFIG_64BIT),64,32)" \ | 223 | "$(if $(CONFIG_64BIT),64,32)" \ |
| 215 | "$(OBJDUMP)" "$(OBJCOPY)" "$(CC)" "$(LD)" "$(NM)" "$(RM)" "$(MV)" \ | 224 | "$(OBJDUMP)" "$(OBJCOPY)" "$(CC)" "$(LD)" "$(NM)" "$(RM)" "$(MV)" \ |
| 216 | "$(if $(part-of-module),1,0)" "$(@)"; | 225 | "$(if $(part-of-module),1,0)" "$(@)"; |
| 217 | endif | 226 | endif |
| 227 | endif | ||
| 218 | 228 | ||
| 219 | define rule_cc_o_c | 229 | define rule_cc_o_c |
| 220 | $(call echo-cmd,checksrc) $(cmd_checksrc) \ | 230 | $(call echo-cmd,checksrc) $(cmd_checksrc) \ |
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index 54fd1b70013..7bfcf1a09ac 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib | |||
| @@ -101,14 +101,6 @@ basename_flags = -D"KBUILD_BASENAME=KBUILD_STR($(call name-fix,$(basetarget)))" | |||
| 101 | modname_flags = $(if $(filter 1,$(words $(modname))),\ | 101 | modname_flags = $(if $(filter 1,$(words $(modname))),\ |
| 102 | -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") | 102 | -D"KBUILD_MODNAME=KBUILD_STR($(call name-fix,$(modname)))") |
| 103 | 103 | ||
| 104 | #hash values | ||
| 105 | ifdef CONFIG_DYNAMIC_DEBUG | ||
| 106 | debug_flags = -D"DEBUG_HASH=$(shell ./scripts/basic/hash djb2 $(@D)$(modname))"\ | ||
| 107 | -D"DEBUG_HASH2=$(shell ./scripts/basic/hash r5 $(@D)$(modname))" | ||
| 108 | else | ||
| 109 | debug_flags = | ||
| 110 | endif | ||
| 111 | |||
| 112 | orig_c_flags = $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(KBUILD_SUBDIR_CCFLAGS) \ | 104 | orig_c_flags = $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) $(KBUILD_SUBDIR_CCFLAGS) \ |
| 113 | $(ccflags-y) $(CFLAGS_$(basetarget).o) | 105 | $(ccflags-y) $(CFLAGS_$(basetarget).o) |
| 114 | _c_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags)) | 106 | _c_flags = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(orig_c_flags)) |
| @@ -152,8 +144,7 @@ endif | |||
| 152 | 144 | ||
| 153 | c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ | 145 | c_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ |
| 154 | $(__c_flags) $(modkern_cflags) \ | 146 | $(__c_flags) $(modkern_cflags) \ |
| 155 | -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) \ | 147 | -D"KBUILD_STR(s)=\#s" $(basename_flags) $(modname_flags) |
| 156 | $(debug_flags) | ||
| 157 | 148 | ||
| 158 | a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ | 149 | a_flags = -Wp,-MD,$(depfile) $(NOSTDINC_FLAGS) $(LINUXINCLUDE) \ |
| 159 | $(__a_flags) $(modkern_aflags) | 150 | $(__a_flags) $(modkern_aflags) |
diff --git a/scripts/basic/Makefile b/scripts/basic/Makefile index 09559951df1..4c324a1f1e0 100644 --- a/scripts/basic/Makefile +++ b/scripts/basic/Makefile | |||
| @@ -9,7 +9,7 @@ | |||
| 9 | # fixdep: Used to generate dependency information during build process | 9 | # fixdep: Used to generate dependency information during build process |
| 10 | # docproc: Used in Documentation/DocBook | 10 | # docproc: Used in Documentation/DocBook |
| 11 | 11 | ||
| 12 | hostprogs-y := fixdep docproc hash | 12 | hostprogs-y := fixdep docproc |
| 13 | always := $(hostprogs-y) | 13 | always := $(hostprogs-y) |
| 14 | 14 | ||
| 15 | # fixdep is needed to compile other host programs | 15 | # fixdep is needed to compile other host programs |
diff --git a/scripts/basic/hash.c b/scripts/basic/hash.c deleted file mode 100644 index 2ef5d3f666b..00000000000 --- a/scripts/basic/hash.c +++ /dev/null | |||
| @@ -1,64 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2008 Red Hat, Inc., Jason Baron <jbaron@redhat.com> | ||
| 3 | * | ||
| 4 | */ | ||
| 5 | |||
| 6 | #include <stdio.h> | ||
| 7 | #include <stdlib.h> | ||
| 8 | #include <string.h> | ||
| 9 | |||
| 10 | #define DYNAMIC_DEBUG_HASH_BITS 6 | ||
| 11 | |||
| 12 | static const char *program; | ||
| 13 | |||
| 14 | static void usage(void) | ||
| 15 | { | ||
| 16 | printf("Usage: %s <djb2|r5> <modname>\n", program); | ||
| 17 | exit(1); | ||
| 18 | } | ||
| 19 | |||
| 20 | /* djb2 hashing algorithm by Dan Bernstein. From: | ||
| 21 | * http://www.cse.yorku.ca/~oz/hash.html | ||
| 22 | */ | ||
| 23 | |||
| 24 | static unsigned int djb2_hash(char *str) | ||
| 25 | { | ||
| 26 | unsigned long hash = 5381; | ||
| 27 | int c; | ||
| 28 | |||
| 29 | c = *str; | ||
| 30 | while (c) { | ||
| 31 | hash = ((hash << 5) + hash) + c; | ||
| 32 | c = *++str; | ||
| 33 | } | ||
| 34 | return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1)); | ||
| 35 | } | ||
| 36 | |||
| 37 | static unsigned int r5_hash(char *str) | ||
| 38 | { | ||
| 39 | unsigned long hash = 0; | ||
| 40 | int c; | ||
| 41 | |||
| 42 | c = *str; | ||
| 43 | while (c) { | ||
| 44 | hash = (hash + (c << 4) + (c >> 4)) * 11; | ||
| 45 | c = *++str; | ||
| 46 | } | ||
| 47 | return (unsigned int)(hash & ((1 << DYNAMIC_DEBUG_HASH_BITS) - 1)); | ||
| 48 | } | ||
| 49 | |||
| 50 | int main(int argc, char *argv[]) | ||
| 51 | { | ||
| 52 | program = argv[0]; | ||
| 53 | |||
| 54 | if (argc != 3) | ||
| 55 | usage(); | ||
| 56 | if (!strcmp(argv[1], "djb2")) | ||
| 57 | printf("%d\n", djb2_hash(argv[2])); | ||
| 58 | else if (!strcmp(argv[1], "r5")) | ||
| 59 | printf("%d\n", r5_hash(argv[2])); | ||
| 60 | else | ||
| 61 | usage(); | ||
| 62 | exit(0); | ||
| 63 | } | ||
| 64 | |||
diff --git a/scripts/gcc-goto.sh b/scripts/gcc-goto.sh new file mode 100644 index 00000000000..520d16b1ffa --- /dev/null +++ b/scripts/gcc-goto.sh | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | #!/bin/sh | ||
| 2 | # Test for gcc 'asm goto' suport | ||
| 3 | # Copyright (C) 2010, Jason Baron <jbaron@redhat.com> | ||
| 4 | |||
| 5 | echo "int main(void) { entry: asm goto (\"\"::::entry); return 0; }" | $@ -x c - -c -o /dev/null >/dev/null 2>&1 && echo "y" | ||
diff --git a/scripts/recordmcount.c b/scripts/recordmcount.c new file mode 100644 index 00000000000..26e1271259b --- /dev/null +++ b/scripts/recordmcount.c | |||
| @@ -0,0 +1,363 @@ | |||
| 1 | /* | ||
| 2 | * recordmcount.c: construct a table of the locations of calls to 'mcount' | ||
| 3 | * so that ftrace can find them quickly. | ||
| 4 | * Copyright 2009 John F. Reiser <jreiser@BitWagon.com>. All rights reserved. | ||
| 5 | * Licensed under the GNU General Public License, version 2 (GPLv2). | ||
| 6 | * | ||
| 7 | * Restructured to fit Linux format, as well as other updates: | ||
| 8 | * Copyright 2010 Steven Rostedt <srostedt@redhat.com>, Red Hat Inc. | ||
| 9 | */ | ||
| 10 | |||
| 11 | /* | ||
| 12 | * Strategy: alter the .o file in-place. | ||
| 13 | * | ||
| 14 | * Append a new STRTAB that has the new section names, followed by a new array | ||
| 15 | * ElfXX_Shdr[] that has the new section headers, followed by the section | ||
| 16 | * contents for __mcount_loc and its relocations. The old shstrtab strings, | ||
| 17 | * and the old ElfXX_Shdr[] array, remain as "garbage" (commonly, a couple | ||
| 18 | * kilobytes.) Subsequent processing by /bin/ld (or the kernel module loader) | ||
| 19 | * will ignore the garbage regions, because they are not designated by the | ||
| 20 | * new .e_shoff nor the new ElfXX_Shdr[]. [In order to remove the garbage, | ||
| 21 | * then use "ld -r" to create a new file that omits the garbage.] | ||
| 22 | */ | ||
| 23 | |||
| 24 | #include <sys/types.h> | ||
| 25 | #include <sys/mman.h> | ||
| 26 | #include <sys/stat.h> | ||
| 27 | #include <elf.h> | ||
| 28 | #include <fcntl.h> | ||
| 29 | #include <setjmp.h> | ||
| 30 | #include <stdio.h> | ||
| 31 | #include <stdlib.h> | ||
| 32 | #include <string.h> | ||
| 33 | #include <unistd.h> | ||
| 34 | |||
| 35 | static int fd_map; /* File descriptor for file being modified. */ | ||
| 36 | static int mmap_failed; /* Boolean flag. */ | ||
| 37 | static void *ehdr_curr; /* current ElfXX_Ehdr * for resource cleanup */ | ||
| 38 | static char gpfx; /* prefix for global symbol name (sometimes '_') */ | ||
| 39 | static struct stat sb; /* Remember .st_size, etc. */ | ||
| 40 | static jmp_buf jmpenv; /* setjmp/longjmp per-file error escape */ | ||
| 41 | |||
| 42 | /* setjmp() return values */ | ||
| 43 | enum { | ||
| 44 | SJ_SETJMP = 0, /* hardwired first return */ | ||
