common 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #!/usr/bin/env bash
  2. set -eu
  3. common_abspath() (
  4. echo "$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
  5. )
  6. # Benchmark a command.
  7. #
  8. # $1: command to benchmark
  9. # $2: where to append write results to. Default: /dev/null.
  10. #
  11. # Result format:
  12. #
  13. # cmd <command run>
  14. # time <time in seconds to finish>
  15. # exit_status <exit status>
  16. common_bench_cmd() (
  17. cmd="$1"
  18. results_file="${2:-/dev/null}"
  19. printf 'cmd ' >> "$results_file"
  20. env time --append -f 'time %e' --output="$results_file" "${common_root_dir}/eeval" -a "$cmd" "$results_file"
  21. printf "exit_status $?\n" >> "$results_file"
  22. )
  23. # Handle options common across multiple scripts.
  24. common_getopt_case() {
  25. case "$1" in
  26. -a|--arch)
  27. common_arch="$2"
  28. shift 2
  29. ;;
  30. -g|--gem5)
  31. common_gem5=true
  32. shift
  33. ;;
  34. -L|--linux-variant)
  35. common_linux_variant="$2"
  36. shift 2
  37. ;;
  38. -M|--gem5-variant)
  39. common_gem5_variant="$2"
  40. shift 2
  41. ;;
  42. -N|--gem5-worktree)
  43. common_gem5_worktree="$2"
  44. shift 2
  45. ;;
  46. -n|--run-id)
  47. common_run_id="$2"
  48. shift 2
  49. ;;
  50. -Q|--qemu-variant)
  51. common_qemu_variant="$2"
  52. shift 2
  53. ;;
  54. -s|--suffix)
  55. common_suffix="$2"
  56. shift 2
  57. ;;
  58. -t|--gem5-build-type)
  59. common_gem5_build_type="$2"
  60. shift 2
  61. ;;
  62. *)
  63. exit 2
  64. ;;
  65. esac
  66. }
  67. common_getopt_flags='a:gL:M:N:n:Q:s:t:'
  68. common_getopt_flags_long="\
  69. arch:,\
  70. gem5,\
  71. linux-variant:,\
  72. gem5-variant:,\
  73. gem5-worktree:,\:
  74. qemu-variant:,\
  75. suffix:,\
  76. gem5-build-type:'
  77. "
  78. # Setup several variables and do other initialization common to most scripts.
  79. # Typically done after getting inputs from the command line arguments.
  80. common_setup() {
  81. case "$common_arch" in
  82. a|arm)
  83. common_arch=arm
  84. common_gem5_arch=ARM
  85. ;;
  86. A|aarch64)
  87. common_arch=aarch64
  88. common_gem5_arch=ARM
  89. ;;
  90. m|mips64)
  91. common_arch=mips64
  92. ;;
  93. x|x86_64)
  94. common_arch=x86_64
  95. common_gem5_arch=X86
  96. ;;
  97. *)
  98. printf "unknown arch: ${common_arch}\n" 1>&2
  99. exit 2
  100. ;;
  101. esac
  102. common_buildroot_dir="${common_root_dir}/buildroot"
  103. common_arch_dir="$common_arch"
  104. if [ -n "$common_suffix" ]; then
  105. common_arch_dir="${common_arch_dir}-${common_suffix}"
  106. fi
  107. common_out_arch_dir="${common_out_dir}/${common_arch_dir}"
  108. common_buildroot_out_dir="${common_out_arch_dir}/buildroot"
  109. common_build_dir="${common_buildroot_out_dir}/build"
  110. common_linux_custom_dir="${common_build_dir}/linux-custom"
  111. common_linux_variant_dir="${common_linux_custom_dir}.${common_linux_variant}"
  112. common_vmlinux="${common_linux_variant_dir}/vmlinux"
  113. common_qemu_custom_dir="${common_build_dir}/host-qemu-custom"
  114. common_qemu_guest_variant_dir="${common_qemu_custom_dir}.${common_qemu_variant}"
  115. common_qemu_variant_dir="${common_qemu_custom_dir}.${common_qemu_variant}"
  116. common_qemu_exec="${common_qemu_variant_dir}/${common_arch}-softmmu/qemu-system-${common_arch}"
  117. common_qemu_guest_custom_dir="${common_build_dir}/qemu-custom"
  118. common_host_dir="${common_buildroot_out_dir}/host"
  119. common_images_dir="${common_buildroot_out_dir}/images"
  120. common_qcow2_file="${common_images_dir}/rootfs.ext2.qcow2"
  121. common_staging_dir="${common_buildroot_out_dir}/staging"
  122. common_target_dir="${common_buildroot_out_dir}/target"
  123. common_gem5_run_dir="${common_out_arch_dir}/gem5/${common_run_id}"
  124. common_m5out_dir="${common_gem5_run_dir}/m5out"
  125. common_trace_txt_file="${common_m5out_dir}/trace.txt"
  126. common_gem5_termout_file="${common_gem5_run_dir}/termout.txt"
  127. common_qemu_run_dir="${common_out_arch_dir}/qemu/${common_run_id}"
  128. common_qemu_termout_file="${common_qemu_run_dir}/termout.txt"
  129. common_qemu_rrfile="${common_qemu_run_dir}/rrfile"
  130. common_gem5_out_dir="${common_dir}/gem5/${common_gem5_variant}"
  131. common_gem5_m5term="${common_gem5_out_dir}/m5term"
  132. common_gem5_build_dir="${common_gem5_out_dir}/build"
  133. common_gem5_exec="${common_gem5_build_dir}/${common_gem5_arch}/gem5.${common_gem5_build_type}"
  134. common_gem5_system_dir="${common_gem5_out_dir}/system"
  135. if [ -n "$common_gem5_worktree" ]; then
  136. common_gem5_src_dir="${common_gem5_non_default_src_root_dir}/${common_gem5_worktree}"
  137. else
  138. common_gem5_src_dir="$common_gem5_default_src_dir"
  139. fi
  140. if "$common_gem5"; then
  141. common_exec="$common_gem5_exec"
  142. common_run_dir="$common_gem5_run_dir"
  143. common_termout_file="$common_gem5_termout_file"
  144. else
  145. common_exec="$common_qemu_exec"
  146. common_run_dir="$common_qemu_run_dir"
  147. common_termout_file="$common_qemu_termout_file"
  148. fi
  149. case "$common_arch" in
  150. arm)
  151. common_linux_image=arch/arm/boot/zImage
  152. ;;
  153. aarch64)
  154. common_linux_image=arch/arm64/boot/Image
  155. ;;
  156. mips64)
  157. common_linux_image=vmlinux
  158. ;;
  159. x86_64)
  160. common_linux_image=arch/x86/boot/bzImage
  161. ;;
  162. esac
  163. common_linux_image="${common_linux_variant_dir}/${common_linux_image}"
  164. # Ports.
  165. common_run_id_number="$(echo "$common_run_id" | cut -d . -f 2)"
  166. if "$common_gem5"; then
  167. common_gem5_telnet_port="$((3456 + $common_run_id_number))"
  168. common_gdb_port="$((7000 + $common_run_id_number))"
  169. else
  170. common_qemu_base_port="$((45454 + 10 * $common_run_id_number))"
  171. common_qemu_monitor_port="$(($common_qemu_base_port + 0))"
  172. common_qemu_hostfwd_generic_port="$(($common_qemu_base_port + 1))"
  173. common_qemu_hostfwd_ssh_port="$(($common_qemu_base_port + 2))"
  174. common_qemu_gdb_port="$(($common_qemu_base_port + 3))"
  175. common_gdb_port="$common_qemu_gdb_port"
  176. fi
  177. }
  178. common_mkdir() (
  179. mkdir -p \
  180. "$common_build_dir" \
  181. "$common_gem5_out_dir" \
  182. "$common_gem5_run_dir" \
  183. "$common_qemu_run_dir" \
  184. "$common_9p_dir" \
  185. ;
  186. )
  187. # Default paths.
  188. common_root_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  189. common_data_dir="${common_root_dir}/data"
  190. common_9p_dir="${common_data_dir}/9p"
  191. common_gem5_non_default_src_root_dir="${common_data_dir}/gem5"
  192. common_gem5_readfile_file="${common_data_dir}/readfile"
  193. common_gem5_default_src_dir="${common_root_dir}/gem5/gem5"
  194. common_out_dir="${common_root_dir}/out"
  195. common_bench_boot="${common_out_dir}/bench-boot.txt"
  196. common_dir="${common_out_dir}/common"
  197. # Other default variables.
  198. common_arch=x86_64
  199. common_gem5=false
  200. common_gem5_build_type=opt
  201. common_gem5_cpt_pref='^cpt\.'
  202. common_gem5_variant=default
  203. common_gem5_worktree=
  204. common_linux_variant=default
  205. common_qemu_variant=default
  206. common_run_id=0
  207. common_sha="$(git log -1 --format="%H")"
  208. common_suffix=
  209. f="${common_data_dir}/config"
  210. if [ -f "$f" ]; then
  211. . "$f"
  212. fi