genode/repos/os/run/vmm_arm.run
Stefan Kalkowski b78b543011 vmm: make ARM VMM configureable
This commit enables users of the VMM to define CPU type and count, RAM size,
kernel and initrd ROM names, GIC version, and Virtio devices to be used.
Derived from the configuration values a flattened device-tree blob (DTB) is
generated and transfered to the VM.

Fix genodelabs/genode#4670
2022-11-17 08:00:37 +01:00

246 lines
7.3 KiB
Plaintext

#
# \brief Virtual-machine monitor demo
# \author Stefan Kalkowski
# \date 2015-06-25
#
assert_spec hw
if { ![have_board imx7d_sabre] && ![have_board imx8q_evk] &&
![have_board virt_qemu_arm_v7a] &&
![have_board virt_qemu_arm_v8a]} {
puts "Run script is not supported on this platform"
exit 0
}
create_boot_directory
import_from_depot [depot_user]/src/[base_src] \
[depot_user]/src/init \
[depot_user]/src/libc \
[depot_user]/src/log_terminal \
[depot_user]/src/nic_router \
[depot_user]/src/terminal_crosslink \
[depot_user]/src/vfs \
[depot_user]/src/vfs_block \
[depot_user]/src/vmm
build { test/terminal_expect_send }
proc vmm_config { } {
# for early printk add bootarg: earlycon=pl011,0x9000000
if {[have_spec arm]} {
return {
<config kernel_rom="linux" initrd_rom="initrd" ram_size="128M"
cpu_count="1" cpu_type="arm,cortex-a15" gic_version="2"
bootargs="rdinit=/bin/sh ip=dhcp console=hvc0">
<virtio_device name="hvc0" type="console"/>
<virtio_device name="eth0" type="net"/>
<virtio_device name="blk0" type="block"/>
</config>}
}
if {[have_spec arm_64]} {
return {
<config kernel_rom="linux" initrd_rom="initrd" ram_size="128M"
cpu_count="4" cpu_type="arm,cortex-a53" gic_version="3"
bootargs="rdinit=/bin/sh ip=dhcp console=hvc0">
<virtio_device name="hvc0" type="console"/>
<virtio_device name="eth0" type="net"/>
<virtio_device name="blk0" type="block"/>
</config>}
}
return unavailable
}
install_config {
<config verbose="yes" prio_levels="2">
<parent-provides>
<service name="ROM"/>
<service name="IRQ"/>
<service name="IO_MEM"/>
<service name="PD"/>
<service name="RM"/>
<service name="CPU"/>
<service name="LOG"/>
<service name="VM"/>
</parent-provides>
<default-route>
<any-service><parent/><any-child/></any-service>
</default-route>
<default caps="100"/>
<start name="timer">
<resource name="RAM" quantum="1M"/>
<provides><service name="Timer"/></provides>
</start>
<start name="nic_drv">
<binary name="nic_router" />
<resource name="RAM" quantum="8M"/>
<provides>
<service name="Nic"/>
<service name="Uplink"/>
</provides>
<config>
<default-policy domain="default"/>
<domain name="default" interface="10.0.1.1/24">
<dhcp-server ip_first="10.0.1.2" ip_last="10.0.1.2" />
</domain>
</config>
</start>
<start name="vfs_block">
<resource name="RAM" quantum="2M"/>
<provides> <service name="Block"/> </provides>
<config>
<vfs> <rom name="block.img"/> </vfs>
<default-policy file="/block.img" block_size="512"/>
</config>
<route>
<any-service> <parent/> </any-service>
</route>
</start>
<start name="log_terminal">
<resource name="RAM" quantum="2M"/>
<provides> <service name="Terminal"/> </provides>
</start>
<start name="terminal_crosslink">
<resource name="RAM" quantum="1M"/>
<provides> <service name="Terminal"/> </provides>
</start>
<start name="vmm" caps="200" priority="-1">
<resource name="RAM" quantum="256M"/>
<route>
<service name="Terminal" label="earlycon"> <child name="log_terminal"/> </service>
<service name="Terminal"> <child name="terminal_crosslink"/> </service>
<service name="Nic"> <child name="nic_drv"/> </service>
<any-service><parent/><any-child/></any-service>
</route>} [vmm_config] {
</start>
<start name="vm">
<binary name="test-terminal_expect_send"/>
<resource name="RAM" quantum="1M"/>
<config expect="/ #" send="mount /dev/vda /root; cp -r /etc /root; ls /root/etc; umount /root" verbose="yes"/>
<route>
<service name="Terminal"> <child name="terminal_crosslink"/> </service>
<any-service><parent/><any-child/></any-service>
</route>
</start>
</config>
}
if { [have_spec arm] } {
if {![file exists bin/linux]} {
puts "Download linux kernel ..."
exec >& /dev/null wget -c -O bin/linux http://genode.org/files/release-22.11/linux-virtio-arm32
}
if {![file exists bin/initrd]} {
puts "Download initramfs ..."
exec >& /dev/null wget -c -O bin/initrd http://genode.org/files/release-20.05/initrd-arm32
}
#
# To build the linux kernel from scratch, do the following steps:
#
# wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.14.21.tar.xz
# tar -xJf linux-5.14.21.tar.xz
# cd linux-5.14.21
# wget -O .config https://raw.githubusercontent.com/skalk/linux/66fb717e92b47512d8f686860a2c5e7329d01691/arch/arm/configs/virtio_only_defconfig
# make ARCH=arm CROSS_COMPILE=/usr/local/genode/tool/current/bin/genode-arm-
#
# copy arch/arm/boot/Image to your build directory in 'bin/linux'
#
#
# To construct the initrd do the following:
# * get and install gcc from bootlin:
# (https://toolchains.bootlin.com/downloads/releases/toolchains/armv7-eabihf/tarballs/)
# * build busybox
# wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2
# tar xjf busybox-1.31.1.tar.bz2
# mkdir build-busybox-aarch32
# cd busybox-1.31.1
# make O=../build-busybox-aarch32 defconfig
# make O=../build-busybox-aarch32 menuconfig
#
# [*] Setting -> Build static binary (no shared libs)
#
# cd ../build-busybox-aarch32
# make CROSS_COMPILE=/opt/armv7-eabihf--uclibc--stable-2020.02-1/bin/arm-buildroot-linux-uclibcgnueabihf- install -j6
# * create ramdisk
# cd _install
# find . | cpio -H newc -o | gzip > ../initrd
#
}
if { [have_spec arm_64] } {
if {![file exists bin/linux]} {
puts "Download linux kernel ..."
exec >& /dev/null wget -c -O bin/linux http://genode.org/files/release-22.11/linux-virtio-arm64
}
if {![file exists bin/initrd]} {
puts "Download initramfs ..."
exec >& /dev/null wget -c -O bin/initrd http://genode.org/files/release-20.02/initrd-arm64
}
#
# To build the linux kernel from scratch, do the following steps:
#
# wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.14.21.tar.xz
# tar -xJf linux-5.14.21.tar.xz
# cd linux-5.14.21
# wget -O .config https://raw.githubusercontent.com/skalk/linux/66fb717e92b47512d8f686860a2c5e7329d01691/arch/arm64/configs/virtio_only_defconfig
# make ARCH=arm64 CROSS_COMPILE=/usr/local/genode/tool/current/bin/genode-aarch64-
#
# copy arch/arm64/boot/Image to your build directory in 'bin/linux'
#
#
# To construct the initrd do the following:
# * get and install gcc from linaro
# (https://releases.linaro.org/components/toolchain/binaries/latest-7/)
# * build busybox
# wget https://busybox.net/downloads/busybox-1.29.3.tar.bz2
# tar xjf busybox-1.29.3.tar.bz2
# mkdir build-busybox-aarch64
# cd busybox-1.29.3
# make O=../build-busybox-aarch64 defconfig
# make O=../build-busybox-aarch64 menuconfig
#
# [*] Setting -> Build static binary (no shared libs)
#
# cd ../build-busybox-aarch64
# make CROSS_COMPILE=/usr/local/gcc-linaro/bin/aarch64-linux-gnu- install -j6
# * create ramdisk
# cd _install
# find . | cpio -H newc -o | gzip > ../initrd
}
catch { exec [installed_command dd] if=/dev/zero of=bin/block.img bs=1M count=0 seek=64 }
exec [installed_command mkfs.vfat] bin/block.img
build_boot_image {
test-terminal_expect_send
linux
initrd
block.img
}
#
# Execute test case
#
append qemu_args " -nographic "
run_genode_until "\[init -> vm\] .*resolv.conf.*" 220
exec rm bin/linux bin/initrd bin/block.img