Commit 34698bcb authored by Steven Rostedt's avatar Steven Rostedt Committed by Ingo Molnar

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: default avatarSteven Rostedt <srostedt@redhat.com>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent dce9d18a
...@@ -109,6 +109,11 @@ if ($#ARGV < 6) { ...@@ -109,6 +109,11 @@ if ($#ARGV < 6) {
my ($arch, $bits, $objdump, $objcopy, $cc, my ($arch, $bits, $objdump, $objcopy, $cc,
$ld, $nm, $rm, $mv, $inputfile) = @ARGV; $ld, $nm, $rm, $mv, $inputfile) = @ARGV;
# Acceptable sections to record.
my %text_sections = (
".text" => 1,
);
$objdump = "objdump" if ((length $objdump) == 0); $objdump = "objdump" if ((length $objdump) == 0);
$objcopy = "objcopy" if ((length $objcopy) == 0); $objcopy = "objcopy" if ((length $objcopy) == 0);
$cc = "gcc" if ((length $cc) == 0); $cc = "gcc" if ((length $cc) == 0);
...@@ -139,7 +144,7 @@ if ($arch eq "x86") { ...@@ -139,7 +144,7 @@ if ($arch eq "x86") {
} }
if ($arch eq "x86_64") { if ($arch eq "x86_64") {
$section_regex = "Disassembly of section"; $section_regex = "Disassembly of section\\s+(\\S+):";
$function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount([+-]0x[0-9a-zA-Z]+)?\$"; $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount([+-]0x[0-9a-zA-Z]+)?\$";
$type = ".quad"; $type = ".quad";
...@@ -151,7 +156,7 @@ if ($arch eq "x86_64") { ...@@ -151,7 +156,7 @@ if ($arch eq "x86_64") {
$cc .= " -m64"; $cc .= " -m64";
} elsif ($arch eq "i386") { } elsif ($arch eq "i386") {
$section_regex = "Disassembly of section"; $section_regex = "Disassembly of section\\s+(\\S+):";
$function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:"; $function_regex = "^([0-9a-fA-F]+)\\s+<(.*?)>:";
$mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$"; $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\smcount\$";
$type = ".long"; $type = ".long";
...@@ -298,7 +303,13 @@ my $text; ...@@ -298,7 +303,13 @@ my $text;
while (<IN>) { while (<IN>) {
# is it a section? # is it a section?
if (/$section_regex/) { if (/$section_regex/) {
$read_function = 1;
# Only record text sections that we know are safe
if (defined($text_sections{$1})) {
$read_function = 1;
} else {
$read_function = 0;
}
# print out any recorded offsets # print out any recorded offsets
update_funcs() if ($text_found); update_funcs() if ($text_found);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment