diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-17 19:38:06 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-12-17 19:38:06 -0500 |
| commit | dbfc985195410dad803c845743c63cd73bd1fe32 (patch) | |
| tree | 6bf6dbecb92539285ebb89948e63e691a0947941 /scripts | |
| parent | 7c508e50be47737b9a72d0f15c3ef1146925e2d2 (diff) | |
| parent | 606d62fa02cf1da43c6e21521650fff07a2e56d1 (diff) | |
Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
* 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus: (71 commits)
MIPS: Lasat: Fix botched changes to sysctl code.
RTC: rtc-cmos.c: Fix warning on MIPS
MIPS: Cleanup random differences beween lmo and Linus' kernel.
MIPS: No longer hardwire CONFIG_EMBEDDED to y
MIPS: Fix and enhance built-in kernel command line
MIPS: eXcite: Remove platform.
MIPS: Loongson: Cleanups of serial port support
MIPS: Lemote 2F: Suspend CS5536 MFGPT Timer
MIPS: Excite: move iodev_remove to .devexit.text
MIPS: Lasat: Convert to proc_fops / seq_file
MIPS: Cleanup signal code initialization
MIPS: Modularize COP2 handling
MIPS: Move EARLY_PRINTK to Kconfig.debug
MIPS: Yeeloong 2F: Cleanup reset logic using the new ec_write function
MIPS: Yeeloong 2F: Add LID open event as the wakeup event
MIPS: Yeeloong 2F: Add basic EC operations
MIPS: Move several variables from .bss to .init.data
MIPS: Tracing: Make function graph tracer work with -mmcount-ra-address
MIPS: Tracing: Reserve $12(t0) for mcount-ra-address of gcc 4.5
MIPS: Tracing: Make ftrace for MIPS work without -fno-omit-frame-pointer
...
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/Makefile.build | 1 | ||||
| -rwxr-xr-x | scripts/recordmcount.pl | 58 |
2 files changed, 56 insertions, 3 deletions
diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 341b58902ffc..0b94d2fa3a88 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build | |||
| @@ -207,6 +207,7 @@ endif | |||
| 207 | 207 | ||
| 208 | ifdef CONFIG_FTRACE_MCOUNT_RECORD | 208 | ifdef CONFIG_FTRACE_MCOUNT_RECORD |
| 209 | cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ | 209 | cmd_record_mcount = set -e ; perl $(srctree)/scripts/recordmcount.pl "$(ARCH)" \ |
| 210 | "$(if $(CONFIG_CPU_BIG_ENDIAN),big,little)" \ | ||
| 210 | "$(if $(CONFIG_64BIT),64,32)" \ | 211 | "$(if $(CONFIG_64BIT),64,32)" \ |
| 211 | "$(OBJDUMP)" "$(OBJCOPY)" "$(CC)" "$(LD)" "$(NM)" "$(RM)" "$(MV)" \ | 212 | "$(OBJDUMP)" "$(OBJCOPY)" "$(CC)" "$(LD)" "$(NM)" "$(RM)" "$(MV)" \ |
| 212 | "$(if $(part-of-module),1,0)" "$(@)"; | 213 | "$(if $(part-of-module),1,0)" "$(@)"; |
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl index 9cf0a6fad6ba..92f09fe9639e 100755 --- a/scripts/recordmcount.pl +++ b/scripts/recordmcount.pl | |||
| @@ -113,13 +113,13 @@ $P =~ s@.*/@@g; | |||
| 113 | 113 | ||
| 114 | my $V = '0.1'; | 114 | my $V = '0.1'; |
| 115 | 115 | ||
| 116 | if ($#ARGV != 10) { | 116 | if ($#ARGV != 11) { |
| 117 | print "usage: $P arch bits objdump objcopy cc ld nm rm mv is_module inputfile\n"; | 117 | print "usage: $P arch endian bits objdump objcopy cc ld nm rm mv is_module inputfile\n"; |
| 118 | print "version: $V\n"; | 118 | print "version: $V\n"; |
| 119 | exit(1); | 119 | exit(1); |
| 120 | } | 120 | } |
| 121 | 121 | ||
| 122 | my ($arch, $bits, $objdump, $objcopy, $cc, | 122 | my ($arch, $endian, $bits, $objdump, $objcopy, $cc, |
| 123 | $ld, $nm, $rm, $mv, $is_module, $inputfile) = @ARGV; | 123 | $ld, $nm, $rm, $mv, $is_module, $inputfile) = @ARGV; |
| 124 | 124 | ||
| 125 | # This file refers to mcount and shouldn't be ftraced, so lets' ignore it | 125 | # This file refers to mcount and shouldn't be ftraced, so lets' ignore it |
| @@ -295,6 +295,58 @@ if ($arch eq "x86_64") { | |||
| 295 | $ld .= " -m elf64_sparc"; | 295 | $ld .= " -m elf64_sparc"; |
| 296 | $cc .= " -m64"; | 296 | $cc .= " -m64"; |
| 297 | $objcopy .= " -O elf64-sparc"; | 297 | $objcopy .= " -O elf64-sparc"; |
| 298 | } elsif ($arch eq "mips") { | ||
| 299 | # To enable module support, we need to enable the -mlong-calls option | ||
| 300 | # of gcc for module, after using this option, we can not get the real | ||
| 301 | # offset of the calling to _mcount, but the offset of the lui | ||
| 302 | # instruction or the addiu one. herein, we record the address of the | ||
| 303 | # first one, and then we can replace this instruction by a branch | ||
| 304 | # instruction to jump over the profiling function to filter the | ||
| 305 | # indicated functions, or swith back to the lui instruction to trace | ||
| 306 | # them, which means dynamic tracing. | ||
| 307 | # | ||
| 308 | # c: 3c030000 lui v1,0x0 | ||
| 309 | # c: R_MIPS_HI16 _mcount | ||
| 310 | # c: R_MIPS_NONE *ABS* | ||
| 311 | # c: R_MIPS_NONE *ABS* | ||
| 312 | # 10: 64630000 daddiu v1,v1,0 | ||
| 313 | # 10: R_MIPS_LO16 _mcount | ||
| 314 | # 10: R_MIPS_NONE *ABS* | ||
| 315 | # 10: R_MIPS_NONE *ABS* | ||
| 316 | # 14: 03e0082d move at,ra | ||
| 317 | # 18: 0060f809 jalr v1 | ||
| 318 | # | ||
| 319 | # for the kernel: | ||
| 320 | # | ||
| 321 | # 10: 03e0082d move at,ra | ||
| 322 | # 14: 0c000000 jal 0 <loongson_halt> | ||
| 323 | # 14: R_MIPS_26 _mcount | ||
| 324 | # 14: R_MIPS_NONE *ABS* | ||
| 325 | # 14: R_MIPS_NONE *ABS* | ||
| 326 | # 18: 00020021 nop | ||
| 327 | if ($is_module eq "0") { | ||
| 328 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; | ||
| 329 | } else { | ||
| 330 | $mcount_regex = "^\\s*([0-9a-fA-F]+): R_MIPS_HI16\\s+_mcount\$"; | ||
| 331 | } | ||
| 332 | $objdump .= " -Melf-trad".$endian."mips "; | ||
| 333 | |||
| 334 | if ($endian eq "big") { | ||
| 335 | $endian = " -EB "; | ||
| 336 | $ld .= " -melf".$bits."btsmip"; | ||
| 337 | } else { | ||
| 338 | $endian = " -EL "; | ||
| 339 | $ld .= " -melf".$bits."ltsmip"; | ||
| 340 | } | ||
| 341 | |||
| 342 | $cc .= " -mno-abicalls -fno-pic -mabi=" . $bits . $endian; | ||
| 343 | $ld .= $endian; | ||
| 344 | |||
| 345 | if ($bits == 64) { | ||
| 346 | $function_regex = | ||
| 347 | "^([0-9a-fA-F]+)\\s+<(.|[^\$]L.*?|\$[^L].*?|[^\$][^L].*?)>:"; | ||
| 348 | $type = ".dword"; | ||
| 349 | } | ||
| 298 | } elsif ($arch eq "microblaze") { | 350 | } elsif ($arch eq "microblaze") { |
| 299 | # Microblaze calls '_mcount' instead of plain 'mcount'. | 351 | # Microblaze calls '_mcount' instead of plain 'mcount'. |
| 300 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; | 352 | $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s_mcount\$"; |
