aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'scripts')
-rwxr-xr-xscripts/disk_image134
-rw-r--r--scripts/imagebuilder_sd10
-rw-r--r--scripts/imagebuilder_tftp9
-rw-r--r--scripts/uboot-script-gen209
4 files changed, 362 insertions, 0 deletions
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"