2015-02-19 13:50:27 +00:00
|
|
|
#
|
|
|
|
# \brief Virtual-machine monitor demo
|
|
|
|
# \author Stefan Kalkowski
|
|
|
|
# \date 2015-06-25
|
|
|
|
#
|
|
|
|
|
2017-01-03 12:17:41 +00:00
|
|
|
assert_spec hw
|
2019-04-10 10:43:17 +00:00
|
|
|
|
2020-04-06 22:42:50 +00:00
|
|
|
if { ![have_spec imx7d_sabre] && ![have_spec imx8q_evk] &&
|
|
|
|
![have_spec virt_qemu]} {
|
2019-04-10 10:43:17 +00:00
|
|
|
puts "Run script is not supported on this platform"
|
|
|
|
exit 0
|
|
|
|
}
|
2015-02-19 13:50:27 +00:00
|
|
|
|
|
|
|
set build_components {
|
2019-01-03 17:01:49 +00:00
|
|
|
core init timer
|
2019-04-04 14:41:41 +00:00
|
|
|
server/terminal_crosslink
|
|
|
|
test/terminal_expect_send
|
2019-10-21 12:18:12 +00:00
|
|
|
server/log_terminal
|
|
|
|
server/nic_router
|
2015-02-19 13:50:27 +00:00
|
|
|
server/vmm
|
|
|
|
}
|
|
|
|
build $build_components
|
|
|
|
create_boot_directory
|
|
|
|
|
|
|
|
install_config {
|
2019-09-03 14:29:27 +00:00
|
|
|
<config verbose="yes" prio_levels="2">
|
2015-02-19 13:50:27 +00:00
|
|
|
<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>
|
2017-05-07 20:36:11 +00:00
|
|
|
<default caps="100"/>
|
2015-02-19 13:50:27 +00:00
|
|
|
<start name="timer">
|
|
|
|
<resource name="RAM" quantum="1M"/>
|
|
|
|
<provides><service name="Timer"/></provides>
|
|
|
|
</start>
|
2019-10-21 12:18:12 +00:00
|
|
|
<start name="nic_drv">
|
|
|
|
<binary name="nic_router" />
|
|
|
|
<resource name="RAM" quantum="8M"/>
|
|
|
|
<provides> <service name="Nic"/> </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="log_terminal">
|
|
|
|
<resource name="RAM" quantum="2M"/>
|
|
|
|
<provides> <service name="Terminal"/> </provides>
|
|
|
|
</start>
|
2019-04-04 14:41:41 +00:00
|
|
|
<start name="terminal_crosslink">
|
|
|
|
<resource name="RAM" quantum="1M"/>
|
|
|
|
<provides> <service name="Terminal"/> </provides>
|
2015-02-19 13:50:27 +00:00
|
|
|
</start>
|
2019-09-03 14:29:27 +00:00
|
|
|
<start name="vmm" caps="200" priority="-1">
|
2015-02-19 13:50:27 +00:00
|
|
|
<resource name="RAM" quantum="256M"/>
|
2019-10-21 12:18:12 +00:00
|
|
|
<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>
|
2015-02-19 13:50:27 +00:00
|
|
|
</start>
|
2019-04-04 14:41:41 +00:00
|
|
|
<start name="vm">
|
|
|
|
<binary name="test-terminal_expect_send"/>
|
|
|
|
<resource name="RAM" quantum="1M"/>
|
|
|
|
<config expect="/ #" send="ls" verbose="yes"/>
|
2019-10-21 12:18:12 +00:00
|
|
|
<route>
|
|
|
|
<service name="Terminal"> <child name="terminal_crosslink"/> </service>
|
|
|
|
<any-service><parent/><any-child/></any-service>
|
|
|
|
</route>
|
2019-04-04 14:41:41 +00:00
|
|
|
</start>
|
2015-02-19 13:50:27 +00:00
|
|
|
</config>
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-09-03 14:29:27 +00:00
|
|
|
if { [have_spec arm] } {
|
|
|
|
|
|
|
|
if {![file exists bin/linux]} {
|
|
|
|
puts "Download linux kernel ..."
|
2019-11-14 09:52:20 +00:00
|
|
|
exec >& /dev/null wget -c -O bin/linux http://genode.org/files/release-20.05/linux-arm32
|
2019-09-03 14:29:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if {![file exists bin/dtb]} {
|
|
|
|
puts "Download device tree blob ..."
|
2019-11-14 09:52:20 +00:00
|
|
|
exec >& /dev/null wget -c -O bin/dtb http://genode.org/files/release-20.05/dtb-arm32-virt
|
2019-09-03 14:29:27 +00:00
|
|
|
}
|
|
|
|
|
2019-11-14 09:52:20 +00:00
|
|
|
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 obtain the linux kernel, do the following steps:
|
|
|
|
#
|
|
|
|
# wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.3.10.tar.xz
|
|
|
|
#
|
|
|
|
# tar -xJf linux-5.3.10.tar.xz
|
|
|
|
# cd linux-5.3.10
|
|
|
|
#
|
|
|
|
# make O=../build-linux-aarch32 ARCH=arm CROSS_COMPILE=/usr/local/genode/tool/current/bin/genode-arm- defconfig
|
|
|
|
# make O=../build-linux-aarch32 ARCH=arm CROSS_COMPILE=/usr/local/genode/tool/current/bin/genode-arm- -j32
|
|
|
|
#
|
|
|
|
# copy ../build-linux-aarch32/arch/arm/boot/zImage to your build directory in 'bin/linux'
|
2015-02-19 13:50:27 +00:00
|
|
|
#
|
|
|
|
#
|
2019-11-14 09:52:20 +00:00
|
|
|
# To get the dtb (device-tree-binary), you have to compile the file:
|
|
|
|
# repos/os/src/server/vmm/spec/arm_v7/virt.dts with the dtc compiler:
|
|
|
|
# dtc repos/os/src/server/vmm/spec/arm_v7/virt.dts > bin/dtb
|
2015-02-19 13:50:27 +00:00
|
|
|
#
|
|
|
|
#
|
2019-11-14 09:52:20 +00:00
|
|
|
# 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
|
2015-02-19 13:50:27 +00:00
|
|
|
#
|
2019-11-14 09:52:20 +00:00
|
|
|
# [*] 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
|
2015-02-19 13:50:27 +00:00
|
|
|
#
|
|
|
|
}
|
|
|
|
|
2019-09-03 14:29:27 +00:00
|
|
|
if { [have_spec arm_64] } {
|
|
|
|
|
|
|
|
if {![file exists bin/linux]} {
|
|
|
|
puts "Download linux kernel ..."
|
2019-10-21 12:18:12 +00:00
|
|
|
exec >& /dev/null wget -c -O bin/linux http://genode.org/files/release-20.02/linux-arm64
|
2019-09-03 14:29:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if {![file exists bin/dtb]} {
|
|
|
|
puts "Download device tree blob ..."
|
2020-09-11 12:45:47 +00:00
|
|
|
exec >& /dev/null wget -c -O bin/dtb http://genode.org/files/release-20.11/dtb-arm64-virt-smp
|
2019-09-03 14:29:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if {![file exists bin/initrd]} {
|
|
|
|
puts "Download initramfs ..."
|
2019-10-21 12:18:12 +00:00
|
|
|
exec >& /dev/null wget -c -O bin/initrd http://genode.org/files/release-20.02/initrd-arm64
|
2019-09-03 14:29:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#
|
|
|
|
# To obtain the linux kernel, do the following steps:
|
|
|
|
#
|
|
|
|
# wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.53.tar.xz
|
|
|
|
#
|
|
|
|
# tar -xJf linux-4.19.53.tar.xz
|
|
|
|
# cd linux-4.19.53
|
|
|
|
#
|
|
|
|
# make O=../build-linux-aarch64 ARCH=arm64 CROSS_COMPILE=/usr/local/genode/tool/current/bin/genode-aarch64- defconfig
|
|
|
|
# make O=../build-linux-aarch64 ARCH=arm64 CROSS_COMPILE=/usr/local/genode/tool/current/bin/genode-aarch64- -j32
|
|
|
|
#
|
|
|
|
# copy ../build-linux-aarch64/arch/arm64/boot/Image to your build directory in 'bin/linux'
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# To get the dtb (device-tree-binary), you have to compile the file:
|
|
|
|
# repos/os/src/server/vmm/spec/arm_v8/virt.dts with the dtc compiler:
|
|
|
|
# dtc repos/os/src/server/vmm/spec/arm_v8/virt.dts > bin/dtb
|
|
|
|
#
|
|
|
|
#
|
|
|
|
# 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
|
2015-02-19 13:50:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
set boot_modules {
|
2016-12-01 18:00:11 +00:00
|
|
|
core ld.lib.so init
|
2015-02-19 13:50:27 +00:00
|
|
|
timer
|
2019-04-04 14:41:41 +00:00
|
|
|
terminal_crosslink
|
|
|
|
test-terminal_expect_send
|
2019-10-21 12:18:12 +00:00
|
|
|
nic_router
|
|
|
|
log_terminal
|
2015-02-19 13:50:27 +00:00
|
|
|
vmm
|
|
|
|
linux
|
|
|
|
dtb
|
2019-11-14 09:52:20 +00:00
|
|
|
initrd
|
2015-02-19 13:50:27 +00:00
|
|
|
}
|
|
|
|
build_boot_image $boot_modules
|
|
|
|
|
|
|
|
#
|
|
|
|
# Execute test case
|
|
|
|
#
|
2020-03-25 18:09:36 +00:00
|
|
|
append qemu_args " -nographic "
|
2019-04-04 14:41:41 +00:00
|
|
|
run_genode_until "\[init -> vm\] .*sbin.*" 220
|
2020-09-11 12:45:47 +00:00
|
|
|
exec rm bin/linux bin/dtb bin/initrd
|