[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