[U-Boot] Can not boot Linux with new FIT image on ARMv8

Duxiaoqiang duxiaoqiang at huawei.com
Tue Jul 29 11:04:11 CEST 2014


Hi All:

I am trying to make use of verified Uboot on ARMv8 FVP platform.
I setup environment followed the below procedure, but failed after entered Linux kernel.
There was nothing prompt information except "Starting kernel".
Operation procedure as bellow:

1)  Add CONFIG_OF_CONTROL/CONFIG_RSA/CONFIG_FIT_SIGNATURE/CONFIG_FIT/CONFIG_OF_SEPARATE to vexpress_aemv8a.h

2)       Generate RSA keys use openssl tool

3)  Create a kernel.its file that used to build the FIT image

/ {

description = "Chrome OS kernel image with one or more FDT blobs";

#address-cells = <1>;



images {

           kernel at 1 {

         description = "kernel image";

                    data = /incbin/("Image.gz");

                    type = "kernel_noload";

                    arch = "arm64";

                    os = "linux";

                    compression = "gzip";

                    load = <0x89000000>;

                    entry = <0x89000000>;

                    kernel-version = <1>;

                    signature at 1 {

                             algo = "sha1,rsa2048";

                             key-name-hint = "dev";

                    };

           };

           fdt at 1 {

                    description = "fdb blob";

                    data = /incbin/("atf_psci.dtb");

                    type = "flat_dt";

                    arch = "arm64";

                    compression = "none";

                    fdt-version = <1>;

                    signature at 1 {

                             algo = "sha1,rsa2048";

                             key-name-hint = "dev";

                    };

           };

     ramsidk at 1 {

         description="ramdisk";

         data = /incbin/("filesystem.cpio.gz");

         type = "ramdisk";

                    arch = "arm64";

                    os = "linux";

                    compression = "gzip";

                    load = <0xaa000000>;

                    entry = <0xaa000000>;

                    signature at 1 {

                             algo = "sha1,rsa2048";

                             key-name-hint = "dev";

                    };

     };

};

configurations {

           default = "conf at 1";

           conf at 1 {

                    kernel = "kernel at 1";

                    fdt = "fdt at 1";

         ramdisk = "ramdisk at 1";

           };

};

};



4)  Get the Image.gz and atf_psci.dtb and ramdisk file(These images and device tree blob files are verified before with old uImage format, and they are ok)

5)  Build Uboot enanbled FDT:

# make vexpress_aemv8a_config

# make CROSS_COMPILE=<> DEVICE_TREE=atf_psci all

Before compile, CONFIG_OF_SEPARATE has been added to vexpress_aemv8a.h; Also atf_psci.dts file was added to arch/arm/dts directory.

After build , u-boot-dtb.bin file was generated.
6)  Build and signed FIT image as:

   # cp atf_psco.dtb atf_psci_public.dtb

# mkimage -D "-I dts -O dtb -p 2000" -F -f kernel.its -k "key" -K atf_psci_public.dtb -r image.fit
7)  Build FDT uboot with public key
# make CROSS_COMPILE=<> EXT_DTB=/WORK/atf_psci_public.dtb
And public key attached u-boot-dtb.bin file was generated.
8)  Load FIT image image.fit to address 0xc3000004 on Foundation

The images are verified successful, however system hangs after enter Linux.
I debugged Linux kernel with console output, and found that before function start_kernel be called it is normal.
(After __turn_mmu_on function on kernel, the MMU was enabled, and my console output is invalid for not been mapped. So my debug was stopped before start_kernel. But I believe there is no obstacle between __turn_mmu_on function and start_kernel function).
And also, I checked the input parameter fdt_blob for kernel, the address seems normal.

This problem has confused me several days, I will appreciated if you can give me susggestions.
Logs are bellow.
=====================Logs are bellow===================
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Booting trusted firmware boot loader stage 1
Built : 10:44:52, Jul 29 2014
Booting trusted firmware boot loader stage 2
BL2 Built : 10:44:54, Jul 29 2014
Booting trusted firmware boot loader stage 3
BL31 Built : 10:44:56, Jul 29 2014
BL33 image pc = 0x88000000

