Date: Thu, 28 Feb 2013 18:10:13 -0700 From: Ian Lepore <ian@FreeBSD.org> To: Tim Kientzle <kientzle@FreeBSD.org> Cc: freebsd-arm@FreeBSD.org Subject: Re: PHYSADDR Message-ID: <1362100213.1195.88.camel@revolution.hippie.lan> In-Reply-To: <674A08B3-6600-4B77-8511-9EF54E4B9B1F@FreeBSD.org> References: <E886046B-1612-425B-902B-72D4B0E93618@freebsd.org> <1362068453.1195.40.camel@revolution.hippie.lan> <674A08B3-6600-4B77-8511-9EF54E4B9B1F@FreeBSD.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, 2013-02-28 at 08:58 -0800, Tim Kientzle wrote: > On Feb 28, 2013, at 8:20 AM, Ian Lepore wrote: >=20 > > On Wed, 2013-02-27 at 22:27 -0800, 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=85 ;-) > >>=20 > >> First up: Can we get rid of PHYSADDR? > >>=20 > >=20 > > If you mean, can we get rid of it within the runtime kernel, I'd say > > yes, because we can use a global variable instead which is easily > > settable in the entry code. >=20 > It doesn't seem to be used in the runtime kernel. As far as > I can see, it's purely a bootstrap concept. >=20 > > On the other hand, I've been working > > towards getting that value set correctly in the kernel elf headers at > > link time. >=20 > My question really boils down to whether PIC techniques > are sufficient for the early bootstrap stage to determine > where the kernel is currently executing and use that to > drive the initial MMU bring up. I've just started, but > the PHYSADDR uses I've examined can be replaced > with PIC techniques. But this part of the code is > pretty involved and riddled with conditional compilations, > so it will be slow going. >=20 > I was impressed to find that ubldr seems to be PIC. > I've run the same binary at different load addresses > and so far it "just works." (I didn't think it would work, > so I was surprised by this. I haven't dug through to > figure out why it works yet.) >=20 I was suprised by this paragraph, and I've just done some testing and I wonder if it's really running at different addresses, because I can't make it do so without relinking it at that address. To test, I saved the entry PC in uboot/start.S and printed it in main (patch below). No matter where I tell u-boot to load ubldr, it seems to ignore the command line and honor the elf headers: TFTP from server 172.22.42.240; our IP address is 172.22.42.233 Filename '/rpi/boot/ubldr'. Load address: 0x200000 Loading: ############## done Bytes transferred =3D 199412 (30af4 hex) U-Boot> bootelf ## Starting application at 0x01000054 ... Consoles: U-Boot console =20 Compatible API signature found @17b662a8; entry_phys 1000064 =20 TFTP from server 172.22.42.240; our IP address is 172.22.42.233 Filename '/rpi/boot/ubldr'. Load address: 0x900900 Loading: ############## done Bytes transferred =3D 199412 (30af4 hex) U-Boot> bootelf ## Starting application at 0x01000054 ... Consoles: U-Boot console =20 Compatible API signature found @17b662a8; entry_phys 1000064 <aside> The following is like the 8th version of this paragraph, maybe I should have finished the experiments before starting the mail. </aside> So I just learned that the load address printed by dhcp / tftp loading is in fact where the bits get copied to initially. The bootelf command must read the elf headers and copy the bits to the location in the headers. We know the entry point is at offset 0x54. If I load to 200000 and do "go 200054" it fails to run, because it's not linked to run at that address. If I first do "cp 200000 1000000 30af4" then "go 1000054" ubldr launches and runs. It also works to load directly to 1000000 and then "go 1000054'. -- Ian Index: arm/uboot/start.S =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- arm/uboot/start.S (revision 247421) +++ arm/uboot/start.S (working copy) @@ -37,6 +37,7 @@ _start: /* Hint where to look for the API signature */ ldr ip, =3Duboot_address str sp, [ip] + str pc, [ip, #4] =20 /* Save U-Boot's r8 */ ldr ip, =3Dsaved_regs @@ -80,6 +81,9 @@ syscall_ptr: uboot_address: .long 0 =20 + .globl entry_phys +entry_phys: + .long 0 saved_regs: .long 0 /* U-Boot's r8 */ .long 0 /* Loader's r8 */ Index: uboot/common/main.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- uboot/common/main.c (revision 247421) +++ uboot/common/main.c (working copy) @@ -116,6 +116,7 @@ meminfo(void) } } =20 +extern uint32_t entry_phys; int main(void) { @@ -142,7 +143,8 @@ main(void) */ cons_probe(); =20 - printf("Compatible API signature found @%x\n", (uint32_t)sig); + printf("Compatible API signature found @%x; entry_phys %x\n",=20 + (uint32_t)sig, entry_phys); =20 dump_sig(sig); dump_addr_info();
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1362100213.1195.88.camel>