----- Forwarded Message -----
From: "Cliff Wickman" <cpw(a)sgi.com>
To: "Dave Anderson" <anderson(a)redhat.com>
Sent: Friday, January 23, 2009 10:30:49 AM GMT -05:00 US/Canada Eastern
Subject: Re: [PATCH] crash: unwind with LKCD_KERNTYPES
Hi Dave,
On Fri, Jan 23, 2009 at 10:09:30AM -0500, Dave Anderson wrote:
 
 ----- "Cliff Wickman" <cpw(a)sgi.com> wrote:
 
 > This patch enables stack unwind (on ia64) when using a kerntypes
 > file for a namelist.
 > 
 > When using a kerntypes file, we have just the address of variable unw
 > and the definition of an unw structure.
 > 
 > As you can see, I didn't change the indentation of the normal code.
 
 Nicely segregated.  But instead of leaving the indentation screwed up,
 I just inserted a "goto verify" at the bottom of your if statement and
 put the label at the proper location.
 
 > Simple to do, but I didn't want to clutter this patch for a first
 > pass.
 
 With that in place, should I just take the patch for the next release,
 or did you have something else you want to add? 
Sounds good.  I have nothing more to add.  Thanks.
-Cliff
 
 Dave
   
 
 > 
 > ---
 >  unwind.c |   34 ++++++++++++++++++++++++++++++++++
 >  1 file changed, 34 insertions(+)
 > 
 > Index: crash-4.0-7.6.ia64/unwind.c
 > ===================================================================
 > --- crash-4.0-7.6.ia64.orig/unwind.c
 > +++ crash-4.0-7.6.ia64/unwind.c
 > @@ -1395,10 +1395,43 @@ unwind_init_v2(void)
 >  unwind_init_v3(void)
 >  #endif
 >  {
 > +	int len;
 >  	struct gnu_request request, *req;
 >  
 >  	req = &request;
 >  
 > +	if (LKCD_KERNTYPES()) {
 > +		if ((len = STRUCT_SIZE("unw")) == 0) {
 > +			error(WARNING,
 > +			"cannot determine unw.tables offset; no struct unw\n");
 > +			machdep->flags |= UNW_OUT_OF_SYNC;
 > +			return;
 > +		}
 > +		machdep->machspec->unw_tables_offset =
 > +			MEMBER_OFFSET("unw", "tables");
 > +		if (MEMBER_EXISTS("unw", "r0"))
 > +			machdep->flags |= UNW_R0;
 > +		/*
 > +		 * no verification of save_order, sw_off, preg_index as
 > +		 * we're purely depending on the structure definition.
 > +		 */
 > +        	if (MEMBER_EXISTS("unw", "pt_regs_offsets")) {
 > +			machdep->machspec->unw_pt_regs_offsets =
 > +				MEMBER_OFFSET("unw", "pt_regs_offsets") -
 > +				machdep->machspec->unw_tables_offset;
 > +			machdep->machspec->unw_kernel_table_offset =
 > +				MEMBER_OFFSET("unw", "kernel_table") -
 > +				machdep->machspec->unw_tables_offset;
 > +			machdep->flags |= UNW_PTREGS;
 > +		}
 > +		if (!load_unw_table(CLEAR_SCRIPT_CACHE)) {
 > +        		error(WARNING,
 > +				"unwind_init: cannot read kernel unw table\n");
 > +                	machdep->flags |= UNW_OUT_OF_SYNC;
 > +		}
 > +		machdep->machspec->unw = (void *)&unw;
 > +		/* fall to common structure size verifications */
 > +	} else {
 >          if (get_symbol_type("unw", "tables", req) ==
TYPE_CODE_UNDEF)
 > {
 >  		/*
 >  		 *  KLUDGE ALERT:
 > @@ -1449,6 +1482,7 @@ unwind_init_v3(void)
 >  
 >  		machdep->machspec->unw = (void *)&unw;
 >  	}
 > +	}
 >  
 >  	verify_common_struct("unw_frame_info", sizeof(struct
 > unw_frame_info));
 >  	verify_common_struct("unw_table", sizeof(struct unw_table)); 
-- 
Cliff Wickman
Silicon Graphics, Inc.
cpw(a)sgi.com
(651) 683-3824