U-Boot 2014.07-rc4 (Jul 29 2014 - 10:43:19) vexpress_aemv8a

U-Boot code: 88000000 -> 88039BF0  BSS: -> 8806FB00
monitor len: 0006FB00
ramsize: 78000000
Top of RAM usable for U-Boot at: 100000000
Reserving 446k for U-Boot at: fff90000
Reserving 136k for malloc() at: fff6e000
Reserving 56 Bytes for Board Info at: fff6dfc8
Reserving 264 Bytes for Global Data at: fff6dec0
Reserving 11936 Bytes for FDT at: fff6b020
New Stack Pointer is: fff6b020
RAM Configuration:
Bank #0: 88000000 1.9 GiB
relocation Offset is: 77f90000
monitor flash len: 00039BF0
Now running in RAM - U-Boot at: fff90000
fdtdec_get_config_int: load-environment
Using default environment

Destroy Hash Table: 00000000fffc3b00 table = 0000000000000000
Create Hash Table: N=91
INSERT: table 00000000fffc3b00, filled 1/97 rv 00000000fff6e220 ==> name="bootargs" value="console=ttyAMA0 root=/dev/ram0"
INSERT: table 00000000fffc3b00, filled 2/97 rv 00000000fff6e6f8 ==> name="bootcmd" value="bootm $kernel_addr $initrd_addr:$initrd_size $fdt_addr"
INSERT: table 00000000fffc3b00, filled 3/97 rv 00000000fff6e338 ==> name="baudrate" value="115200"
INSERT: table 00000000fffc3b00, filled 4/97 rv 00000000fff6ea90 ==> name="kernel_addr" value="0x200000"
INSERT: table 00000000fffc3b00, filled 5/97 rv 00000000fff6e6d0 ==> name="initrd_addr" value="0xa00000"
INSERT: table 00000000fffc3b00, filled 6/97 rv 00000000fff6e1d0 ==> name="initrd_size" value="0x2000000"
INSERT: table 00000000fffc3b00, filled 7/97 rv 00000000fff6e1f8 ==> name="fdt_addr" value="0x100000"
INSERT: table 00000000fffc3b00, filled 8/97 rv 00000000fff6ec70 ==> name="fdt_high" value="0xa0000000"
INSERT: free(data = 00000000fff6e010)
INSERT: done
In:    serial
Out:   serial
Err:   serial
Initial value for argc=3
Final value for argc=3
Initial value for argc=3
Final value for argc=3
Initial value for argc=3
Final value for argc=3
Net:   Initial value for argc=3
Final value for argc=3
SMC91111-0
Warning: failed to set MAC address

Warning: Your board does not use generic board. Please read
doc/README.generic-board and take action. Boards not
upgraded by the late 2014 may break or be removed.
fdtdec_get_config_int: bootdelay
### main_loop entered: bootdelay=-1

fdtdec_get_config_int: kernel-offset
fdtdec_get_config_int: rootdisk-offset
fdtdec_get_config_string: bootcmd
fdtdec_get_config_int: bootsecure
### main_loop: bootcmd="bootm $kernel_addr $initrd_addr:$initrd_size $fdt_addr"
VExpress64# printenv bootargs
bootargs=console=ttyAMA0 root=/dev/ram0
VExpress64# bootm 0xc3000004
## Current stack ends at 0xfff6ac80 *  kernel: cmdline image address = 0xc3000004
## Loading kernel from FIT Image at c3000004 ...
No configuration specified, trying default...
Found default configuration: 'conf at 1'
   Using 'conf at 1' configuration
   Verifying Hash Integrity ... fit_config_check_sig: fdt=00000000fff6b020, conf='signature at 1', sig='key-dev'
sha1,rsa2048:devHash nodes (6):
   '/'
   '/configurations/conf at 1'
   '/images/fdt at 1'
   '/images/fdt at 1/hash at 1'
   '/images/kernel at 1'
   '/images/kernel at 1/hash at 1'
