PHYSADDR

Warner Losh imp at bsdimp.com
Thu Feb 28 06:41:22 UTC 2013


On Feb 27, 2013, at 11:27 PM, Tim Kientzle wrote:

> Starting to look at what is needed for a Generic ARM kernel.
> There's a lot here; I sincerely hope I'm not the only one… ;-)
> 
> First up:  Can we get rid of PHYSADDR?

There's lots of places in the tree that use it, but not so many that a whack-a-mole approach wouldn't work.

> I think we can always compute it at runtime from PC.
> 
> For example, I think this works in several places:
>   and r0, pc, #0xF0000000

This only works early in boot before we've turned on the MMU, right?

> And I've found at least one reference that I think can be simply
> eliminated:
> 
> Index: arm/elf_trampoline.c
> ===================================================================
> --- arm/elf_trampoline.c	(revision 247250)
> +++ arm/elf_trampoline.c	(working copy)
> @@ -169,7 +169,7 @@
> void
> _startC(void)
> {
> -	int physaddr = KERNPHYSADDR;
> +	unsigned int physaddr = (unsigned int)&_start & 0xfffff000;

How'd you come up with this? Perhaps we should just define KERNPHYSADDR as this gross expression :)

But isn't _start a virtual address, not a physical address?

> 	int tmp1;
> 	unsigned int sp = ((unsigned int)&_end & ~3) + 4;
> #if defined(FLASHADDR) && defined(LOADERRAMADDR)
> @@ -189,10 +189,9 @@
> 		 */
> 		unsigned int target_addr;
> 		unsigned int tmp_sp;
> -		uint32_t src_addr = (uint32_t)&_start - PHYSADDR + FLASHADDR
> -		    + (pc - FLASHADDR - ((uint32_t)&_startC - PHYSADDR)) & 0xfffff000;
> +		uint32_t src_addr = (uint32_t)&_start;

I'm not sure how this works...

> -		target_addr = (unsigned int)&_start - PHYSADDR + LOADERRAMADDR;
> +		target_addr = (unsigned int)&_start - (pc & 0xf0000000) + LOADERRAMADDR;

This might work, but I'd suggest a PC_TO_PHYSADDR(pc) macro or something similar...

> 		tmp_sp = target_addr + 0x100000 +
> 		    (unsigned int)&_end - (unsigned int)&_start;
> 		memcpy((char *)target_addr, (char *)src_addr,
> 
> 
> Tim
> 



More information about the freebsd-arm mailing list