linaro-uboot: device tree without ramdisk and boot_relocate_fdt cause illegal memory access in kernel
Barry Song
21cnbao at gmail.com
Sun May 29 00:54:53 EST 2011
hi Shawn,
thanks a lot.
-barry
2011/5/27 Shawn Guo <shawn.guo at freescale.com>:
> On Fri, May 27, 2011 at 04:52:38PM +0800, Barry Song wrote:
>> Hi all,
>> i am using linaro uboot(u-boot-linaro-stable.git). i have let our
>> prima2 board support device tree with some workaround in uboot. two
>> problems i have meet:
>> 1. device tree without ramdisk
>> now uboot used commands like
>> "bootm kernel_address ramdisk_address dtb_address"
>> to start linux kernel.
>> in many cases, people have no ramdisk at all, but the following codes
>> will still stop people to use device tree to start kernel since it got
>> an illegal ramdisk:
>>
>> common/cmd_bootm.c:
>> if (((images.os.type == IH_TYPE_KERNEL) ||
>> (images.os.type == IH_TYPE_MULTI)) &&
>> (images.os.os == IH_OS_LINUX)) {
>> /* find ramdisk */
>> ret = boot_get_ramdisk (argc, argv, &images, IH_INITRD_ARCH,
>> &images.rd_start, &images.rd_end);
>> if (ret) {
>> puts ("Ramdisk image is corrupt or invalid\n");
>> return 1;
>> }
>>
>> #if defined(CONFIG_OF_LIBFDT)
>> /* find flattened device tree */
>> ret = boot_get_fdt (flag, argc, argv, &images,
>> &images.ft_addr, &images.ft_len);
>> if (ret) {
>> puts ("Could not find a valid device tree\n");
>> return 1;
>> }
>> then i delete the first return 1 to let uboot ignore the ramdisk checking.
>>
>> 2. boot_relocate_fdt in common/image.c
>> this function will relocate fdt to an new address by:
>> lmb_alloc_base(lmb, of_len, 0x1000, getenv_bootm_mapsize() + getenv_bootm_low())
>>
>> but the return address is probably not in the initilized scale which
>> kernel will build mapping in head.S. then in the function
>> setup_machine_fdt() of arch/arm/kernel/devtree.c, when executing:
>> devtree = phys_to_virt(dt_phys);
>>
>> /* check device tree validity */
>> if (be32_to_cpu(devtree->magic) != OF_DT_HEADER)
>> return NULL;
>> kernel will die due to illegal memory access since dt_phys was not
>> mapped to virtual address yet.
>>
>> For problem1 , could uboot have a way to ignore ramdisk by itself?
>> since we need 3 param in bootm to support device tree. For problem2,
>
> bootm kernel_address - dtb_address
>
> Use '-' for ramdisk address, if you do not have a ramdisk image.
>
>> could uboot just relocate fdt to the original address of old ATAG,
>> OFF+ 0x100?
>>
> Do you have the following commit on your kernel tree?
>
> commit 4d901c4271951d110afb13ee9aa73d27a6c8e53d
> Author: Rob Herring <rob.herring at calxeda.com>
> Date: Wed Feb 2 16:33:17 2011 +0100
>
> ARM: 6648/1: map ATAGs when not in first 1MB of RAM
>
> If ATAGs or DTB pointer is not within first 1MB of RAM, then the boot params
> will not be mapped early enough, so map the 1MB region that r2 points to. Only
> map the first 1MB when r2 is 0.
>
> Some assembly improvements from Nicolas Pitre.
>
> Acked-by: Tony Lindgren <tony at atomide.com>
> Acked-by: Nicolas Pitre <nicolas.pitre at linaro.org>
> Signed-off-by: Rob Herring <rob.herring at calxeda.com>
> Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
>
> You can get it from linux-linaro-2.6.38 tree.
>
> --
> Regards,
> Shawn
>
More information about the devicetree-discuss
mailing list