From b7bde6942c2db1c213c09fd0bcf85d44c27afe0d Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Mon, 21 Oct 2019 15:32:21 -0700 Subject: Rename docker-extras to scripts Signed-off-by: Stefano Stabellini --- Dockerfile.image | 2 +- docker-extras/disk_image | 134 -------------------------- docker-extras/imagebuilder_sd | 10 -- docker-extras/imagebuilder_tftp | 9 -- docker-extras/uboot-script-gen | 209 ---------------------------------------- scripts/disk_image | 134 ++++++++++++++++++++++++++ scripts/imagebuilder_sd | 10 ++ scripts/imagebuilder_tftp | 9 ++ scripts/uboot-script-gen | 209 ++++++++++++++++++++++++++++++++++++++++ 9 files changed, 363 insertions(+), 363 deletions(-) delete mode 100755 docker-extras/disk_image delete mode 100644 docker-extras/imagebuilder_sd delete mode 100644 docker-extras/imagebuilder_tftp delete mode 100644 docker-extras/uboot-script-gen create mode 100755 scripts/disk_image create mode 100644 scripts/imagebuilder_sd create mode 100644 scripts/imagebuilder_tftp create mode 100644 scripts/uboot-script-gen diff --git a/Dockerfile.image b/Dockerfile.image index 4b57f7b..43318ae 100644 --- a/Dockerfile.image +++ b/Dockerfile.image @@ -8,7 +8,7 @@ FROM zynqmp-dom2-package AS zynqmp-dom2-package FROM alpine:3.9 COPY [ \ - "./docker-extras/*", \ + "./scripts/*", \ "/tmp/docker-build/" \ ] COPY config /tmp/docker-build/ diff --git a/docker-extras/disk_image b/docker-extras/disk_image deleted file mode 100755 index 57b933f..0000000 --- a/docker-extras/disk_image +++ /dev/null @@ -1,134 +0,0 @@ -#!/bin/bash - -# This helps to see what is going on -set -e -x - -# Used to maintain intermediary state. (Not currently used) -DESTDIR="$(mktemp -d /tmp/imagebuilder-zynqmp.XXXXXX)" -UBOOT_OUT="/tmp/output" -OUTDIR="/tmp/img" -mkdir ${OUTDIR} - -IMG="${OUTDIR}/zynqmp.img" - -. config - -offset=$((2*1024*1024)) -_part1_size=`stat --printf="%s" $UBOOT_OUT/$XEN` -_part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/$DOM0_KERNEL` )) -_part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/$DEVICE_TREE` )) -i=0 -while test $i -lt $NUM_DOMUS -do - _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_KERNEL[$i]}` )) - if test "${DOMU_RAMDISK[$i]}" - then - _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_RAMDISK[$i]}` )) - fi - if test "${DOMU_PASSTHROUGH_DTB[$i]}" - then - _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_PASSTHROUGH_DTB[$i]}` )) - fi - i=$(( $i + 1 )) -done - -# add 16 MB slack -_part1_size=$(( $_part1_size + 16777216 )) -_part1_size=$(( $_part1_size + $offset - 1)) -_part1_size=$(( $_part1_size & ~($offset - 1) )) -_part1_size=$(( $_part1_size / 1024 / 1024 )) -echo PART1 size: "$_part1_size"MB - -if test "$DOM0_RAMDISK" -then - _part2_size=`stat --printf="%s" $UBOOT_OUT/$DOM0_RAMDISK` -fi -_part2_size=$(( $_part2_size + $offset - 1)) -_part2_size=$(( $_part2_size & ~($offset - 1) )) -# account for gzip compression -_part2_size=$(( $_part2_size * 2 )) -# add some slack -_part2_size=$(( 128*1024*1024 + $_part2_size )) -_part2_size=$(( $_part2_size / 1024 / 1024 )) -echo PART2 size: "$_part2_size"MB - - -_sector_size=512 -# _sector_first_start needs to be aligned to 2048 -_sector_first_start=2048 -_sector_first_end=$(( $_part1_size * 1024 * 1024 / $_sector_size + $_sector_first_start - 1)) -_sector_second_start=$(( $_sector_first_end + 1 )) -_sector_second_end=$(( $_part2_size * 1024 * 1024 / $_sector_size + $_sector_second_start - 1)) -_tot_size=$(( $_part1_size + $_part2_size + 16 )) - -# NOTE: Increase vos_a to 256 to accomodate rootfs -# 528 MiB (256 + 256 + 16) -truncate $IMG -s "$_tot_size"M - -# create GPT partition table -sgdisk -og $IMG - -sgdisk -n 1:$_sector_first_start:$_sector_first_end -c 1:"Linux1" -t 1:8300 $IMG -sgdisk -n 2:$_sector_second_start:$_sector_second_end -c 2:"Linux2" -t 2:8300 $IMG - -# find the first available loop device -_loop_dev=$(losetup -f) - -# attach loopback device to $IMG -losetup $_loop_dev $IMG - -_disksize=$(blockdev --getsize $_loop_dev) - -dmsetup create diskimage --table "0 $_disksize linear $_loop_dev 0" - -# ensure that /dev/mapper/diskimage exists -while [ ! -b /dev/mapper/diskimage ] -do - sleep 2 -done - -kpartx -a /dev/mapper/diskimage - -# ensure that /dev/mapper/{diskimage1,diskimage2} exists -while [ ! -b /dev/mapper/diskimage1 ] || [ ! -b /dev/mapper/diskimage2 ] -do - sleep 2 -done - -# format vos_a partition -mkfs.ext4 -L vos_a -F /dev/mapper/diskimage1 - -# format vos_b partition -mkfs.ext4 -L vos_b -F /dev/mapper/diskimage2 - - -# create mount point and mount disk2 -mkdir -p ${DESTDIR}/part/disk2 -mount -t ext4 /dev/mapper/diskimage2 $DESTDIR/part/disk2 - -# Extract rootfs cpio archive into `.../part/vos_a` -cd ${DESTDIR}/part/disk2 -cat ${UBOOT_OUT}/dom0-ramdisk.cpio | gunzip | cpio -id -mv ${UBOOT_OUT}/dom0-ramdisk.cpio* /tmp - -# umount -sync -cd / -umount $DESTDIR/part/disk2 - -# create mount point and mount disk1 -mkdir -p ${DESTDIR}/part/disk1 -mount -t ext4 /dev/mapper/diskimage1 $DESTDIR/part/disk1 - -# copy over files needed -cp -r $UBOOT_OUT/* ${DESTDIR}/part/disk1/ - -# unmount -sync -# This fails for some reason. It could work now because we are not using qemu-user -# fstrim $DESTDIR/part/disk1 -umount $DESTDIR/part/disk1 - -kpartx -d /dev/mapper/diskimage -dmsetup remove diskimage -losetup -d $_loop_dev diff --git a/docker-extras/imagebuilder_sd b/docker-extras/imagebuilder_sd deleted file mode 100644 index 0afa75f..0000000 --- a/docker-extras/imagebuilder_sd +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -rm -rf /tmp/output -mkdir /tmp/output -cp config /tmp/output -cp -r /home/builder/output/* /tmp/output -cd /tmp/output -export LOAD_CMD="load scsi 0:1" -bash /uboot-script-gen -bash /disk_image diff --git a/docker-extras/imagebuilder_tftp b/docker-extras/imagebuilder_tftp deleted file mode 100644 index c03633d..0000000 --- a/docker-extras/imagebuilder_tftp +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -rm -rf /tmp/output -mkdir /tmp/output -cp config /tmp/output -cp -r /home/builder/output/* /tmp/output -cd /tmp/output -export LOAD_CMD="tftpb" -bash /uboot-script-gen diff --git a/docker-extras/uboot-script-gen b/docker-extras/uboot-script-gen deleted file mode 100644 index e72f73e..0000000 --- a/docker-extras/uboot-script-gen +++ /dev/null @@ -1,209 +0,0 @@ -#!/bin/bash - -offset=$((2*1024*1024)) -filesize=0 - -function add_device_tree_kernel() -{ - 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 path=$1 - local addr=$2 - local size=$3 - - 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 path=$1 - local addr=$2 - local size=$3 - - 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 device_tree_editing() -{ - local device_tree_addr=$1 - - echo "fdt addr $device_tree_addr" >> $UBOOT_SOURCE - echo "fdt resize 1024" >> $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 - if test "$LOAD_CMD" = "tftpb" - then - echo "fdt set /chosen xen,dom0-bootargs \"console=hvc0 earlycon=xen earlyprintk=xen root=/dev/ram0\"" >> $UBOOT_SOURCE - if test $dom0_ramdisk_addr != "-" - then - echo "fdt mknod /chosen dom0-ramdisk" >> $UBOOT_SOURCE - echo "fdt set /chosen/dom0-ramdisk compatible \"xen,linux-initrd\" \"xen,multiboot-module\"" >> $UBOOT_SOURCE - echo "fdt set /chosen/dom0-ramdisk reg <0x0 "$dom0_ramdisk_addr" 0x0 "$dom0_ramdisk_size">" >> $UBOOT_SOURCE - fi - else - echo "fdt set /chosen xen,dom0-bootargs \"console=hvc0 earlycon=xen earlyprintk=xen root=/dev/sda2\"" >> $UBOOT_SOURCE - fi - - i=0 - while test $i -lt $NUM_DOMUS - do - 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 "/chosen/domU$i" ${domU_ramdisk_addr[$i]} ${domU_ramdisk_size[$i]} - fi - if test "${domU_passthrough_dtb_addr[$i]}" - then - add_device_tree_passthrough "/chosen/domU$i" ${domU_passthrough_dtb_addr[$i]} ${domU_passthrough_dtb_size[$i]} - fi - i=$(( $i + 1 )) - done -} - -function add_size() -{ - local filename=$1 - local size=`stat --printf="%s" $filename` - memaddr=$(( $memaddr + $size + $offset - 1)) - memaddr=$(( $memaddr & ~($offset - 1) )) - memaddr=`printf "0x%X\n" $memaddr` - filesize=$size -} - -function load_file() -{ - local filename=$1 - - echo "$LOAD_CMD $memaddr $filename" >> $UBOOT_SOURCE - add_size $filename -} - -function check_file_type() -{ - local filename=$1 - local type="$2" - - file $filename | grep "$type" &> /dev/null - if test $? != 0 - then - echo Wrong file type "$filename". It shold be "$type". - fi -} - -function check_compressed_file_type() -{ - local filename=$1 - local type="$2" - - file $filename | grep "gzip compressed data" &> /dev/null - if test $? == 0 - then - local tmp=`mktemp` - cat $filename | gunzip > $tmp - filename=$tmp - fi - check_file_type $filename "$type" -} - -. config - -rm -f $UBOOT_SOURCE $UBOOT_SCRIPT -memaddr=$(( $MEMORY_START + $offset )) -# 12582912 is 0xc00000, 12MB -if test $memaddr -lt 12582912 -then - memaddr="12582912" -fi -memaddr=`printf "0x%X\n" $memaddr` -uboot_addr=$memaddr -# 2MB are enough for a uboot script -memaddr=$(( $memaddr + $offset )) -memaddr=`printf "0x%X\n" $memaddr` - -check_compressed_file_type $XEN "MS-DOS executable" -xen_addr=$memaddr -load_file "$XEN" - -check_compressed_file_type $DOM0_KERNEL "MS-DOS executable" -dom0_kernel_addr=$memaddr -load_file $DOM0_KERNEL -dom0_kernel_size=$filesize - -if test "$DOM0_RAMDISK" && [[ $LOAD_CMD = "tftpb" ]] -then - check_compressed_file_type $DOM0_RAMDISK "cpio archive" - dom0_ramdisk_addr=$memaddr - load_file "$DOM0_RAMDISK" - dom0_ramdisk_size=$filesize -else - dom0_ramdisk_addr="-" -fi - -i=0 -while test $i -lt $NUM_DOMUS -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]=$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]=$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]=$filesize - fi - i=$(( $i + 1 )) -done - -check_file_type $DEVICE_TREE "Device Tree Blob" -device_tree_addr=$memaddr -load_file $DEVICE_TREE -device_tree_editing $device_tree_addr - -# disable device tree reloation -echo "setenv fdt_high 0xffffffffffffffff" >> $UBOOT_SOURCE -echo "booti $xen_addr - $device_tree_addr" >> $UBOOT_SOURCE -mkimage -A arm64 -T script -C none -a $uboot_addr -e $uboot_addr -d $UBOOT_SOURCE "$UBOOT_SCRIPT" &> /dev/null - -memaddr=$(( $MEMORY_END - $memaddr - $offset )) -if test $memaddr -lt 0 -then - echo Error, not enough memory to load all binaries - exit 1 -fi - -echo "Generated uboot script $UBOOT_SCRIPT, to be loaded at address $uboot_addr:" -echo "$LOAD_CMD $uboot_addr $UBOOT_SCRIPT; source $uboot_addr" diff --git a/scripts/disk_image b/scripts/disk_image new file mode 100755 index 0000000..57b933f --- /dev/null +++ b/scripts/disk_image @@ -0,0 +1,134 @@ +#!/bin/bash + +# This helps to see what is going on +set -e -x + +# Used to maintain intermediary state. (Not currently used) +DESTDIR="$(mktemp -d /tmp/imagebuilder-zynqmp.XXXXXX)" +UBOOT_OUT="/tmp/output" +OUTDIR="/tmp/img" +mkdir ${OUTDIR} + +IMG="${OUTDIR}/zynqmp.img" + +. config + +offset=$((2*1024*1024)) +_part1_size=`stat --printf="%s" $UBOOT_OUT/$XEN` +_part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/$DOM0_KERNEL` )) +_part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/$DEVICE_TREE` )) +i=0 +while test $i -lt $NUM_DOMUS +do + _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_KERNEL[$i]}` )) + if test "${DOMU_RAMDISK[$i]}" + then + _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_RAMDISK[$i]}` )) + fi + if test "${DOMU_PASSTHROUGH_DTB[$i]}" + then + _part1_size=$(( $_part1_size + `stat --printf="%s" $UBOOT_OUT/${DOMU_PASSTHROUGH_DTB[$i]}` )) + fi + i=$(( $i + 1 )) +done + +# add 16 MB slack +_part1_size=$(( $_part1_size + 16777216 )) +_part1_size=$(( $_part1_size + $offset - 1)) +_part1_size=$(( $_part1_size & ~($offset - 1) )) +_part1_size=$(( $_part1_size / 1024 / 1024 )) +echo PART1 size: "$_part1_size"MB + +if test "$DOM0_RAMDISK" +then + _part2_size=`stat --printf="%s" $UBOOT_OUT/$DOM0_RAMDISK` +fi +_part2_size=$(( $_part2_size + $offset - 1)) +_part2_size=$(( $_part2_size & ~($offset - 1) )) +# account for gzip compression +_part2_size=$(( $_part2_size * 2 )) +# add some slack +_part2_size=$(( 128*1024*1024 + $_part2_size )) +_part2_size=$(( $_part2_size / 1024 / 1024 )) +echo PART2 size: "$_part2_size"MB + + +_sector_size=512 +# _sector_first_start needs to be aligned to 2048 +_sector_first_start=2048 +_sector_first_end=$(( $_part1_size * 1024 * 1024 / $_sector_size + $_sector_first_start - 1)) +_sector_second_start=$(( $_sector_first_end + 1 )) +_sector_second_end=$(( $_part2_size * 1024 * 1024 / $_sector_size + $_sector_second_start - 1)) +_tot_size=$(( $_part1_size + $_part2_size + 16 )) + +# NOTE: Increase vos_a to 256 to accomodate rootfs +# 528 MiB (256 + 256 + 16) +truncate $IMG -s "$_tot_size"M + +# create GPT partition table +sgdisk -og $IMG + +sgdisk -n 1:$_sector_first_start:$_sector_first_end -c 1:"Linux1" -t 1:8300 $IMG +sgdisk -n 2:$_sector_second_start:$_sector_second_end -c 2:"Linux2" -t 2:8300 $IMG + +# find the first available loop device +_loop_dev=$(losetup -f) + +# attach loopback device to $IMG +losetup $_loop_dev $IMG + +_disksize=$(blockdev --getsize $_loop_dev) + +dmsetup create diskimage --table "0 $_disksize linear $_loop_dev 0" + +# ensure that /dev/mapper/diskimage exists +while [ ! -b /dev/mapper/diskimage ] +do + sleep 2 +done + +kpartx -a /dev/mapper/diskimage + +# ensure that /dev/mapper/{diskimage1,diskimage2} exists +while [ ! -b /dev/mapper/diskimage1 ] || [ ! -b /dev/mapper/diskimage2 ] +do + sleep 2 +done + +# format vos_a partition +mkfs.ext4 -L vos_a -F /dev/mapper/diskimage1 + +# format vos_b partition +mkfs.ext4 -L vos_b -F /dev/mapper/diskimage2 + + +# create mount point and mount disk2 +mkdir -p ${DESTDIR}/part/disk2 +mount -t ext4 /dev/mapper/diskimage2 $DESTDIR/part/disk2 + +# Extract rootfs cpio archive into `.../part/vos_a` +cd ${DESTDIR}/part/disk2 +cat ${UBOOT_OUT}/dom0-ramdisk.cpio | gunzip | cpio -id +mv ${UBOOT_OUT}/dom0-ramdisk.cpio* /tmp + +# umount +sync +cd / +umount $DESTDIR/part/disk2 + +# create mount point and mount disk1 +mkdir -p ${DESTDIR}/part/disk1 +mount -t ext4 /dev/mapper/diskimage1 $DESTDIR/part/disk1 + +# copy over files needed +cp -r $UBOOT_OUT/* ${DESTDIR}/part/disk1/ + +# unmount +sync +# This fails for some reason. It could work now because we are not using qemu-user +# fstrim $DESTDIR/part/disk1 +umount $DESTDIR/part/disk1 + +kpartx -d /dev/mapper/diskimage +dmsetup remove diskimage +losetup -d $_loop_dev diff --git a/scripts/imagebuilder_sd b/scripts/imagebuilder_sd new file mode 100644 index 0000000..0afa75f --- /dev/null +++ b/scripts/imagebuilder_sd @@ -0,0 +1,10 @@ +#!/bin/bash + +rm -rf /tmp/output +mkdir /tmp/output +cp config /tmp/output +cp -r /home/builder/output/* /tmp/output +cd /tmp/output +export LOAD_CMD="load scsi 0:1" +bash /uboot-script-gen +bash /disk_image diff --git a/scripts/imagebuilder_tftp b/scripts/imagebuilder_tftp new file mode 100644 index 0000000..c03633d --- /dev/null +++ b/scripts/imagebuilder_tftp @@ -0,0 +1,9 @@ +#!/bin/bash + +rm -rf /tmp/output +mkdir /tmp/output +cp config /tmp/output +cp -r /home/builder/output/* /tmp/output +cd /tmp/output +export LOAD_CMD="tftpb" +bash /uboot-script-gen diff --git a/scripts/uboot-script-gen b/scripts/uboot-script-gen new file mode 100644 index 0000000..e72f73e --- /dev/null +++ b/scripts/uboot-script-gen @@ -0,0 +1,209 @@ +#!/bin/bash + +offset=$((2*1024*1024)) +filesize=0 + +function add_device_tree_kernel() +{ + 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 path=$1 + local addr=$2 + local size=$3 + + 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 path=$1 + local addr=$2 + local size=$3 + + 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 device_tree_editing() +{ + local device_tree_addr=$1 + + echo "fdt addr $device_tree_addr" >> $UBOOT_SOURCE + echo "fdt resize 1024" >> $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 + if test "$LOAD_CMD" = "tftpb" + then + echo "fdt set /chosen xen,dom0-bootargs \"console=hvc0 earlycon=xen earlyprintk=xen root=/dev/ram0\"" >> $UBOOT_SOURCE + if test $dom0_ramdisk_addr != "-" + then + echo "fdt mknod /chosen dom0-ramdisk" >> $UBOOT_SOURCE + echo "fdt set /chosen/dom0-ramdisk compatible \"xen,linux-initrd\" \"xen,multiboot-module\"" >> $UBOOT_SOURCE + echo "fdt set /chosen/dom0-ramdisk reg <0x0 "$dom0_ramdisk_addr" 0x0 "$dom0_ramdisk_size">" >> $UBOOT_SOURCE + fi + else + echo "fdt set /chosen xen,dom0-bootargs \"console=hvc0 earlycon=xen earlyprintk=xen root=/dev/sda2\"" >> $UBOOT_SOURCE + fi + + i=0 + while test $i -lt $NUM_DOMUS + do + 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 "/chosen/domU$i" ${domU_ramdisk_addr[$i]} ${domU_ramdisk_size[$i]} + fi + if test "${domU_passthrough_dtb_addr[$i]}" + then + add_device_tree_passthrough "/chosen/domU$i" ${domU_passthrough_dtb_addr[$i]} ${domU_passthrough_dtb_size[$i]} + fi + i=$(( $i + 1 )) + done +} + +function add_size() +{ + local filename=$1 + local size=`stat --printf="%s" $filename` + memaddr=$(( $memaddr + $size + $offset - 1)) + memaddr=$(( $memaddr & ~($offset - 1) )) + memaddr=`printf "0x%X\n" $memaddr` + filesize=$size +} + +function load_file() +{ + local filename=$1 + + echo "$LOAD_CMD $memaddr $filename" >> $UBOOT_SOURCE + add_size $filename +} + +function check_file_type() +{ + local filename=$1 + local type="$2" + + file $filename | grep "$type" &> /dev/null + if test $? != 0 + then + echo Wrong file type "$filename". It shold be "$type". + fi +} + +function check_compressed_file_type() +{ + local filename=$1 + local type="$2" + + file $filename | grep "gzip compressed data" &> /dev/null + if test $? == 0 + then + local tmp=`mktemp` + cat $filename | gunzip > $tmp + filename=$tmp + fi + check_file_type $filename "$type" +} + +. config + +rm -f $UBOOT_SOURCE $UBOOT_SCRIPT +memaddr=$(( $MEMORY_START + $offset )) +# 12582912 is 0xc00000, 12MB +if test $memaddr -lt 12582912 +then + memaddr="12582912" +fi +memaddr=`printf "0x%X\n" $memaddr` +uboot_addr=$memaddr +# 2MB are enough for a uboot script +memaddr=$(( $memaddr + $offset )) +memaddr=`printf "0x%X\n" $memaddr` + +check_compressed_file_type $XEN "MS-DOS executable" +xen_addr=$memaddr +load_file "$XEN" + +check_compressed_file_type $DOM0_KERNEL "MS-DOS executable" +dom0_kernel_addr=$memaddr +load_file $DOM0_KERNEL +dom0_kernel_size=$filesize + +if test "$DOM0_RAMDISK" && [[ $LOAD_CMD = "tftpb" ]] +then + check_compressed_file_type $DOM0_RAMDISK "cpio archive" + dom0_ramdisk_addr=$memaddr + load_file "$DOM0_RAMDISK" + dom0_ramdisk_size=$filesize +else + dom0_ramdisk_addr="-" +fi + +i=0 +while test $i -lt $NUM_DOMUS +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]=$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]=$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]=$filesize + fi + i=$(( $i + 1 )) +done + +check_file_type $DEVICE_TREE "Device Tree Blob" +device_tree_addr=$memaddr +load_file $DEVICE_TREE +device_tree_editing $device_tree_addr + +# disable device tree reloation +echo "setenv fdt_high 0xffffffffffffffff" >> $UBOOT_SOURCE +echo "booti $xen_addr - $device_tree_addr" >> $UBOOT_SOURCE +mkimage -A arm64 -T script -C none -a $uboot_addr -e $uboot_addr -d $UBOOT_SOURCE "$UBOOT_SCRIPT" &> /dev/null + +memaddr=$(( $MEMORY_END - $memaddr - $offset )) +if test $memaddr -lt 0 +then + echo Error, not enough memory to load all binaries + exit 1 +fi + +echo "Generated uboot script $UBOOT_SCRIPT, to be loaded at address $uboot_addr:" +echo "$LOAD_CMD $uboot_addr $UBOOT_SCRIPT; source $uboot_addr" -- cgit v1.2.3