public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* [Linux-ia64] Script for decoding PSR in oopses
@ 2003-01-31  1:46 Peter Chubb
  2003-01-31  2:10 ` Keith Owens
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: Peter Chubb @ 2003-01-31  1:46 UTC (permalink / raw)
  To: linux-ia64

[-- Attachment #1: message body text --]
[-- Type: text/plain, Size: 204 bytes --]


hi,
	I find trying to work out what the PSR is after an oops to be
a bit of a pain, so here's an awk script to do it for you.

Usage is
      decode_psr hex_number
if you save the script as decode_psr.


[-- Attachment #2: decode_psr --]
[-- Type: text/plain, Size: 2821 bytes --]

#!/bin/sh
echo $1 | awk '



function readhex(hexval,  i, digits, value, ndigit) {
	 tolower(hexval);

	 ndigit = gsub("[a-f0-9]", " &", hexval);
	 split(hexval, digits, " ");


	 value = 0;
	 for ( i = 1; i <= ndigit; i++) {
	     value *= 16;
	     value += values[digits[i]];
	 }
	 return value;
}

function decode_psr(psr,   decoded, cpl) {
	 psr = int(psr / 2);
	 if (psr % 2 == 1)
	    decoded = "be "
	 psr = int(psr / 2);
	 if (psr % 2 == 1)
	    decoded = decoded "up "
	 psr = int(psr / 2);
	 if (psr % 2 == 1)
	    decoded = decoded "ac "
	 psr = int(psr / 2);
	 if (psr % 2 == 1)
	    decoded = decoded "mfl "
	 psr = int(psr / 2);
	 if (psr % 2 == 1)
	    decoded = decoded "mfh "
	 psr = int(psr / 256);
	 if (psr % 2)
	    decoded = decoded "ic "

	 psr = int(psr / 2);
	 if (psr % 2 == 1)
	    decoded = decoded "i "
	 psr = int(psr / 2);
	 if (psr % 2 == 1)
	    decoded = decoded "pk "
	 psr = int(psr / 4)
	 if (psr % 2 == 1)
	    decoded = decoded "dt "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "dfl "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "dfh "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "sp "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "pp "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "di "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "si "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "db "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "lb "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "tb "
	 psr = int(psr / 2)
	 if (psr % 2 == 1)
	    decoded = decoded "rt "
	 psr = int(psr / 16)

	 cpl = psr % 4;
	 decoded = decoded "cpl=" cpl " "

	 psr = int(psr/4)
	 if (psr % 2)
	    decoded = decoded "IA32 "
	 psr = int(psr / 2)
	 if (psr % 2)
	    decoded = decoded "mc "
	 psr = int(psr / 2)
	 if (psr % 2)
	    decoded = decoded "it "
	 psr = int(psr / 2)
	 if (psr % 2)
	    decoded = decoded "id "
	 psr = int(psr / 2)
	 if (psr % 2)
	    decoded = decoded "da "
	 psr = int(psr / 2)
	 if (psr % 2)
	    decoded = decoded "dd "
	 psr = int(psr / 2)
	 if (psr % 2)
	    decoded = decoded "ss "
	 psr = int(psr / 2)
	 cpl = psr %4
	 decoded= decoded "ri=" cpl " "
	 psr = int(psr / 4)
	 if (psr % 2)
	    decoded = decoded "ed "
	 psr = int(psr / 2)
	 if (psr % 2)
	    decoded = decoded "bn"
	 psr = int(psr / 2)
	 if (psr % 2)
	    decoded = decoded "ia"

	 psr = int(psr / 2)
	 if (psr)
	    decoded = decoded "Reserved = " psr

	 return decoded
}

BEGIN {
      for (i = 0; i < 10; i++)
	  values[i ""] = i;
      values["a"] = 10;	
      values["b"] = 11;	
      values["c"] = 12;	
      values["d"] = 13;	
      values["e"] = 14;	
      values["f"] = 15;	

}

	{ print $1, decode_psr(readhex($1)) }
'



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Linux-ia64] Script for decoding PSR in oopses
  2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
@ 2003-01-31  2:10 ` Keith Owens
  2003-01-31  2:31 ` David Mosberger
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Keith Owens @ 2003-01-31  2:10 UTC (permalink / raw)
  To: linux-ia64

On Fri, 31 Jan 2003 12:46:00 +1100, 
Peter Chubb <peter@chubb.wattle.id.au> wrote:
>	I find trying to work out what the PSR is after an oops to be
>a bit of a pain, so here's an awk script to do it for you.
>
>Usage is
>      decode_psr hex_number
>if you save the script as decode_psr.

Below are Perl ia64_psr and ia64_isr.  Run as 
  echo hex_number | ia64_[pi]sr

== ia64_psr =
#!/usr/bin/perl -w
use strict;
use integer;

my @fields = (
	[ 0, 6, "User mask" ],
	[ 0, 1, "rv" ],
	[ 1, 1, "be" ],
	[ 2, 1, "up" ],
	[ 3, 1, "ac" ],
	[ 4, 1, "mfl" ],
	[ 5, 1, "mfh" ],
	[ 0, 24, "System mask" ],
	[ 6, 6, "rv" ],
	[ 13, 1, "ic" ],
	[ 14, 1, "i" ],
	[ 15, 1, "pk" ],
	[ 16, 1, "rv" ],
	[ 17, 1, "dt" ],
	[ 18, 1, "dfl" ],
	[ 19, 1, "dfh" ],
	[ 20, 1, "sp" ],
	[ 21, 1, "pp" ],
	[ 22, 1, "di" ],
	[ 23, 1, "si" ],
	[ 24, 1, "db" ],
	[ 25, 1, "lp" ],
	[ 26, 1, "tb" ],
	[ 27, 1, "rt" ],
	[ 28, 4, "rv" ],
	[ 32, 2, "cpl" ],
	[ 34, 1, "is" ],
	[ 35, 1, "mc" ],
	[ 36, 1, "it" ],
	[ 37, 1, "id" ],
	[ 38, 1, "da" ],
	[ 39, 1, "dd" ],
	[ 40, 1, "ss" ],
	[ 41, 2, "ri" ],
	[ 43, 1, "ed" ],
	[ 44, 1, "bn" ],
	[ 45, 1, "ia" ],
	[ 46, 18, "rv" ]
	);

while (defined($_ = <STDIN>)) {
	chomp();
	my $w0 = hex(substr($_, 0, -8));
	my $w1 = hex(substr($_, -8));
	printf("psr %s\n", $_);
	&ia64_psr($w1, 0, 32);
	&ia64_psr($w0, 32, 64);
}

sub ia64_psr()
{
	my ($w, $s, $e) = @_;
	my $v;
	foreach (@fields) {
		next if ($_->[0] >= $e);
		next if ($_->[0] < $s);
		# use integer implies signed shift, I want unsigned
		no integer;
		$v = ($w >> ($_->[0] - $s)) & (~0 >> (32 - $_->[1]));
		printf("%2d %2d %12s %x\n", $_->[0], $_->[1], $_->[2], $v);
	}
}

== ia64_isr =
#!/usr/bin/perl -w
use strict;
use integer;

my @fields = (
	[ 0, 16, "Code" ],
	[ 16, 8, "Vector" ],
	[ 24, 8, "rv" ],
	[ 32, 1, "x" ],
	[ 33, 1, "w" ],
	[ 34, 1, "r" ],
	[ 35, 1, "na" ],
	[ 36, 1, "sp" ],
	[ 37, 1, "rs" ],
	[ 39, 1, "ni" ],
	[ 40, 1, "so" ],
	[ 41, 2, "ei" ],
	[ 43, 1, "ed" ],
	[ 44, 20, "rv" ],
	);

while (defined($_ = <STDIN>)) {
	chomp();
	my $w0 = hex(substr($_, 0, -8));
	my $w1 = hex(substr($_, -8));
	printf("isr %s\n", $_);
	&ia64_isr($w1, 0, 32);
	&ia64_isr($w0, 32, 64);
}

sub ia64_isr()
{
	my ($w, $s, $e) = @_;
	my $v;
	foreach (@fields) {
		next if ($_->[0] >= $e);
		next if ($_->[0] < $s);
		# use integer implies signed shift, I want unsigned
		no integer;
		$v = ($w >> ($_->[0] - $s)) & (~0 >> (32 - $_->[1]));
		printf("%2d %2d %12s %x\n", $_->[0], $_->[1], $_->[2], $v);
	}
}



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Linux-ia64] Script for decoding PSR in oopses
  2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
  2003-01-31  2:10 ` Keith Owens
