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