[Linaro-acpi] Touching the initrd before paging_init
Mark Rutland
mark.rutland at arm.com
Tue Dec 15 02:22:21 PST 2015
On Mon, Dec 14, 2015 at 11:51:09PM -0500, Jon Masters wrote:
> Addendum. I was able to get the initrd based ACPI table override
> working...HOWEVER...
>
> *** I had to implement a custom memcpy routine to do so ***
>
> Per some internal suggestions, I tried moving map_mem earlier (prior to
> doing boot time ACPI table parsing, in order to avoid needing to abuse
> fixmaps to touch the initrd contents), which works. For reading the
> ramdisk cpio content (the kernel code still uses a fixmap in the initrd
> override driver code to map the newly created tables in memory).
>
> But the reading of that cpio content into the new table locations is
> done using the kernel memcpy routine to early_ioremap'd memory (Device
> memory), which is architecturally sensitive to missaligned accesses. The
> in-kernel memcpy routine only checks the alignment of the source pointed
> when it begins copying, and doesn't handle the case that the natural
> alignment differs between source and destination. Therefore, the kernel
> rolls over and plays dead unless I provide a hacked up jcm_memcpy that
> just does byte copies. Then everything "works".
You don't need a custom memcpy. All you need to do is use
early_memremap, as we do for relocate_initrd, to get a Normal Cacheable
mapping. See:
setup_arch()
relocate_initrd()
copy_from_early_mem()
early_memremap()
memcpy()
early_memunmap()
Mark.
More information about the linux-arm-kernel
mailing list