@ 2003-01-31  2:31 ` David Mosberger
  2003-01-31  3:31 ` Peter Chubb
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: David Mosberger @ 2003-01-31  2:31 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Fri, 31 Jan 2003 13:10:58 +1100, Keith Owens <kaos@ocs.com.au> said:

  Keith> On Fri, 31 Jan 2003 12:46:00 +1100, Peter Chubb
  Keith> <peter@chubb.wattle.id.au> wrote:

  >> I find trying to work out what the PSR is after an oops to be a
  >> bit of a pain, so here's an awk script to do it for you.

  >> Usage is decode_psr hex_number if you save the script as
  >> decode_psr.

  Keith> Below are Perl ia64_psr and ia64_isr.  Run as echo hex_number
  Keith> | ia64_[pi]sr

OK, now where is the Python version?? ;-))

	--david


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Linux-ia64] Script for decoding PSR in oopses
  2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
  2003-01-31  2:10 ` Keith Owens
  2003-01-31  2:31 ` David Mosberger
@ 2003-01-31  3:31 ` Peter Chubb
  2003-01-31  4:41 ` Wichmann, Mats D
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Peter Chubb @ 2003-01-31  3:31 UTC (permalink / raw)
  To: linux-ia64

>>>>> "David" = David Mosberger <davidm@napali.hpl.hp.com> writes:

