All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Patil, Harish" <harish.patil@intel.com>
To: linux-ia64@vger.kernel.org
Subject: RE: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val
Date: Fri, 20 Dec 2002 01:46:54 +0000	[thread overview]
Message-ID: <marc-linux-ia64-105590709805626@msgid-missing> (raw)
In-Reply-To: <marc-linux-ia64-105590709805569@msgid-missing>

> From: David Mosberger [mailto:davidm@napali.hpl.hp.com]
> Sent: Thursday, December 19, 2002 3:19 PM
> To: Patil, Harish
> Cc: 'davidm@hpl.hp.com'; 'linux-ia64@linuxia64.org'
> Subject: Re: [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen
> values
> 
> 
> >>>>> On Tue, 17 Dec 2002 08:33:38 -0800, "Patil, Harish" 
> <harish.patil@intel.com> said:
> 
>   Harish> I have a RHAS kernel compiled with *gcc3.2*. Using a script
>   Harish> based on readelf/objdmp I found out that there are 7
>   Harish> instances in this kernel where 'rlen' may be wrong. The
>   Harish> invariant the script is looking for is this: Sum(rlen for
>   Harish> various regions) = Number of slots in the code range.
> 
>   Harish> The script found following violations of the invariant:

<stuff deleted>

> 
>   Harish> code_range= 0xe000000004b18000-0xe000000004b182b0
>   Harish>         lo =  4B18000  hi = 4B182B0
>   Harish>         sum_rlen =  130 no_slots = 129
>   Harish>             *******ERROR ***********
>   Harish>             sum_rlen: 130  != no_slots:129
> 
> Do you know what code this is?  The addresses are not terribly useful
> because they'll vary from one kernel to another.

Sorry, the procedure name somehow got lost.. I disassembled the image and
the relevant procedure is:  <ia64_sigtramp>

> Is your script fully automatic?  If so, perhaps we could add it to the
> kernel sources and run it as part of "make check".  I'd love to have
> better unwind-info checking tools.  Actually, it's even more important
> to use such tools to verify the correctness of the user-level unwind
> info.

Yes, the script is fully automatic and is included below (requires a
'readelf' that 
understands "-u" option).

-Harish
<----------- BEGIN unwcheck.sh
#!/bin/sh 
#   Usage: unwcheck.sh <executable_file_name>
#   Pre-requisite: readelf [from Gnu binutils package]
#   Purpose: Check the following invariant
#       For each code range in the input binary:
#          Sum[ lengths of unwind regions] = Number of slots in code range.
#   Author : Harish Patil
#   First version: January 2002
#   Modified : 2/13/2002
#   Modified : 3/15/2002: duplicate detection
readelf -u $1 | gawk '\
 function todec(hexstr){
    dec = 0;
    l = length(hexstr);
    for (i = 1; i <= l; i++)
    {
        c = substr(hexstr, i, 1);
        if (c = "A")
            dec = dec*16 + 10;
        else if (c = "B")
            dec = dec*16 + 11;
        else if (c = "C")
            dec = dec*16 + 12;
        else if (c = "D")
            dec = dec*16 + 13;
        else if (c = "E")
            dec = dec*16 + 14;
        else if (c = "F")
            dec = dec*16 + 15;
        else 
            dec = dec*16 + c;
    }
    return dec;
 }
 BEGIN { first = 1; sum_rlen = 0; no_slots = 0; errors=0; no_code_ranges=0;
}
 {
   if (NF=5 && $3="info")
   {
      no_code_ranges += 1;
      if (first = 0)
      {
         if (sum_rlen != no_slots) 
         {
            print full_code_range;
            print "       ", "lo = ", lo, " hi =", hi;
            print "       ", "sum_rlen = ", sum_rlen, "no_slots = "
no_slots;
            print "       ","   ", "*******ERROR ***********";
            print "       ","   ", "sum_rlen:", sum_rlen, " != no_slots:"
no_slots;
            errors += 1;
         }
         sum_rlen = 0;
      }
      full_code_range =  $0;
      code_range =  $2;
      gsub("),", "", code_range);
      gsub("^.", "", code_range);
      split(code_range, addr, "-");
      lo = toupper(addr[1]);

      code_range_lo[no_code_ranges] = addr[1];
      occurs[addr[1]] += 1;
      full_range[addr[1]] = $0;

      gsub("0X.[0]*", "", lo);
      hi = toupper(addr[2]);
      gsub("0X.[0]*", "", hi);
      no_slots = (todec(hi) - todec(lo))/ 16*3
      first = 0;
   }
   if (index($0,"rlen") > 0 )
   {
    rlen_str =  substr($0, index($0,"rlen"));
    rlen = rlen_str;
    gsub("rlen=", "", rlen);
    gsub(")", "", rlen);
    sum_rlen = sum_rlen +  rlen;
   }
  }
  END {
      if (first = 0)
      {
         if (sum_rlen != no_slots) 
         {
            print "code_range=", code_range;
            print "       ", "lo = ", lo, " hi =", hi;
            print "       ", "sum_rlen = ", sum_rlen, "no_slots = "
no_slots;
            print "       ","   ", "*******ERROR ***********";
            print "       ","   ", "sum_rlen:", sum_rlen, " != no_slots:"
no_slots;
            errors += 1;
         }
      }
    no_duplicates = 0;
    for (i=1; i<=no_code_ranges; i++)
    {
        cr = code_range_lo[i];
        if (reported_cr[cr]=1) continue;
        if ( occurs[cr] > 1)
        {
            reported_cr[cr] = 1;
            print "Code range low ", code_range_lo[i], ":", full_range[cr],
" occurs: ", occurs[cr], " times.";
            print " ";
            no_duplicates++;
        }
    }
    print "==================="
    print "Total errors:", errors, "/", no_code_ranges, " duplicates:",
no_duplicates;
    print "==================="
  }
  '
---> END unwcheck.sh [note the "'" (single quote) on the last line ]


  parent reply	other threads:[~2002-12-20  1:46 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-12-16  9:00 [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen values Keith Owens
2002-12-16 22:12 ` Keith Owens
2002-12-16 22:12 ` David Mosberger
2002-12-16 22:16 ` David Mosberger
2002-12-16 23:10 ` Jim Wilson
2002-12-17  2:34 ` Keith Owens
2002-12-17  2:51 ` David Mosberger
2002-12-17  3:19 ` David Mosberger
2002-12-17  3:20 ` Keith Owens
2002-12-17  3:25 ` David Mosberger
2002-12-17  3:43 ` Keith Owens
2002-12-17 16:33 ` Patil, Harish
2002-12-19 20:19 ` David Mosberger
2002-12-20  1:46 ` Patil, Harish [this message]
2003-01-18  2:30 ` [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val David Mosberger
2003-03-07 22:28 ` [Linux-ia64] Re: gas generates incorrect ia64 unwind rlen val ues Bjorn Helgaas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=marc-linux-ia64-105590709805626@msgid-missing \
    --to=harish.patil@intel.com \
    --cc=linux-ia64@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.