defining ZRELADDR as PHYS_OFFSET + TEXT_OFFSET

George G. Davis gdavis at mvista.com
Fri Feb 5 03:26:52 EST 2010


Hi,

On Mon, Feb 01, 2010 at 09:49:07AM +0100, Uwe Kleine-König wrote:
> Hallo George,
> 
> On Sun, Jan 31, 2010 at 08:24:25PM -0500, George G. Davis wrote:
> > On Thu, Jan 28, 2010 at 12:15:23AM +0000, Russell King - ARM Linux wrote:
> > > On Wed, Jan 27, 2010 at 11:12:28AM +0100, Uwe Kleine-König wrote:
> > > > Hello,
> > > > 
> > > > currently all platforms need to define zreladdr-y in
> > > > arch/arm/mach-$mach/Makefile.boot and PHYS_OFFSET (in
> > > > arch/arm/mach-$mach/include/mach/memory.h).
> > > > 
> > > > Constraints for these are:
> > > > 
> > > >  TEXTADDR = PAGE_OFFSET + TEXT_OFFSET
> > > >  __virt_to_phys(virt) = virt - PAGE_OFFSET + PHYS_OFFSET (at least for
> > > > 	"small" virtual addresses)
> > > >  ZRELADDR = __virt_to_phys(TEXTADDR)
> > > > 
> > > > (The equallity for __virt_to_phys only holds "normaly" according to
> > > > http://lists.arm.linux.org.uk/lurker/message/20010723.185051.94ce743c.en.html.
> > > > In practice it holds for addresses of the first bank of RAM which is
> > > > enough for the purposes of this mail.)
> > > > 
> > > > So we can deduce ZRELADDR = PHYS_OFFSET + TEXT_OFFSET.
> > > > 
> > > > Is there something I missed or is it possible to get rid of zreladdr-y
> > > > in .../Makefile.boot and define it according to the equation above?
> > > 
> > > You'd need to find some way to get PHYS_OFFSET out of the C code
> > > into the makefile.  With all sorts of stuff going on in various
> > > platforms memory.h files, that doesn't look simple.
> > 
> > How about this?:
> > 
> > diff --git a/arch/arm/boot/Makefile b/arch/arm/boot/Makefile
> > index 4a590f4..b79050e 100644
> > --- a/arch/arm/boot/Makefile
> > +++ b/arch/arm/boot/Makefile
> > @@ -21,7 +21,7 @@ endif
> >  #   ZRELADDR == virt_to_phys(PAGE_OFFSET + TEXT_OFFSET)
> >  #   PARAMS_PHYS must be within 4MB of ZRELADDR
> >  #   INITRD_PHYS must be in RAM
> > -ZRELADDR    := $(zreladdr-y)
> > +ZRELADDR    := $(shell printf "0x%08x" $$[`echo PHYS_OFFSET + $(TEXT_OFFSET)  | $(CPP) $(CPP_FLAGS) -D__ASSEMBLY__ -xc -include arch/arm/include/asm/memory.h - | tail -n 1`])
> >  PARAMS_PHYS := $(params_phys-y)
> >  INITRD_PHYS := $(initrd_phys-y)
> hui!  Is this really robust?

Apologies for the delay, busy...

It can be but it is admittedly rather tricky to get the syntax right.  I've
no idea how the above worked the first time I tried but it didn't upon
further inspection.  I came up with this variation on the theme:

ZRELADDR     = $(shell $(CONFIG_SHELL) -c 'printf "0x%08x" $$[`echo PHYS_OFFSET + $(TEXT_OFFSET) | $(CPP) $(cpp_flags) -D__ASSEMBLY__ -xc -imacros asm/memory.h - 2>/dev/null | tail -1`]')


This version seems to work for a number of zImage test builds I did.
Alas, it is rather tricky to get the syntax right for all uses, e.g. I
think uImage is still broken.

> 
> > Since params_phys-y is (always?) constant relative to zreladdr-y, it can
> > also be calculated in a similar fashion, e.g.
> > 
> > PARAMS_PHYS := $(shell printf "0x%08x" $$[$(ZRELADDR) - 0x7f00])
> This isn't necessarily true I think.  And I'd prefer getting rid of
> PARAMS_PHYS.  This is only used for bootp and maybe if the bootloader
> doesn't pass r2 properly.

If the bootloader is passing params pointer, then sure, disregard.

Thanks!

--
Regards,
George

> 
> Best regards
> Uwe
> 
> -- 
> Pengutronix e.K.                              | Uwe Kleine-König            |
> Industrial Linux Solutions                    | http://www.pengutronix.de/  |



More information about the linux-arm-kernel mailing list