Hash regions:
    Offset       Size
        38         a0
    2b241c         ec
    2b3fa8         94
  1859a7a8         18
  1859a7d4         60
  1859aa48         14
  1859aa5c         e0
fdtdec_get_int: rsa,num-bits: 0x800 (2048)
fdtdec_get_int: rsa,n0-inverse: 0x259912c1 (630788801)
key length 64
Checksum algorithm: sha1+ OK
   Trying 'kernel at 1' kernel subimage
     Description:  linux kernel image
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0xc30000e8
     Data Size:    2827062 Bytes = 2.7 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0x89000000
     Entry Point:  0x89000000
     Hash node:    'hash at 1'
     Hash algo:    sha1
     Hash value:   402de3d5fd74c0de7dc997097a3b45474a659cde
     Hash len:     20
   Verifying Hash Integrity ... sha1+ OK
      kernel data at 0xc30000e8, len = 0x002b2336 (2827062)
*  ramdisk: using config 'conf at 1' from image at 0xc3000004
## Loading ramdisk from FIT Image at c3000004 ...
   Using 'conf at 1' configuration
   Trying 'ramdisk at 1' ramdisk subimage
     Description:  RAMDISK Image
     Type:         RAMDisk Image
     Compression:  gzip compressed
     Data Start:   0xc32b4078
     Data Size:    405694073 Bytes = 386.9 MiB
     Architecture: AArch64
     OS:           Linux
     Load Address: 0xaa000000
     Entry Point:  0xaa000000
     Hash node:    'hash at 1'
     Hash algo:    sha1
     Hash value:   cfc58f934035c7bf52109283be7cdbdb8d6c1640
     Hash len:     20
   Verifying Hash Integrity ... sha1+ OK
   ramdisk start = 0xc32b4078, ramdisk end = 0xdb59a6f1
*  fdt: using config 'conf at 1' from image at 0xc3000004
## Checking for 'FDT'/'FDT Image' at c3000004
## Loading fdt from FIT Image at c3000004 ...
   Using 'conf at 1' configuration
   Trying 'fdt at 1' fdt subimage
     Description:  FDT blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0xc32b2518
     Data Size:    6802 Bytes = 6.6 KiB
               Architecture: AArch64
     Hash node:    'hash at 1'
     Hash algo:    sha1
     Hash value:   10550f02e9ebd95db9dc257625dc42b7bb2295c9
     Hash len:     20
   Verifying Hash Integrity ... sha1+ OK
Can't get 'load' property from FIT 0xc3000004, node: offset 2827436, name fdt at 1 (FDT_ERR_NOTFOUND)
   Booting using the fdt blob at 0xc32b2518
   of_flat_tree at 0xc32b2518 size 0x00001a92
Initial value for argc=3
Final value for argc=3
   Uncompressing Kernel Image ... OK
   kernel loaded at 0x89000000, end = 0x895a0338
using----------------: FDT
fdt address is 00000000c32b2518
boot_fdt_add_mem_rsv
fdt_blob = 00000000c32b2518
fdt_check_header
fdt_num_mem_rsv
fdt_rsv_mem_addr = 00000000c32b2540
total = 1
fdt_get_mem_rsv index_0
addr = 00000000c32b2540
   reserving fdt memory region: addr=80000000 size=10000
boot_get_cmdline
boot_ramdisk_high
## initrd_high = 0xffffffffffffffff, copy_to_ram = 1
   Loading Ramdisk from c32b4078 to e7c83000, end fff69679 ... OK
   ramdisk load start = 0xe7c83000, ramdisk load end = 0xfff69679
boot_relocate_fdt
   Loading Device Tree to 000000009fe00000, end 000000009fe04a91 ... fdt_rsv_mem_addr = 00000000c32b2540
OK
Initial value for argc=3
Final value for argc=3
image_setup_libfdt
No ethernet MAC Address defined
## Transferring control to Linux (at address 89000000)...
## Fdt: 9fe00000

Starting kernel ...

"345678P9 at AB    <-----(PS: These information are added by me in Linux kernel)



More information about the U-Boot mailing list