[PATCH 5/5] ARM: Cortex-M3: Add support for exception handling
Uwe Kleine-König
u.kleine-koenig at pengutronix.de
Sat Feb 25 09:07:26 EST 2012
On Fri, Feb 24, 2012 at 10:12:06PM +0000, Catalin Marinas wrote:
> Hi Uwe,
>
> 2012/2/24 Uwe Kleine-König <u.kleine-koenig at pengutronix.de>:
> > On Thu, Feb 16, 2012 at 10:20:02PM +0000, Russell King - ARM Linux wrote:
> >> On Thu, Feb 16, 2012 at 09:18:10PM +0100, Uwe Kleine-König wrote:
> >> > + .macro v7m_exception_entry
> >> > + cpsid i
> >> > + tst lr, #0x8 @ check the return stack
> >> > + bne 1f @ exception on process stack
> >> > + add r12, sp, #32 @ MSP before exception
> >> > + stmdb sp!, {r4-r12, lr} @ push unsaved registers
> >> > + b 2f
> >> > +1:
> >> > + mrs r12, psp @ get the process stack
> >> > + sub sp, #S_FRAME_SIZE
> >> > + stmia sp, {r4-r12, lr} @ push unsaved registers
> >> > + ldmia r12, {r0-r3, r6, r8-r10} @ load automatically saved registers
> >> > + add r12, sp, #S_R0
> >> > + stmia r12, {r0-r3, r6, r8-r10} @ fill in the rest of struct pt_regs
> >>
> >> I guess this means that pt_regs no longer contains r0..pc, cpsr, old_r0
> >> on this Cortex-M ?
>
> Just to reply to Russell - yes, this part needs changing (could be the
> pt_regs saving or just the signal and trace code that copies them to
> user so that we preserve the ABI).
>
> > I stared at the code now for some time and I wonder if it wouldn't be
> > the most nice solution to just do something like this on exception
> > entry:
> >
> > cpsid i
> > sub sp, #S_FRAME_SIZE
> > stmia sp, {r0-r12}
> > put_the_right_sp_to_sp[13]
> > put_lr_returnaddr_and_xPSR_from_right_stack_to_sp[14-16]
> >
> > For returning you could just do:
> >
> > add sp, #S_FRAME_SIZE
> > cpsie i
> > bx lr
>
> For this kind of returning, do we actually change between Process and
> Handler stack?
According to ARMARM-v7-M when pc is written to 0xfXXXXXXX (with X
denoting don't care) also the stack is restored.
> But we still need to set the pt_regs to the user stack. The kernel
> would touch all of them if a signal is to be delivered (actually
> restoring them when returning from the signal handler).
Ah, I thought only r0 might be changed. I will bear that in mind.
Thanks for your insights
Uwe
--
Pengutronix e.K. | Uwe Kleine-König |
Industrial Linux Solutions | http://www.pengutronix.de/ |
More information about the linux-arm-kernel
mailing list