aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2008-10-23 09:32:58 -0400
committerIngo Molnar <mingo@elte.hu>2008-10-23 09:58:20 -0400
commit34698bcbdf7b0629d6c873b5da7c63073fb45361 (patch)
tree25086d1711e4a99cc3c36c9b96567d2052d06b0d
parentdce9d18adde74b8e36b9e4a8a49ddf066bad0b3b (diff)
ftrace: dynamic ftrace process only text section
The text section stays in memory without ever leaving. With the exception of modules, but modules know how to handle that case. With the dynamic ftrace tracer, we need to make sure that it does not try to modify code that no longer exists. The only safe section is .text. This patch changes the recordmcount script to only record the mcount calls in the .text sections. Signed-off-by: Steven Rostedt <srostedt@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rwxr-xr-xscripts/recordmcount.pl17
1 files changed, 14 insertions, 3 deletions
diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
index c1c618cd96f6..6b9fe3eb8360 100755
--- a/scripts/recordmcount.pl
+++ b/scripts/recordmcount.pl
@@ -109,6 +109,11 @@ if ($#ARGV < 6) {
109my ($arch, $bits, $objdump, $objcopy, $cc, 109my ($arch, $bits, $objdump, $objcopy, $cc,
110 $ld, $nm, $rm, $mv, $inputfile) = @ARGV; 110 $ld, $nm, $rm, $mv, $inputfile) = @ARGV;
111 111
112# Acceptable sections to record.
113my %text_sections = (
114 ".text" => 1,
115);
116
112$objdump = "objdump" if ((length $objdump) == 0); 117$objdump = "objdump" if ((length $objdump) == 0);
113$objcopy = "objcopy" if ((length $objcopy) == 0); 118$objcopy = "objcopy" if ((length $objcopy) == 0);
114$cc = "gcc" if ((length $cc) == 0); 119$cc = "gcc" if ((length $cc) == 0);
@@ -139,7 +144,7 @@ if ($arch eq "x86") {
139} 144}
140 145
141if ($arch eq "x86_64") { 146if ($arch eq "x86_64") {
142 $section_regex = "Disassembly of section"; 147 $section_regex = "Disassembly of section\\s+(\\S+):";
143 $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; 148 $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
144 $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount([+-]0x[0-9a-zA-Z]+)?\$"; 149 $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount([+-]0x[0-9a-zA-Z]+)?\$";
145 $type = ".quad"; 150 $type = ".quad";
@@ -151,7 +156,7 @@ if ($arch eq "x86_64") {
151 $cc .= " -m64"; 156 $cc .= " -m64";
152 157
153} elsif ($arch eq "i386") { 158} elsif ($arch eq "i386") {
154 $section_regex = "Disassembly of section"; 159 $section_regex = "Disassembly of section\\s+(\\S+):";
155 $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; 160 $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
156 $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$"; 161 $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$";
157 $type = ".long"; 162 $type = ".long";
@@ -298,7 +303,13 @@ my $text;
298while (<IN>) { 303while (<IN>) {
299 # is it a section? 304 # is it a section?
300 if (/$section_regex/) { 305 if (/$section_regex/) {
301 $read_function = 1; 306
307 # Only record text sections that we know are safe
308 if (defined($text_sections{$1})) {
309 $read_function = 1;
310 } else {
311 $read_function = 0;
312 }
302 # print out any recorded offsets 313 # print out any recorded offsets
303 update_funcs() if ($text_found); 314 update_funcs() if ($text_found);
304 315