>>>>> On Fri, 31 Jan 2003 13:10:58 +1100, Keith Owens <kaos@ocs.com.au> said:
Keith> On Fri, 31 Jan 2003 12:46:00 +1100, Peter Chubb
Keith> <peter@chubb.wattle.id.au> wrote:

>>> I find trying to work out what the PSR is after an oops to be a
>>> bit of a pain, so here's an awk script to do it for you.

>>> Usage is decode_psr hex_number if you save the script as
>>> decode_psr.

Keith> Below are Perl ia64_psr and ia64_isr.  Run as echo hex_number |
Keith> ia64_[pi]sr

David> OK, now where is the Python version?? ;-))

Who cares?  Once you've got a script you can use it.  

BTW, there's a bug in the AWK script:
--- decode_psr-old 2003-01-31 13:33:51.000000000 +1100
+++ decode_psr	   2003-01-31 13:11:13.000000000 +1100
@@ -77,7 +77,7 @@
 	psr = int(psr / 2)
 	if (psr % 2 = 1)
 	   decoded = decoded "rt "
-	psr = int(psr / 16)
+	psr = int(psr / 32)
  
 	cpl = psr % 4;
 	decoded = decoded "cpl=" cpl " "



^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [Linux-ia64] Script for decoding PSR in oopses
  2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
                   ` (2 preceding siblings ...)
  2003-01-31  3:31 ` Peter Chubb
@ 2003-01-31  4:41 ` Wichmann, Mats D
  2003-01-31  4:56 ` Keith Owens
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Wichmann, Mats D @ 2003-01-31  4:41 UTC (permalink / raw)
  To: linux-ia64

>   Keith> Below are Perl ia64_psr and ia64_isr.  Run as echo hex_number
>   Keith> | ia64_[pi]sr
> 
> OK, now where is the Python version?? ;-))

For once :-) the Perl isn't obtuse enough to
make it necessary.  (grin)


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Linux-ia64] Script for decoding PSR in oopses
  2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
                   ` (3 preceding siblings ...)
  2003-01-31  4:41 ` Wichmann, Mats D
@ 2003-01-31  4:56 ` Keith Owens
  2003-01-31  5:08 ` David Mosberger
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: Keith Owens @ 2003-01-31  4:56 UTC (permalink / raw)
  To: linux-ia64

On Thu, 30 Jan 2003 20:41:19 -0800, 
"Wichmann, Mats D" <mats.d.wichmann@intel.com> wrote:
>david mosberger wrote
>> OK, now where is the Python version?? ;-))
>
>For once :-) the Perl isn't obtuse enough to
>make it necessary.  (grin)

Damn!  Now I have to return my "Perl Obfuscator" badge.  OTOH, this bit
from a Perl decoder for ia64 unwind data should reinstate my rating.
<ducks and runs>

my @decode_type;

sub set_decode_type()
{
    my ($i, $mask, $type, $start, $end);
    for ($i = 0; $i < 256; ++$i) {
	$decode_type[0][$i] = '?';
	$decode_type[1][$i] = '?';
    }
    foreach (
	#       prologue                    body
	[ 0, '00-- ----', 'R1' ], [ 1, '00-- ----', 'R1' ],
	[ 0, '0100 0---', 'R2' ], [ 1, '0100 0---', 'R2' ],
	[ 0, '0110 00--', 'R3' ], [ 1, '0110 00--', 'R3' ],
	[ 0, '100- ----', 'P1' ],
	[ 0, '1010 ----', 'P2' ],
	[ 0, '1011 0---', 'P3' ],
	[ 0, '1011 1000', 'P4' ],
	[ 0, '1011 1001', 'P5' ],
	[ 0, '110- ----', 'P6' ],
	[ 0, '1110 ----', 'P7' ],
	[ 0, '1111 0000', 'P8' ],
	[ 0, '1111 0001', 'P9' ],
	[ 0, '1111 1001', 'X1' ],
	[ 0, '1111 1010', 'X2' ],
	[ 0, '1111 1011', 'X3' ],
	[ 0, '1111 1100', 'X4' ],
	[ 0, '1111 1111', 'P10' ],
				   [ 1, '10-- ----', 'B1' ],
				   [ 1, '110- ----', 'B2' ],
				   [ 1, '1110 0000', 'B3' ],	# manual only lists this form for B3 ...
				   [ 1, '1110 1010', 'ea' ],	# ... but this one is used as well :(
				   [ 1, '1111 0000', 'B4' ],
				   [ 1, '1111 1000', 'B4' ],
				   [ 1, '1111 1001', 'X1' ],
				   [ 1, '1111 1010', 'X2' ],
				   [ 1, '1111 1011', 'X3' ],
				   [ 1, '1111 1100', 'X4' ],
    ) {
	$mask = '0b' . $_->[1];
	$mask =~ s/ //g;
	$start = $end = $mask;
	$start =~ s/-/0/g;
	$end =~ s/-/1/g;
	for ($i = oct($start); $i <= oct($end); ++$i) {
	    if ($decode_type[$_->[0]][$i] ne '?') {
		die("$0 decode_type[$_->[0]][$i] already set to $decode_type[$_->[0]][$i], ignoring $_->[2]\n");
	    }
	    $decode_type[$_->[0]][$i] = $_->[2];
	}
    }
}



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Linux-ia64] Script for decoding PSR in oopses
  2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
                   ` (4 preceding siblings ...)
  2003-01-31  4:56 ` Keith Owens
