mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-20 06:07:59 +00:00
b78b543011
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
246 lines
7.3 KiB
Plaintext
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
|