aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--scripts/markup_oops.pl59
1 files changed, 50 insertions, 9 deletions
diff --git a/scripts/markup_oops.pl b/scripts/markup_oops.pl
index 700a7a654a3f..d40449cafa84 100644
--- a/scripts/markup_oops.pl
+++ b/scripts/markup_oops.pl
@@ -1,5 +1,7 @@
1#!/usr/bin/perl -w 1#!/usr/bin/perl -w
2 2
3use File::Basename;
4
3# Copyright 2008, Intel Corporation 5# Copyright 2008, Intel Corporation
4# 6#
5# This file is part of the Linux kernel 7# This file is part of the Linux kernel
@@ -13,23 +15,41 @@
13 15
14 16
15my $vmlinux_name = $ARGV[0]; 17my $vmlinux_name = $ARGV[0];
16 18if (!defined($vmlinux_name)) {
19 my $kerver = `uname -r`;
20 chomp($kerver);
21 $vmlinux_name = "/lib/modules/$kerver/build/vmlinux";
22 print "No vmlinux specified, assuming $vmlinux_name\n";
23}
24my $filename = $vmlinux_name;
17# 25#
18# Step 1: Parse the oops to find the EIP value 26# Step 1: Parse the oops to find the EIP value
19# 27#
20 28
21my $target = "0"; 29my $target = "0";
30my $function;
31my $module = "";
32my $func_offset;
33my $vmaoffset = 0;
34
22while (<STDIN>) { 35while (<STDIN>) {
23 if ($_ =~ /EIP: 0060:\[\<([a-z0-9]+)\>\]/) { 36 my $line = $_;
37 if ($line =~ /EIP: 0060:\[\<([a-z0-9]+)\>\]/) {
24 $target = $1; 38 $target = $1;
25 } 39 }
26} 40 if ($line =~ /EIP is at ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]/) {
41 $function = $1;
42 $func_offset = $2;
43 }
27 44
28if ($target =~ /^f8/) { 45 # check if it's a module
29 print "This script does not work on modules ... \n"; 46 if ($line =~ /EIP is at ([a-zA-Z0-9\_]+)\+(0x[0-9a-f]+)\/0x[a-f0-9]+\W\[([a-zA-Z0-9\_\-]+)\]/) {
30 exit; 47 $module = $3;
48 }
31} 49}
32 50
51my $decodestart = hex($target) - hex($func_offset);
52my $decodestop = $decodestart + 8192;
33if ($target eq "0") { 53if ($target eq "0") {
34 print "No oops found!\n"; 54 print "No oops found!\n";
35 print "Usage: \n"; 55 print "Usage: \n";
@@ -37,6 +57,29 @@ if ($target eq "0") {
37 exit; 57 exit;
38} 58}
39 59
60# if it's a module, we need to find the .ko file and calculate a load offset
61if ($module ne "") {
62 my $dir = dirname($filename);
63 $dir = $dir . "/";
64 my $mod = $module . ".ko";
65 my $modulefile = `find $dir -name $mod | head -1`;
66 chomp($modulefile);
67 $filename = $modulefile;
68 if ($filename eq "") {
69 print "Module .ko file for $module not found. Aborting\n";
70 exit;
71 }
72 # ok so we found the module, now we need to calculate the vma offset
73 open(FILE, "objdump -dS $filename |") || die "Cannot start objdump";
74 while (<FILE>) {
75 if ($_ =~ /^([0-9a-f]+) \<$function\>\:/) {
76 my $fu = $1;
77 $vmaoffset = hex($target) - hex($fu) - hex($func_offset);
78 }
79 }
80 close(FILE);
81}
82
40my $counter = 0; 83my $counter = 0;
41my $state = 0; 84my $state = 0;
42my $center = 0; 85my $center = 0;
@@ -59,9 +102,7 @@ sub InRange {
59# first, parse the input into the lines array, but to keep size down, 102# first, parse the input into the lines array, but to keep size down,
60# we only do this for 4Kb around the sweet spot 103# we only do this for 4Kb around the sweet spot
61 104
62my $filename; 105open(FILE, "objdump -dS --adjust-vma=$vmaoffset --start-address=$decodestart --stop-address=$decodestop $filename |") || die "Cannot start objdump";
63
64open(FILE, "objdump -dS $vmlinux_name |") || die "Cannot start objdump";
65 106
66while (<FILE>) { 107while (<FILE>) {
67 my $line = $_; 108 my $line = $_;