markup_oops.pl: fix for faulting instruction in the first line of a range
authorHui Zhu <hui.zhu@windriver.com>
Thu, 28 Jan 2010 06:58:02 +0000 (06:58 +0000)
committerMichal Marek <mmarek@suse.cz>
Tue, 2 Feb 2010 13:33:56 +0000 (14:33 +0100)
I got a "No matching code found" when I use markup_oops.pl parse a error
in a x86_64 module.

cat e.c

int init_module(void)
{
char *buf = 0;

buf[0] = 3;

return 0;
}

void cleanup_module(void)
{
//char *buf = 0;

//buf[0] = 3;
}

MODULE_AUTHOR("Hui Zhu");
MODULE_LICENSE("GPL");

0000000000000000 <init_module>:
init_module():
/home/teawater/study/kernel/stack2core/example/e.c:10
   0: c6 04 25 00 00 00 00  movb   $0x3,0x0
   7: 03
/home/teawater/study/kernel/stack2core/example/e.c:13
   8: 31 c0                 xor    %eax,%eax
   a: c3                    retq
   b: 0f 1f 44 00 00        nopl   0x0(%rax,%rax,1)

0000000000000010 <cleanup_module>:
cleanup_module():
/home/teawater/study/kernel/stack2core/example/e.c:20
  10: f3 c3                 repz retq
  12: 90                    nop
  13: 90                    nop
Disassembly of section .modinfo:

This is because the faulting instruction "movb   $0x3,0x0" is the first
line of the range.

In the markup_oops.pl:
main::(./scripts/markup_oops.pl:245):
245: if (InRange($1, $target)) {
  DB<2> p $line
ffffffffa001b000: c6 04 25 00 00 00 00  movb   $0x3,0x0
  DB<3> p $counter
0

It just set $center in next loop. So it cannot get the $center.

And even if $center is set to the right value 0.
if ($center == 0) {
print "No matching code found \n";
exit;
}
The first line $center will be 0, so I change the default value to -1.

Signed-off-by: Hui Zhu <teawater@gmail.com>
Signed-off-by: Michal Marek <mmarek@suse.cz>
scripts/markup_oops.pl

index ce3e40b..4a95539 100644 (file)
@@ -204,7 +204,7 @@ if ($module ne "") {
 
 my $counter = 0;
 my $state   = 0;
-my $center  = 0;
+my $center  = -1;
 my @lines;
 my @reglines;
 
@@ -236,7 +236,8 @@ while (<FILE>) {
                                $state = 1;
                        }
                }
-       } else {
+       }
+       if ($state == 1) {
                if ($line =~ /^([a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]+)\:/) {
                        my $val = $1;
                        if (!InRange($val, $target)) {
@@ -259,7 +260,7 @@ if ($counter == 0) {
        exit;
 }
 
-if ($center == 0) {
+if ($center == -1) {
        print "No matching code found \n";
        exit;
 }