Xen ARM with Virtualization Extensions/Ibox3399
Bootloader
For ARM64 Xen requires to be booted in EL2 mode by the bootloader. By default Rockchip RK3399 Ibox3399 development board comes with u-boot which is not very friendly for booting Xen.
Please update the u-boot with provided by Rockchip rockchip-linux/u-boot github. Build instructions: rockchip-linux/u-boot github README.
Prepequairnments
u-boot-utils
Cross compilers used: gcc-linaro-7.2.1 for Xen and aarch64-linux-android-4.9 for kernel
Building Xen
Get Xen and switch to xen-4.10.1 tag:
git clone git://xenbits.xen.org/xen.git cd xen git checkout RELEASE-4.10.1 -b 'xen-rk3399'
Enable earlyprintk configuration for rk3399 boards:
diff --git a/xen/arch/arm/Rules.mk b/xen/arch/arm/Rules.mk index b66c19f..b1cf319 100644 --- a/xen/arch/arm/Rules.mk +++ b/xen/arch/arm/Rules.mk @@ -38,6 +38,7 @@ EARLY_PRINTK_lager := scif,0xe6e60000 EARLY_PRINTK_midway := pl011,0xfff36000 EARLY_PRINTK_omap5432 := 8250,0x48020000,2 EARLY_PRINTK_rcar3 := scif,0xe6e88000 +EARLY_PRINTK_rk3399 := 8250,0xff1a0000,2 EARLY_PRINTK_seattle := pl011,0xe1010000 EARLY_PRINTK_sun6i := 8250,0x01c28000,2 EARLY_PRINTK_sun7i := 8250,0x01c28000,2
Configure Hypervisor:
cd xen/xen export PATH=$PATH:<path_to_gcc-linaro>/bin/ make menuconfig CROSS_COMPILE=aarch64-linux-gnu- XEN_TARGET_ARCH=arm64
Enable debugging option:
Debugging Options ---> [*] Developer Checks
Build Hypervisor:
cd ../ make dist-xen CROSS_COMPILE=aarch64-linux-gnu- XEN_TARGET_ARCH=arm64 debug=y CONFIG_EARLY_PRINTK=rk3399
Make image suitable to be booted by u-boot:
mkimage -A arm64 -T kernel -a 0x02000000 -e 0x02000000 -C none -d ./xen/xen xen4.10-uImage
Collect xen4.10-uImage file at this step.
Dom0 Kernel/FDT
git clone https://github.com/ihormatushchak/k9tripod.git export PATH=$PATH:<path_to_aarch64_linux_android>/bin/ cd k9tripod/
make ARCH=arm64 x3399-xen-dom0_defconfig make -j4 CROSS_COMPILE=aarch64-linux-android- ARCH=arm64
After build rename file "Image" (located at arch/arm64/boot/) to "dom0-Image" and collect it at this step.
Collect x3399-dom0-development-board.dtb file (located at arch/arm64/boot/dts/rockchip/) at this step.
Dom0 rootfs
Let's use Buildroot to build rootfs for dom0.
git clone git://git.buildroot.net/buildroot cd buildroot
At the moment version of buildroot was 3.0.0
git checkout c83f2c14f8fde96bbdc1ee351d62f3b2346d20ff -b 'xen-domains-rootfs'
Configure buildroot before build:
make menuconfig
Here is minimal configuration for dom0:
Target options ---> Target Architecture ---> (X) AArch64 (little endian) Target Architecture Variant ---> (X) cortex-A72/A53 big.LITTLE Toolchain ---> Kernel Headers ---> (X) Linux 4.4.x kernel headers [*] Enable WCHAR support System configuration ---> Init system ---> (X) systemV /bin/sh ---> (X) bash Target packages ---> System tools ---> [*] xen [ ] Xen hypervisor (NEW) [*] Xen tools Filesystem images ---> [*] ext2/3/4 root filesystem ext2/3/4 variant ---> (X) ext2 (rev1) (300M) exact size [ ] tar the root filesystem
Now we can build the rootfs:
make -j4
As a result we should get buildroot/output/images/rootfs.ext2 file here.
Preparing SD card to boot
Prepare SD card with next layout:
+-------------+-------------+-------------+ | partition 1 | partition 2 | | +-------------+-------------+-------------+ | | | | | 100M (vfat) | 300M (ext2) | (Unmapped) | | | | | +-------------+-------------+-------------+ | boot | dom0-roots | | +-------------+-------------+-------------+
Format partition 1 with vfat labeled with "boot":
sudo mkfs.vfat /dev/sdX1 -n boot
NOTICE: replace /dev/sdX1 with your one.
Copy Xen and dom0 images to the boot partition (obtained in previous sections):
mount /dev/sdX1 /mnt mkdir /mnt/boot cp xen4.10-uImage dom0-Image x3399-dom0-development-board.dtb /mnt/boot/ umount /mnt
NOTICE: replace /dev/sdX1 with your one.
Copy the rootfs (obtained from buildroot):
dd if=buildroot/output/images/rootfs.ext2 of=/dev/sdX2; sync
NOTICE: replace /dev/sdX2 with your one.
Now SD card ready to boot Xen with Dom0.
Booting
Plug in prepared SD card, power on the board and enter u-boot shell using next settings:
uart2: 1500000 8N1
edit bootcmd var in u-boot with:
fatload mmc 1:1 0x02000000 boot/xen4.10-uImage; fatload mmc 1:1 0x01f00000 boot/x3399-dom0-development-board.dtb; fatload mmc 1:1 0x03F80000 boot/dom0-Image;bootm 0x02000000 - 0x01f00000
Save changes
saveenv
and reboot the board.
Xen, dom0 should boot now.