@ 2003-01-31  5:08 ` David Mosberger
  2003-01-31 20:10 ` Jim Hull
  2003-02-10  5:12 ` Matt Chapman
  7 siblings, 0 replies; 9+ messages in thread
From: David Mosberger @ 2003-01-31  5:08 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Fri, 31 Jan 2003 14:31:43 +1100, Peter Chubb <peter@chubb.wattle.id.au> said:
  >>>> Usage is decode_psr hex_number if you save the script as
  >>>> decode_psr.

  Keith> Below are Perl ia64_psr and ia64_isr.  Run as echo hex_number
  Keith> ia64_[pi]sr

  David> OK, now where is the Python version?? ;-))

  Peter> Who cares?  Once you've got a script you can use it.

Oh, man, are you one of those heathens who think that _any_ language will do??

	--david

PS: Sorry if my jokes aren't funny.  Just couldn't resist... ;-)


^ permalink raw reply	[flat|nested] 9+ messages in thread

* RE: [Linux-ia64] Script for decoding PSR in oopses
  2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
                   ` (5 preceding siblings ...)
  2003-01-31  5:08 ` David Mosberger
@ 2003-01-31 20:10 ` Jim Hull
  2003-02-10  5:12 ` Matt Chapman
  7 siblings, 0 replies; 9+ messages in thread
From: Jim Hull @ 2003-01-31 20:10 UTC (permalink / raw)
  To: linux-ia64

Peter wrote:

> BTW, there's a bug in the AWK script:

There's also a bug in perl version of ia64_psr:
--- ia64_psr_orig	Fri Jan 31 11:49:35 2003
+++ ia64_psr	Fri Jan 31 11:49:35 2003
@@ -11,7 +11,7 @@
 	[ 4, 1, "mfl" ],
 	[ 5, 1, "mfh" ],
 	[ 0, 24, "System mask" ],
-	[ 6, 6, "rv" ],
+	[ 6, 7, "rv" ],
 	[ 13, 1, "ic" ],
 	[ 14, 1, "i" ],
 	[ 15, 1, "pk" ],

 -- Jim



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Linux-ia64] Script for decoding PSR in oopses
  2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
                   ` (6 preceding siblings ...)
  2003-01-31 20:10 ` Jim Hull
@ 2003-02-10  5:12 ` Matt Chapman
  7 siblings, 0 replies; 9+ messages in thread
From: Matt Chapman @ 2003-02-10  5:12 UTC (permalink / raw)
  To: linux-ia64

On Fri, Jan 31, 2003 at 12:10:29PM -0800, Jim Hull wrote:
> Peter wrote:
> 
> > BTW, there's a bug in the AWK script:
> 
> There's also a bug in perl version of ia64_psr:

And ia64_isr is missing ir:

--- ia64_isr.orig       Mon Feb 10 16:03:42 2003
+++ ia64_isr    Mon Feb 10 16:08:28 2003
@@ -12,6 +12,7 @@
        [ 35, 1, "na" ],
        [ 36, 1, "sp" ],
        [ 37, 1, "rs" ],
+       [ 38, 1, "ir" ],
        [ 39, 1, "ni" ],
        [ 40, 1, "so" ],
        [ 41, 2, "ei" ],

Matt



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2003-02-10  5:12 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-01-31  1:46 [Linux-ia64] Script for decoding PSR in oopses Peter Chubb
2003-01-31  2:10 ` Keith Owens
2003-01-31  2:31 ` David Mosberger
2003-01-31  3:31 ` Peter Chubb
2003-01-31  4:41 ` Wichmann, Mats D
2003-01-31  4:56 ` Keith Owens
2003-01-31  5:08 ` David Mosberger
2003-01-31 20:10 ` Jim Hull
2003-02-10  5:12 ` Matt Chapman

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox