Subject: Re: ARM exception handlers -- question
To: Ben Harris <>
From: Jason R Thorpe <>
List: port-arm
Date: 11/09/2001 07:37:01
On Fri, Nov 09, 2001 at 01:30:08PM +0000, Ben Harris wrote:

 > The comment means that it shouldn't be called from an exception handler
 > that's entered in SVC32 mode (which I think is just SWI).  Data aborts are
 > handled in ABT32 mode, so using PUSHFRAMEINSVC is fine.

Ah, duh, of course.

 > > Obviously, I want to be storing SVC_sp and SVC_lr (which should be no
 > > problem in a fixed fault handler, since this op is done after switing
 > > from ABT mode to SVC mode).
 > A few lines earlier:
 >         str     r0, [sp, #-4]!;         /* Push return address */          \
 >         str     lr, [sp, #-4]!;         /* Push SVC lr */                  \
 >         str     r2, [sp, #-4]!;         /* Push SVC sp */                  \
 > These get restored by the final LDMIA in PULLFRAMEFROMSVCANDEXIT.

Wow, blind, I am.  Okay, and the r0 there (which is copied from ABT_lr)
is stored in tf_pc?

 > As above, PUSHFRAMEINSVC puts both the SVC and USR registers in the
 > trapframe, and PULLFRAMEFROMSVCANDEXIT pops them.  data_abort_handler
 > twiddles tf_pc as necessary to return to the right place.

Ok, so I'm back to my original problem then, I suppose -- "Why didn't
my original badaddr() work?"  I've also attempted implementing it like
the pcb_onfault stuff is implemented, and I lose, as well.  Sigh, I'm
beginning to think I'm going to have to use the (Windows-only) JTAG
debugger to figure this one out :-/

        -- Jason R. Thorpe <>