From 58abb0fde4e80227af85ecfb8a284d7d1bdf2e96 Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Wed, 19 Jun 2019 13:10:08 -0700 Subject: Import new changes: edit device tree at runtime from uboot Signed-off-by: Stefano Stabellini --- docker-extras/imagebuilder_run | 154 ++++++++++++++--------------------------- 1 file changed, 51 insertions(+), 103 deletions(-) (limited to 'docker-extras/imagebuilder_run') diff --git a/docker-extras/imagebuilder_run b/docker-extras/imagebuilder_run index df2441b..ab0cbe4 100644 --- a/docker-extras/imagebuilder_run +++ b/docker-extras/imagebuilder_run @@ -1,132 +1,79 @@ #!/bin/bash offset=$((2*1024*1024)) +filesize=0 function add_device_tree_kernel() { - local addr=$1 - local size=$2 - - echo " module@$addr {" >> $temp - echo " compatible = \"multiboot,kernel\", \"multiboot,module\";" >> $temp - echo " reg = <0x0 "$addr" 0x0 "$size">;" >> $temp - echo " bootargs = \"console=ttyAMA0\";" >> $temp - echo " };" >> $temp + local path=$1 + local addr=$2 + local size=$3 + + echo "fdt mknod $path module$addr" >> $UBOOT_SOURCE + echo "fdt set $path/module$addr compatible \"multiboot,kernel\" \"multiboot,module\"" >> $UBOOT_SOURCE + echo "fdt set $path/module$addr reg <0x0 "$addr" 0x0 "$size">" >> $UBOOT_SOURCE + echo "fdt set $path/module$addr bootargs \"console=ttyAMA0\"" >> $UBOOT_SOURCE } function add_device_tree_ramdisk() { - local addr=$1 - local size=$2 + local path=$1 + local addr=$2 + local size=$3 - echo " module@$addr {" >> $temp - echo " compatible = \"multiboot,ramdisk\", \"multiboot,module\";" >> $temp - echo " reg = <0x0 "$addr" 0x0 "$size">;" >> $temp - echo " };" >> $temp + echo "fdt mknod $path module$addr" >> $UBOOT_SOURCE + echo "fdt set $path/module$addr compatible \"multiboot,ramdisk\" \"multiboot,module\"" >> $UBOOT_SOURCE + echo "fdt set $path/module$addr reg <0x0 "$addr" 0x0 "$size">" >> $UBOOT_SOURCE } function add_device_tree_passthrough() { - local addr=$1 - local size=$2 + local path=$1 + local addr=$2 + local size=$3 - echo " module@$addr {" >> $temp - echo " compatible = \"multiboot,device-tree\", \"multiboot,module\";" >> $temp - echo " reg = <0x0 "$addr" 0x0 "$size">;" >> $temp - echo " };" >> $temp + echo "fdt mknod $path module$addr" >> $UBOOT_SOURCE + echo "fdt set $path/module$addr compatible \"multiboot,device-tree\" \"multiboot,module\"" >> $UBOOT_SOURCE + echo "fdt set $path/module$addr reg <0x0 "$addr" 0x0 "$size">" >> $UBOOT_SOURCE } -function add_device_tree() +function device_tree_editing() { - local i=0 - local filename=$1 - - echo " #address-cells = <0x2>;" >> $temp - echo " #size-cells = <0x2>;" >> $temp - echo " xen,xen-bootargs = \"console=dtuart dtuart=serial0 dom0_mem=700M dom0_max_vcpus=1 bootscrub=0 serrors=forward vwfi=native sched=null\";" >> $temp - echo " dom0 {" >> $temp - echo " compatible = \"xen,linux-zimage\", \"xen,multiboot-module\";" >> $temp - echo " reg = <0x0 "$dom0_kernel_addr" 0x0 "$dom0_kernel_size">;" >> $temp - echo " bootargs = \"console=hvc0 earlycon=xen earlyprintk=xen\";" >> $temp - echo " };" >> $temp - + local device_tree_addr=$1 + + echo "fdt addr $device_tree_addr" >> $UBOOT_SOURCE + echo "fdt resize" >> $UBOOT_SOURCE + echo "fdt set /chosen \#address-cells <0x2>" >> $UBOOT_SOURCE + echo "fdt set /chosen \#size-cells <0x2>" >> $UBOOT_SOURCE + echo "fdt set /chosen xen,xen-bootargs \"console=dtuart dtuart=serial0 dom0_mem=700M dom0_max_vcpus=1 bootscrub=0 serrors=forward vwfi=native sched=null\"" >> $UBOOT_SOURCE + echo "fdt mknod /chosen dom0" >> $UBOOT_SOURCE + echo "fdt set /chosen/dom0 compatible \"xen,linux-zimage\" \"xen,multiboot-module\"" >> $UBOOT_SOURCE + echo "fdt set /chosen/dom0 reg <0x0 "$dom0_kernel_addr" 0x0 "$dom0_kernel_size">" >> $UBOOT_SOURCE + echo "fdt set /chosen/dom0 bootargs \"console=hvc0 earlycon=xen earlyprintk=xen\"" >> $UBOOT_SOURCE + + i=0 while test $i -lt $NUM_DOMUS do - echo " domU$i {" >> $temp - echo " compatible = \"xen,domain\";" >> $temp - echo " #address-cells = <0x2>;" >> $temp - echo " #size-cells = <0x2>;" >> $temp - echo " memory = <0x0 0x20000>;" >> $temp - echo " cpus = <0x1>;" >> $temp - echo " vpl011;" >> $temp - add_device_tree_kernel ${domU_kernel_addr[$i]} ${domU_kernel_size[$i]} + echo "fdt mknod /chosen domU$i" >> $UBOOT_SOURCE + echo "fdt set /chosen/domU$i compatible \"xen,domain\"" >> $UBOOT_SOURCE + echo "fdt set /chosen/domU$i \#address-cells <0x2>" >> $UBOOT_SOURCE + echo "fdt set /chosen/domU$i \#size-cells <0x2>" >> $UBOOT_SOURCE + echo "fdt set /chosen/domU$i memory <0x0 0x40000>" >> $UBOOT_SOURCE + echo "fdt set /chosen/domU$i cpus <0x1>" >> $UBOOT_SOURCE + echo "fdt set /chosen/domU$i vpl011 <0x1>" >> $UBOOT_SOURCE + add_device_tree_kernel "/chosen/domU$i" ${domU_kernel_addr[$i]} ${domU_kernel_size[$i]} if test "${domU_ramdisk_addr[$i]}" then - add_device_tree_ramdisk ${domU_ramdisk_addr[$i]} ${domU_ramdisk_size[$i]} + add_device_tree_ramdisk "/chosen/domU$i" ${domU_ramdisk_addr[$i]} ${domU_ramdisk_size[$i]} fi if test "${domU_passthrough_dtb_addr[$i]}" then - add_device_tree_passthrough ${domU_passthrough_dtb_addr[$i]} ${domU_passthrough_dtb_size[$i]} + add_device_tree_passthrough "/chosen/domU$i" ${domU_passthrough_dtb_addr[$i]} ${domU_passthrough_dtb_size[$i]} fi - echo " };" >> $temp i=$(( $i + 1 )) done } -function filter_device_tree() -{ - local filename_dtb=$1 - local filename_dts="`basename -s .dtb $filename_dtb`".dts - local temp=`mktemp` - - local skip=0 - local chosen=0 - - mv -f $filename_dts "$filename_dts".bak &> /dev/null - dtc -I dtb -O dts $filename_dtb > $filename_dts 2>/dev/null - - while IFS= read -r line - do - if [[ $line == *"chosen"* ]] - then - chosen=1 - fi - if [[ $chosen -eq 1 && ($line == *"address-cells"* || $line == *"size-cells"*) ]] - then - continue - fi - if [[ $line == *"dom0"* || $line == *"domU"* ]] - then - skip=1 - continue - fi - if [[ $skip -eq 1 && $line == *"{"* ]] - then - skip=2 - fi - if [[ $skip -gt 0 && $line == *"};"* ]] - then - skip=$(( $skip - 1 )) - continue - fi - if [[ $chosen -eq 1 && $skip -eq 0 && $line == *"};"* ]] - then - chosen=0; - add_device_tree - fi - - if [[ $skip -eq 0 ]] - then - echo "$line" >> $temp - fi - - done < $filename_dts - - mv -f $filename_dtb "$filename_dtb".bak - dtc -I dts -O dtb $temp > $filename_dtb 2>/dev/null - mv $temp $filename_dts -} - function add_size() { local filename=$1 @@ -134,6 +81,7 @@ function add_size() memaddr=$(( $memaddr + $size + $offset - 1)) memaddr=$(( $memaddr & ~($offset - 1) )) memaddr=`printf "0x%X\n" $memaddr` + filesize=$size } function load_file() @@ -207,28 +155,28 @@ do check_compressed_file_type ${DOMU_KERNEL[$i]} "MS-DOS executable" domU_kernel_addr[$i]=$memaddr load_file ${DOMU_KERNEL[$i]} - domU_kernel_size[$i]=$(( $memaddr - ${domU_kernel_addr[$i]} )) + domU_kernel_size[$i]=$filesize if test "${DOMU_RAMDISK[$i]}" then check_compressed_file_type ${DOMU_RAMDISK[$i]} "cpio archive" domU_ramdisk_addr[$i]=$memaddr load_file ${DOMU_RAMDISK[$i]} - domU_ramdisk_size[$i]=$(( $memaddr - ${domU_ramdisk_addr[$i]} )) + domU_ramdisk_size[$i]=$filesize fi if test "${DOMU_PASSTHROUGH_DTB[$i]}" then check_compressed_file_type ${DOMU_PASSTHROUGH_DTB[$i]} "Device Tree Blob" domU_passthrough_dtb_addr[$i]=$memaddr load_file ${DOMU_PASSTHROUGH_DTB[$i]} - domU_passthrough_dtb_size[$i]=$(( $memaddr - ${domU_passthrough_dtb_addr[$i]} )) + domU_passthrough_dtb_size[$i]=$filesize fi i=$(( $i + 1 )) done check_file_type $DEVICE_TREE "Device Tree Blob" -filter_device_tree $DEVICE_TREE device_tree_addr=$memaddr load_file $DEVICE_TREE +device_tree_editing $device_tree_addr memaddr=$(( $MEMORY_END - $memaddr )) if test $memaddr -lt 0 @@ -239,7 +187,7 @@ fi echo "bootm $xen_addr $dom0_ramdisk_addr $device_tree_addr" >> $UBOOT_SOURCE -memaddr=$(( $memaddr + $offset )) +memaddr=$(( $memaddr + $offset + $offset )) memaddr=`printf "0x%X\n" $memaddr` uboot_addr="$memaddr" mkimage -A arm64 -T script -C none -a $uboot_addr -e $uboot_addr -d $UBOOT_SOURCE "$UBOOT_SCRIPT" &> /dev/null -- cgit v1.2.3