[PATCH 1/3] ARM: debug: use kconfig choice for selecting DEBUG_LL UART
Russell King - ARM Linux
linux at arm.linux.org.uk
Sun Aug 21 15:22:42 EDT 2011
On Sun, Aug 21, 2011 at 08:18:35PM +0100, Russell King - ARM Linux wrote:
> On Sun, Aug 21, 2011 at 03:02:25PM -0400, Nicolas Pitre wrote:
> > Obviously the way to go is to use a .data variable.
> >
> > And it can be referenced from assembly code in a position independent
> > manner:
> >
> > .macro get_ptr_pic, ptr, symbol
> > b 199f
> > .align
> > 198: .long .
> > .long \symbol
> > 199: adr \ptr, 198b @ get relative address of 198b
> > ldr ip, [\ptr] @ get absolute address of 198b
> > sub ip, ip, \ptr @ offset between abs and rel
> > ldr \ptr, [\ptr, #4] @ absolute address of \symbol
> > sub \ptr, \ptr, ip @ make it relative
> > .endm
>
> And have you checked that you can crap over 'ip' in the early assembly
> code? There are some (small) places where that register is used, which
> means you accidentally corrupt that register.
And further to this, I'll point out that the debugging functions are
*explicitly* designed to avoid corrupting any more than just r0-r3
and lr. That's not just the IO functions but also the hex and string
printing functions.
And the head*.S code is explicitly written to expect r0-r3 to be
corrupted - which basically means that no long-term values are held in
those registers.
More information about the linux-arm-kernel
mailing list