sample: add sample script for launching xenomai RTVM
Add a launch script for xenomai RTVM. Tracked-On: #4514 Signed-off-by: Tw <wei.tan@intel.com> Reviewed-by: Binbin Wu <binbin.wu@intel.com>
This commit is contained in:
parent
793e22a87a
commit
e51d12d8cb
|
@ -0,0 +1,221 @@
|
|||
#!/bin/bash
|
||||
# Copyright (C) 2020 Intel Corporation.
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
# set -x
|
||||
|
||||
usage()
|
||||
{
|
||||
echo "$0 [-b disk | -f img] [-k kernel.tar.gz] {-n ethernet} {-B mem_size}"
|
||||
echo " example:"
|
||||
echo " $0 -b /dev/sdb3 -k ~/linux-4.19.tar.gz -n eth0"
|
||||
echo " $0 -f clearlinux.img -k ../linux-5.2.tar -n eth0 -B 512M"
|
||||
exit
|
||||
}
|
||||
|
||||
function get_bdf()
|
||||
{
|
||||
IFS=/
|
||||
for dir in $1; do
|
||||
case $dir in 0000:??:??.?)
|
||||
bdf=$dir;;
|
||||
esac
|
||||
done
|
||||
|
||||
unset IFS
|
||||
echo $bdf
|
||||
}
|
||||
|
||||
modprobe pci_stub
|
||||
# pci devices for passthru
|
||||
dev_opts=
|
||||
declare -A passthru_devs
|
||||
guest_pci_nr=2
|
||||
|
||||
function passthru_pci_devs()
|
||||
{
|
||||
for dev in "${passthrus[@]}"
|
||||
do
|
||||
dev_info=$(find /sys/devices/pci* -name $(basename $dev))
|
||||
dev_bdf=$(get_bdf $dev_info)
|
||||
dev_path=$(echo $dev_info | sed "s/$dev_bdf\(.*\)//g")$dev_bdf
|
||||
dev_vendor_id=$(cat $dev_path/vendor | sed 's/0x//g')
|
||||
dev_device_id=$(cat $dev_path/device | sed 's/0x//g')
|
||||
dev_bus=$(echo ${dev_bdf#0000:}|sed "s/:.*//g")
|
||||
dev_dev=$(echo $dev_bdf|sed "s/.*://g"|sed "s/\..*//g")
|
||||
dev_fun=$(echo $dev_bdf|sed "s/.*\.//g")
|
||||
dev_drv=$(lspci -k -s $dev_bdf | grep "Kernel driver in use"|sed "s/.*: //g")
|
||||
dev_passthru_opt="-s $guest_pci_nr,passthru,$dev_bus/$dev_dev/$dev_fun"
|
||||
|
||||
echo "passthrough a pci device:"
|
||||
echo dev_info:$dev_info
|
||||
echo dev_path:$dev_path
|
||||
echo dev_vendor_id:$dev_vendor_id
|
||||
echo dev_device_id:$dev_device_id
|
||||
echo dev_bus:$dev_bus
|
||||
echo dev_dev:$dev_dev
|
||||
echo dev_fun:$dev_fun
|
||||
echo dev_drv:$dev_drv
|
||||
echo dev_passthru_opt:$dev_passthru_opt
|
||||
|
||||
# replace its driver with pci-stub
|
||||
echo "$dev_vendor_id $dev_device_id" > /sys/bus/pci/drivers/pci-stub/new_id
|
||||
echo $dev_bdf > $dev_path/driver/unbind
|
||||
echo $dev_bdf > /sys/bus/pci/drivers/pci-stub/bind
|
||||
|
||||
# add to global options
|
||||
dev_opts="$dev_opts $dev_passthru_opt"
|
||||
|
||||
# register for de-passthrough later
|
||||
passthru_devs[$dev_bdf]=$dev_drv
|
||||
|
||||
# increase virtual pci slot number
|
||||
guest_pci_nr=$(expr $guest_pci_nr + 1)
|
||||
done
|
||||
}
|
||||
|
||||
function de_passthru_pci_devs()
|
||||
{
|
||||
for dev_bdf in "${!passthru_devs[@]}"
|
||||
do
|
||||
echo $dev_bdf > /sys/bus/pci/drivers/pci-stub/unbind
|
||||
echo $dev_bdf > /sys/bus/pci/drivers/${passthru_devs[$dev_bdf]}/bind
|
||||
done
|
||||
}
|
||||
|
||||
# restore pci device driver on exit
|
||||
trap de_passthru_pci_devs EXIT
|
||||
|
||||
mem_size=1024M
|
||||
eth=
|
||||
disk=
|
||||
img=
|
||||
kernel=
|
||||
passthrus=()
|
||||
while getopts hn:b:f:k:B: opt
|
||||
do
|
||||
case "${opt}" in
|
||||
h)
|
||||
usage;
|
||||
;;
|
||||
n)
|
||||
eth=${OPTARG}
|
||||
passthrus+=($eth)
|
||||
;;
|
||||
b)
|
||||
disk="${OPTARG}"
|
||||
passthrus+=($disk)
|
||||
;;
|
||||
f)
|
||||
img="${OPTARG}"
|
||||
;;
|
||||
k)
|
||||
kernel="${OPTARG}"
|
||||
;;
|
||||
B)
|
||||
mem_size="${OPTARG}"
|
||||
;;
|
||||
?)
|
||||
echo "{OPTARG}"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ( -z "${kernel}") || (( -z "${disk}") && ( -z "${img}" )) ]]; then
|
||||
usage; exit 1
|
||||
fi
|
||||
|
||||
# create a unique tap device for each VM
|
||||
if [ -z $eth ];then
|
||||
tap=tap_rtvm
|
||||
tap_exist=$(ip a | grep "$tap" | awk '{print $1}')
|
||||
if [ "$tap_exist"x != "x" ]; then
|
||||
echo "tap device existed, reuse $tap"
|
||||
else
|
||||
ip tuntap add dev $tap mode tap
|
||||
ip link set "$tap" master acrn-br0
|
||||
ip link set dev "$tap" down
|
||||
ip link set dev "$tap" up
|
||||
fi
|
||||
|
||||
dev_opts="$dev_opts -s $guest_pci_nr,virtio-net,$tap"
|
||||
guest_pci_nr=$(expr $guest_pci_nr + 1)
|
||||
fi
|
||||
|
||||
function launch_hard_rt_vm()
|
||||
{
|
||||
mkdir -p /mnt
|
||||
if [ ! -z $img ]; then
|
||||
# mount virtual disk (assuming the last partition is root)
|
||||
vdisk=$(losetup -f -P --show $img)
|
||||
vdisk_root=$(ls -1 ${vdisk}p* | tail -1)
|
||||
mount $vdisk_root /mnt
|
||||
|
||||
# extract the kernel and install kernel modules
|
||||
bzImage=/mnt/$(tar xzvf $kernel -C /mnt --dereference --exclude=vmlinux* | grep vmlinuz)
|
||||
cp $bzImage /tmp/bzImage.xenomai
|
||||
|
||||
# umount disk
|
||||
umount /mnt
|
||||
losetup -d $vdisk
|
||||
|
||||
# find appropriate root partition information
|
||||
disk_part_nr=$(basename $vdisk_root| sed 's/.*p\([0-9]$\)/\1/')
|
||||
vdisk=/dev/vda$disk_part_nr
|
||||
|
||||
dev_opts="$dev_opts -s $guest_pci_nr,virtio-blk,$img"
|
||||
guest_pci_nr=$(expr $guest_pci_nr + 1)
|
||||
elif [ ! -z $disk ];then
|
||||
# mount the physical disk
|
||||
mount $disk /mnt
|
||||
|
||||
# extract the kernel and install kernel modules
|
||||
bzImage=/mnt/$(tar xzvf $kernel -C /mnt --dereference --exclude=vmlinux* | grep vmlinuz)
|
||||
cp $bzImage /tmp/bzImage.xenomai
|
||||
|
||||
# umount disk
|
||||
umount /mnt
|
||||
|
||||
# detect partition information
|
||||
disk_part_nr=$(basename $disk| sed 's/.*\([0-9]$\)/\1/')
|
||||
if grep -q "nvme" "$disk"; then
|
||||
vdisk=/dev/nvme0n1p$disk_part_nr
|
||||
else
|
||||
vdisk=/dev/sda$disk_part_nr
|
||||
fi
|
||||
fi
|
||||
|
||||
passthru_pci_devs
|
||||
|
||||
/usr/bin/acrn-dm -A -m $mem_size -s 0:0,hostbridge \
|
||||
-k /tmp/bzImage.xenomai \
|
||||
-U 495ae2e5-2603-4d64-af76-d4bc5a8ec0e5 \
|
||||
--lapic_pt \
|
||||
--rtvm \
|
||||
--virtio_poll 1000000 \
|
||||
-s 1,virtio-console,@stdio:stdio_port \
|
||||
$dev_opts \
|
||||
-B "root=$vdisk rw rootwait nohpet console=hvc0 consoleblank=0 \
|
||||
no_timer_check ignore_loglevel log_buf_len=16M nmi_watchdog=0 nosoftlockup \
|
||||
processor.max_cstate=0 intel_idle.max_cstate=0 intel_pstate=disable idle=poll \
|
||||
rcu_nocb_poll isolcpus=1 nohz_full=1 rcu_nocbs=1 \
|
||||
tsc=reliable x2apic_phys xenomai.supported_cpus=2 irqaffinity=0 mce=off" hard_rtvm
|
||||
}
|
||||
|
||||
# offline SOS CPUs except BSP before launch UOS
|
||||
for i in `ls -d /sys/devices/system/cpu/cpu[1-99]`; do
|
||||
online=`cat $i/online`
|
||||
idx=`echo $i | tr -cd "[1-99]"`
|
||||
echo cpu$idx online=$online
|
||||
if [ "$online" = "1" ]; then
|
||||
echo 0 > $i/online
|
||||
echo $idx > /sys/class/vhm/acrn_vhm/offline_cpu
|
||||
fi
|
||||
done
|
||||
|
||||
echo 3 > /sys/kernel/debug/dri/0/i915_cache_sharing
|
||||
echo 300 > /sys/class/drm/card0/gt_max_freq_mhz
|
||||
echo 300 > /sys/class/drm/card0/gt_min_freq_mhz
|
||||
echo 300 > /sys/class/drm/card0/gt_boost_freq_mhz
|
||||
|
||||
launch_hard_rt_vm
|
Loading…
Reference in New Issue