From owner-freebsd-arm@FreeBSD.ORG Fri Mar 1 16:33:56 2013 Return-Path: Delivered-To: freebsd-arm@FreeBSD.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 497178E4 for ; Fri, 1 Mar 2013 16:33:56 +0000 (UTC) (envelope-from ian@FreeBSD.org) Received: from mho-02-ewr.mailhop.org (mho-04-ewr.mailhop.org [204.13.248.74]) by mx1.freebsd.org (Postfix) with ESMTP id 064C78B5 for ; Fri, 1 Mar 2013 16:33:55 +0000 (UTC) Received: from c-24-8-232-202.hsd1.co.comcast.net ([24.8.232.202] helo=damnhippie.dyndns.org) by mho-02-ewr.mailhop.org with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.72) (envelope-from ) id 1UBSuB-0000gL-6p; Fri, 01 Mar 2013 16:33:55 +0000 Received: from [172.22.42.240] (revolution.hippie.lan [172.22.42.240]) by damnhippie.dyndns.org (8.14.3/8.14.3) with ESMTP id r21GXq6R087047; Fri, 1 Mar 2013 09:33:52 -0700 (MST) (envelope-from ian@FreeBSD.org) X-Mail-Handler: Dyn Standard SMTP by Dyn X-Originating-IP: 24.8.232.202 X-Report-Abuse-To: abuse@dyndns.com (see http://www.dyndns.com/services/sendlabs/outbound_abuse.html for abuse reporting information) X-MHO-User: U2FsdGVkX1/g9aovBJweD1zQR9izm1En Subject: Re: PHYSADDR From: Ian Lepore To: Tim Kientzle In-Reply-To: <8FEA3237-8ABF-4564-B672-4B4C0C6EF291@kientzle.com> References: <1362068453.1195.40.camel@revolution.hippie.lan> <674A08B3-6600-4B77-8511-9EF54E4B9B1F@FreeBSD.org> <8FEA3237-8ABF-4564-B672-4B4C0C6EF291@kientzle.com> Content-Type: text/plain; charset="windows-1251" Date: Fri, 01 Mar 2013 09:33:52 -0700 Message-ID: <1362155632.1195.120.camel@revolution.hippie.lan> Mime-Version: 1.0 X-Mailer: Evolution 2.32.1 FreeBSD GNOME Team Port Content-Transfer-Encoding: quoted-printable X-MIME-Autoconverted: from 8bit to quoted-printable by damnhippie.dyndns.org id r21GXq6R087047 Cc: freebsd-arm@FreeBSD.org X-BeenThere: freebsd-arm@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Porting FreeBSD to the StrongARM Processor List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 01 Mar 2013 16:33:56 -0000 On Thu, 2013-02-28 at 09:44 -0800, Tim Kientzle wrote: > On Feb 28, 2013, at 8:58 AM, Tim Kientzle wrote: >=20 > >=20 > > 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 Well, it's used to set up the early-init page tables in locore.s then again to set up the real page tables and related things in initarm() and then I think it isn't used after that, so I should have said "within the kernel init". The main point I was getting at is that I don't think we need a compile-time constant of any sort related to the physical address at which the kernel is loaded. We can get the physical address of the entry point (_start) using pc-relative math, and we can get the linker to give us a constant symbol which is the offset of the _start symbol within the load image. So we can get the load address at runtime without guessing what low-order bits to mask. > >> On the other hand, I've been working > >> towards getting that value set correctly in the kernel elf headers a= t > >> link time. >=20 > A-ha! I think I just figured something out. >=20 > How would the following work: >=20 > * Rename PHYSADDR to KERNPHYSADDR_BASE >=20 > * in the top of locore.s, we have a single conditional: >=20 > #ifdef KERNPHYSADDR_BASE > _kpa_base =3D KERNPHYSADDR_BASE; > #else > _kpa_base =3D pc & 0xF0000000; > #endif >=20 > I think this would DTRT on all of the configurations > we currently have in SVN. Hmm, so the basic assumption is that every SoC will have some physical memory aligned to a 256mb boundary. E.G., there'll never be a SoC with memory at 0xN1000000 that doesn't have memory at 0xN0000000. I'm not sure that's a safe assumption given things like the rpi where the gpu carves off some memory for itself and gives the rest to the arm. It works with the way rpi carves up the ram, but I could see similar designs that wouldn't work. >=20 > * We redefine KERNPHYSADDR to be an *offset* > against _kpa_base. Then we could negotiate a single > offset (64k?) that works well on many platforms and use > that for the GENERIC kernel. Boot loaders would be > responsible for loading the kernel at an address that > preserves the KPA_OFFSET. The KPA_OFFSET would > be used in the ELF headers. >=20 > Then there are routine code transformations to use _kpa_base > instead of the compile-time symbol and to use > _kpa_base + KERNPHYSADDR instead of KERNPHYSADDR. >=20 > Does this sound reasonable as a starting point? >=20 There are even more assumptions here about what would work in every case. Given the basic sequence of boot2->u-boot->ubldr->kernel, every one of those components has to load the next component at the physical address it's linked for, and that has to not overlap the addresses being used by the thing doing the loading. The MMU is off during all of this so we can't just map our way out of any conflicts. Whatever arbitrary address we pick for the kernel is sure to conflict eventually with the memory occupied by u-boot on some random system. -- Ian