Kexec on arm64
mark.rutland at arm.com
Thu Aug 7 02:59:19 PDT 2014
On Thu, Aug 07, 2014 at 01:40:03AM +0100, Geoff Levand wrote:
> On Mon, 2014-08-04 at 12:35 +0100, Mark Rutland wrote:
> > > + /*
> > > + * arm64 kernel uses area above kernel image to build
> > > + * initial page tables. Max required size for this area is 384K. It
> > > + * happens when CONFIG_ARM64_PGTABLE_LEVELS is set.
> > > + * So place dtb 512k above kernel image area.
> > > + */
> > The area above the kernel Image holds the BSS too, and from some
> > experiments I did a while back with an allyesconfig, it was possible to
> > have many megabytes of BSS.
> > While 512k might be adequate for a defconfig today, it will become less
> > so as time goes on.
> > For kernel Images post v3.17 you can and should read the Image header's
> > image_size field to figure out how much memory is needed from _text to
> > _end (i.e. all the memory the kernel will assume is available statically
> > and will happily clobber). For kernel Images prior to v3.17 the best
> > thing we can do is guess as you've done here, or place the DTB below the
> > kernel and page tables in the TEXT_OFFSET area; neither option is
> > particularly brilliant.
> I haven't looked into it yet, but booting.txt says that the dtb must be
> 'within the first 512 megabytes from the start of the kernel image'. If
> this restriction still holds we can't just put the dtb at
> text_offset + image_size.
Isn't that only a problem if text_offset + image_size is huge (510MB+)?
The wording in booting.txt doesn't sound quite right. As I understand
it, the 512MB restriction is because of the way we map the dtb in the
swapper page tables.
So a better wording would be "the kernel and DTB must be placed in the
same naturally-aligned 512MB region of memory".
It should be possible to get rid of the restrictions on the placement of
the image and DTB, but this requires reworking the VA layout (using a
kernel text mapping separate from the linear map as with x86_64, and
similarly having a separate DTB mapping), and unfortunately I haven't
had the time to do that.
More information about the linux-arm-kernel