public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
From: Keith Owens <kaos@sgi.com>
To: linux-ia64@vger.kernel.org
Subject: Re: 2.6.5 unwind problem with rp <- r0
Date: Wed, 05 May 2004 00:04:58 +0000	[thread overview]
Message-ID: <19618.1083715498@ocs3.ocs.com.au> (raw)
In-Reply-To: <4885.1083211711@kao2.melbourne.sgi.com>

On Tue, 4 May 2004 09:40:58 -0700, 
David Mosberger <davidm@napali.hpl.hp.com> wrote:
>>>>>> On Tue, 04 May 2004 12:07:25 +1000, Keith Owens <kaos@sgi.com> said:
>
>  Keith> David, you wanted rp <- r0 to get a clean termination of the
>  Keith> unwind chain.  Without that clean termination, unwind wanders
>  Keith> off into nowhere generating garbage.  This has already
>  Keith> confused at least two people.
>
>Did you not read the changelog entry where I explained why I chose
>this approach?

Which changelog entry?  The only one that comes close is "ia64: Rename
ia64_invoke_kernel_thread_helper() to start_kernel_thread() for
symmetry with start_kernel() and to make it obvious when the end of the
call-chain has been reached".

It is not obvious that the end of the chain has been reached.  The
unwinder keeps going and generates many more useless backtrace entries.

Software Conventions and Runtime Architecture Guide (24535803.pdf)
section 11.1.2 explicitly states "The bottom of the call stack is
identified by a saved return link of 0".

This ugly kludge handles unwinding from a value in r0.  It gets the
kernel unwinder working again, until it can be replaced by libunwind.

Index: linux/arch/ia64/kernel/unwind.c
=================================--- linux.orig/arch/ia64/kernel/unwind.c	Sat May  1 13:15:32 2004
+++ linux/arch/ia64/kernel/unwind.c	Sat May  1 13:15:54 2004
@@ -1417,6 +1417,10 @@
 				need_nat_info = 0;
 			}
 			val = unw.preg_index[UNW_REG_R4 + (rval - 4)];
+		} else if (rval = 0 /*kludge*/) {
+#define KLUDGE_VAL_R0 -1
+			opc = UNW_INSN_MOVE;
+			val = KLUDGE_VAL_R0;
 		} else {
 			/* register got spilled to a scratch register */
 			opc = UNW_INSN_MOVE_SCRATCH;
@@ -1697,6 +1701,7 @@
 	unsigned long opc, dst, val, off;
 	unsigned long *s = (unsigned long *) state;
 	STAT(unsigned long start;)
+	static unsigned long kludge_r0;
 
 	STAT(++unw.stat.script.runs; start = ia64_get_itc());
 	state->flags = script->flags;
@@ -1724,6 +1729,10 @@
 			break;
 
 		      case UNW_INSN_MOVE:
+			if (val = KLUDGE_VAL_R0) {
+				s[dst] = (unsigned long)&kludge_r0;
+				break;
+			}
 			if (!s[val])
 				goto lazy_init;
 			s[dst] = s[val];


  parent reply	other threads:[~2004-05-05  0:04 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-04-29  4:08 2.6.5 unwind problem with rp <- r0 Keith Owens
2004-05-03 22:28 ` David Mosberger
2004-05-04  2:07 ` Keith Owens
2004-05-04 16:40 ` David Mosberger
2004-05-05  0:04 ` Keith Owens [this message]
2004-05-05 23:38 ` David Mosberger
2004-05-06  0:08 ` Keith Owens
2004-05-06  0:19 ` David Mosberger
2004-05-06  2:04 ` Keith Owens
2004-05-06  3:42 ` David Mosberger
2004-05-07  8:12 ` Keith Owens
2004-05-11  7:03 ` David Mosberger
2004-05-11 11:32 ` Keith Owens
2004-05-11 16:55 ` David Mosberger

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=19618.1083715498@ocs3.ocs.com.au \
    --to=kaos@sgi.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox