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