start_vm 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. #!/bin/sh
  2. #
  3. # This software is a part of ISAR.
  4. # Copyright (C) 2015-2017 ilbers GmbH
  5. set -e
  6. ES_OK=0
  7. ES_BUG=3
  8. # Convert bitbake assignments to shell ones
  9. # a = b a=b
  10. # a ?= b a=b
  11. # TODO: Use bitbake to parse vars correctly (overriding in local.conf, etc.)
  12. bb2sh() {
  13. sed 's/[[:space:]]*?*=[[:space:]]*/=/'
  14. }
  15. start_qemu() {
  16. root=`echo $QEMU_DISK_ARGS \
  17. | sed 's,##ROOTFS_IMAGE##,'$IMAGE_DIR/$ROOTFS_IMAGE','`
  18. local had_x
  19. echo $- | grep -q x && had_x=1 || had_x=0
  20. [ $had_x -eq 0 ] && set -x
  21. qemu-system-$QEMU_ARCH \
  22. -m 1024M \
  23. -M $QEMU_MACHINE \
  24. $QCPU \
  25. -nographic \
  26. $EXTRA_ARGS \
  27. -append "$KARGS$EXTRA_KARGS" \
  28. $root
  29. [ $had_x -eq 0 ] && set +x
  30. }
  31. show_help() {
  32. echo "This script runs ISAR image in QEMU emulator."
  33. echo
  34. echo "Usage:"
  35. echo " $0 [params] [BUILD_DIR]"
  36. echo "BUILD_DIR is your ISAR build folder. If not set, current folder"
  37. echo "is used."
  38. echo
  39. echo "Parameters:"
  40. echo " -a, --arch ARCH set isar machine architecture."
  41. echo " Supported: arm, i386, amd64, arm64, mipsel, riscv64."
  42. echo " -b, --build BUILD set path to build directory."
  43. echo " -d, --distro DISTRO set isar Debian distribution."
  44. echo " Supported: stretch, buster"
  45. echo " -o, --out FILE Route QEMU console output to"
  46. echo " specified file."
  47. echo " -p, --pid FILE Store QEMU pid to file."
  48. echo " --help display this message and exit."
  49. echo
  50. echo "Exit status:"
  51. echo " 0 if OK,"
  52. echo " 3 if invalid parameters are passed."
  53. }
  54. # Set default values, that can be overwritten from command line
  55. ARCH=arm
  56. DISTRO=buster
  57. BUILD_DIR=$PWD
  58. # Parse command line to get user configuration
  59. while [ $# -gt 0 ]
  60. do
  61. key="$1"
  62. case $key in
  63. -h|--help)
  64. show_help
  65. exit 0
  66. ;;
  67. -a|--arch)
  68. ARCH=$2
  69. shift
  70. ;;
  71. -b|--build)
  72. BUILD_DIR=$2
  73. shift
  74. ;;
  75. -d|--distro)
  76. DISTRO=$2
  77. shift
  78. ;;
  79. -o|--out)
  80. EXTRA_ARGS="$EXTRA_ARGS -serial file:$2"
  81. shift
  82. ;;
  83. -p|--pid)
  84. EXTRA_ARGS="$EXTRA_ARGS -pidfile $2"
  85. shift
  86. ;;
  87. *)
  88. echo "error: invalid parameter '$key', please try '--help' to get list of supported parameters"
  89. exit $ES_BUG
  90. ;;
  91. esac
  92. shift
  93. done
  94. eval $(bitbake -e mc:qemu$ARCH-$DISTRO:isar-image-base | grep "^DEPLOY_DIR_IMAGE=")
  95. readonly IMAGE_DIR=$DEPLOY_DIR_IMAGE
  96. readonly ISARROOT="$(dirname "$0")"/..
  97. readonly MACHINE_CONF=$ISARROOT/meta-isar/conf/machine/qemu$ARCH.conf
  98. eval "$(egrep 'MACHINE_SERIAL|QEMU_' $MACHINE_CONF |bb2sh)"
  99. eval $(bitbake -e mc:qemu$ARCH-$DISTRO:isar-image-base | grep "\(^IMAGE_FSTYPES=\|^IMAGE_FULLNAME=\)")
  100. # Take first image type for VM if there are several defined
  101. IMAGE_FSTYPES=$(echo "$IMAGE_FSTYPES" | awk '{print $1}')
  102. case "$IMAGE_FSTYPES" in
  103. ext4-img)
  104. readonly ROOTFS_IMAGE=$IMAGE_FULLNAME.ext4.img
  105. eval $(bitbake -e mc:qemu$ARCH-$DISTRO:isar-image-base | grep "^KERNEL_IMAGE=")
  106. eval $(bitbake -e mc:qemu$ARCH-$DISTRO:isar-image-base | grep "^INITRD_IMAGE=")
  107. QKERNEL=$IMAGE_DIR/${KERNEL_IMAGE}
  108. QINITRD=/dev/null
  109. [ -n "$INITRD_IMAGE" ] && QINITRD=$IMAGE_DIR/${INITRD_IMAGE}
  110. if [ "$ARCH" = "riscv64" ]; then
  111. EXTRA_ARGS="$EXTRA_ARGS -device loader,file=$QKERNEL,addr=0x80200000"
  112. QKERNEL="/usr/lib/riscv64-linux-gnu/opensbi/qemu/virt/fw_jump.elf"
  113. fi
  114. EXTRA_ARGS="$EXTRA_ARGS \
  115. -kernel $QKERNEL \
  116. -initrd $QINITRD"
  117. KARGS="console=$MACHINE_SERIAL root=/dev/$QEMU_ROOTFS_DEV rw $QEMU_KARGS"
  118. ;;
  119. wic-img)
  120. readonly ROOTFS_IMAGE=$IMAGE_FULLNAME.wic.img
  121. EXTRA_ARGS="$EXTRA_ARGS -snapshot"
  122. ;;
  123. *)
  124. echo "IMAGE_FSTYPES \"$IMAGE_FSTYPES\" not supported"
  125. exit 1
  126. ;;
  127. esac
  128. QCPU=
  129. [ -n "$QEMU_CPU" ] && QCPU="-cpu $QEMU_CPU"
  130. start_qemu
  131. exit $ES_OK