pvrhwperf 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488
  1. OS="LINUX"
  2. TMP_ROOT="/tmp"
  3. TXT_READER=more
  4. CAT_LOG=no
  5. RETAIN_TL_HEADERS=no
  6. DEVICE="all"
  7. DEVICES=0
  8. MIN_DEVICE_ID=0
  9. MAX_DEVICE_ID=15
  10. HWPERF_FW_FILTER=""
  11. HWPERF_HOST_FILTER=""
  12. HWPERF_RESET_STREAMS="false"
  13. HWPERF_V1CNT="false"
  14. if [ x"$PVRHWPERF_TMP" != x ]; then
  15. if [ -d "$PVRHWPERF_TMP" ]; then
  16. TMP_ROOT="$PVRHWPERF_TMP"
  17. fi
  18. fi
  19. if [ -x "/system/bin/logcat" ]; then
  20. OS="ANDROID"
  21. BIN_DIR=/system/vendor/bin
  22. TMP_ROOT="/data/local/tmp"
  23. TXT_READER=cat
  24. fi
  25. TLD_RET=
  26. EXEC_LINE=""
  27. H2J_NAME="hwperfbin2jsont"
  28. JSM_NAME="hwperfjsonmerge.py"
  29. if [ x"$OS" = xLINUX ]; then
  30. PYTHON_BIN="`which \"python\"`"
  31. fi
  32. # FUNCTIONS FOR SAVING AND RESTORING STATE
  33. preserve_state() {
  34. PVR_DBG_LEVEL_OLD="$PVRDebugLevel"
  35. for ID in $DEVICES; do
  36. eval "_FW_FILTER_FILE=\$HWPERF_FW_FILTER_FILE_$ID"
  37. if [ x"$HWPERF_FW_FILTER" != x ] && [ -f $_FW_FILTER_FILE ]; then
  38. eval "HWPERF_FW_FILTER_${ID}_OLD=\"\$(cat $_FW_FILTER_FILE)\""
  39. fi
  40. eval "_HOST_FILTER_FILE=\$HWPERF_HOST_FILTER_FILE_$ID"
  41. if [ x"$HWPERF_HOST_FILTER" != x ] && [ -f $_HOST_FILTER_FILE ]; then
  42. eval "HWPERF_HOST_FILTER_${ID}_OLD=\"\$(cat $_HOST_FILTER_FILE)\""
  43. fi
  44. done
  45. }
  46. restore_state() {
  47. export PVRDebugLevel=$PVR_DBG_LEVEL_OLD
  48. for ID in $DEVICES; do
  49. eval "_FW_FILTER=\$HWPERF_FW_FILTER_${ID}_OLD"
  50. eval "_FW_FILTER_FILE=\$HWPERF_FW_FILTER_FILE_${ID}"
  51. if [ x"$_FW_FILTER" != x ]; then
  52. echo $_FW_FILTER > $_FW_FILTER_FILE
  53. fi
  54. eval "_HOST_FILTER=\$HWPERF_HOST_FILTER_${ID}_OLD"
  55. eval "_HOST_FILTER_FILE=\$HWPERF_HOST_FILTER_FILE_${ID}"
  56. if [ x"$_HOST_FILTER" != x ]; then
  57. echo $_HOST_FILTER > $_HOST_FILTER_FILE
  58. fi
  59. done
  60. }
  61. OUT1_JSON_FILE_PREFIX="hwperf_fw_"
  62. OUT2_JSON_FILE_PREFIX="hwperf_host_"
  63. OUT_JSON_MERGE_FILE_PREFIX="hwperf_merge_"
  64. # PARAMETERS PARSING
  65. args="$@ dummy"
  66. next=
  67. skip_next="true"
  68. for argument in $args
  69. do
  70. curr=$next
  71. next=$argument
  72. if [ "$skip_next" = "true" ]; then
  73. skip_next="false"
  74. continue
  75. fi
  76. case "$curr" in
  77. -device)
  78. DEVICE=$next
  79. skip_next="true"
  80. ;;
  81. -t) EXEC_LINE=$H2J_NAME
  82. OUT1_JSON_FILE_TMP=$OUT1_JSON_FILE_PREFIX"*.json"
  83. OUT1_JSON_FILE="./"
  84. OUT2_JSON_FILE_TMP=$OUT2_JSON_FILE_PREFIX"*.json"
  85. OUT2_JSON_FILE="./"
  86. OUT3_JSON_FILE_TMP="hwperf_client_*.json"
  87. OUT3_JSON_DIR="./"
  88. ;;
  89. -rt) EXEC_LINE="$H2J_NAME $ -raw"
  90. OUT1_JSON_FILE_TMP=$OUT1_JSON_FILE_PREFIX"*.raw.json"
  91. OUT1_JSON_FILE="./"
  92. OUT2_JSON_FILE_TMP=$OUT2_JSON_FILE_PREFIX"*.raw.json"
  93. OUT2_JSON_FILE="./"
  94. OUT3_JSON_FILE_TMP="hwperf_client_*.raw.json"
  95. OUT3_JSON_DIR="./"
  96. ;;
  97. -m) OUT_JSON_MERGE_FILE_TMP=$OUT_JSON_MERGE_FILE_PREFIX"*.json"
  98. OUT_JSON_MERGE_FILE="./"
  99. ;;
  100. -c) CAT_LOG=yes ;;
  101. -h) echo "+-----------------------------------------------------------------------------+"
  102. echo "| pvrhwperf : run pvrtld (Transport Layer Daemon) for gathering HWPerf data"
  103. echo "|"
  104. echo "| The HWPerf output data (firmware, host and client) is generated"
  105. echo "| per-device and is segregated accordingly in files named:"
  106. echo "| * hwperf_fw_<DeviceID>.[bin/json]"
  107. echo "| * hwperf_host_<DeviceID>.[bin/json]"
  108. echo "| * hwperf_client_<DeviceID>_<PID>.[bin/json]"
  109. echo "| where <DeviceID> is unique identifier for a GPU device."
  110. echo "+-----------------------------------------------------------------------------+"
  111. echo "| Usage:"
  112. echo "| -device ID : Device ID (0-15 or \"all\") for which data will be captured"
  113. echo "| (default \"all\"). If not specified or \"all\", data from all"
  114. echo "| devices will be captured."
  115. echo "| -t : Call hwperfbin2jsont (if present), to process the generated"
  116. echo "| *.bin output files, after pvrtld end."
  117. echo "| -rt : Call hwperfbin2jsont, adding the -raw parameter, to process the"
  118. echo "| generated *.bin output files, after pvrtld end."
  119. if [ x"$PYTHON_BIN" != x ]; then
  120. echo "| -m : Call hwperfjsonmerge.py (if present), to merge generated *.json"
  121. echo "| files (python interpreter required)."
  122. fi
  123. echo "| -c : Prints the log files to the std output just after pvrtld execution."
  124. echo "| -h : Print this message."
  125. echo "| -fw 0xFILTER : Specify a 64-bit hexadecimal filter value for FW events"
  126. echo "| (original value is restored afterwards)."
  127. echo "| -host 0xFILTER : Specify a 32-bit hexadecimal filter value for Server host"
  128. echo "| host events (original value is restored afterwards)."
  129. echo "| -r : Reset streams before capturing data."
  130. echo "| -tlbin : In addition to regular data also retain packet headers"
  131. echo "| in the binary file (generates *.tlbin files)."
  132. echo "| -wa-v1cntids : Insert counter IDs alongside the performance counter"
  133. echo "| values in the processed hwperfbin2jsont output."
  134. echo "| NOTE: For Volcanic Drivers ONLY"
  135. echo "+-----------------------------------------------------------------------------+"
  136. exit 0
  137. ;;
  138. -fw) HWPERF_FW_FILTER=$next
  139. skip_next="true"
  140. ;;
  141. -host) HWPERF_HOST_FILTER=$next
  142. skip_next="true"
  143. ;;
  144. -r) HWPERF_RESET_STREAMS="true"
  145. ;;
  146. -tlbin) RETAIN_TL_HEADERS=yes
  147. ;;
  148. -wa-v1cntids)
  149. HWPERF_V1CNT="true"
  150. ;;
  151. *) echo "[Error] Argument '$curr' not recognized."
  152. echo " Run '$0 -h' for more information."; exit 1 ;;
  153. esac
  154. done
  155. # ENVIRONMENT CHECK
  156. if [ x"$OS" = xANDROID ]; then
  157. TLD_BIN="$BIN_DIR/pvrtld"
  158. H2J_BIN="$BIN_DIR/$H2J_NAME"
  159. else
  160. TLD_BIN="`which \"pvrtld\"`"
  161. H2J_BIN="`which \"$H2J_NAME\"`"
  162. JSM_BIN="`which \"$JSM_NAME\"`"
  163. fi
  164. if [ x"$DEVICE" != xall ]; then
  165. if ! [ $DEVICE -ge $MIN_DEVICE_ID ] 2>/dev/null; then
  166. echo "[Error] invalid device id"
  167. exit 1
  168. fi
  169. if ! [ $DEVICE -le $MAX_DEVICE_ID ] 2>/dev/null; then
  170. echo "[Error] invalid device id"
  171. exit 1
  172. fi
  173. fi
  174. if [ ! -f "$TLD_BIN" ]; then
  175. echo "[Error] pvrtld not found"
  176. exit 1
  177. fi
  178. if [ x"$EXEC_LINE" != x ]; then
  179. if [ ! -f "$H2J_BIN" ]; then
  180. echo "[Error] hwperfbin2jsont not found"
  181. exit 1
  182. fi
  183. if [ "$HWPERF_V1CNT" = "true" ]; then
  184. EXEC_LINE="$EXEC_LINE -wa-v1cntids"
  185. fi
  186. fi
  187. # ENVIRONMENT VARIABLES
  188. WORK_DIR="$TMP_ROOT/hwperf/`date +%s`"
  189. OUT1_JSON_FILE_TMP="$WORK_DIR/$OUT1_JSON_FILE_TMP"
  190. OUT2_JSON_FILE_TMP="$WORK_DIR/$OUT2_JSON_FILE_TMP"
  191. if [ -n "$OUT3_JSON_FILE_TMP" ]; then
  192. OUT3_JSON_FILE_TMP="$WORK_DIR/$OUT3_JSON_FILE_TMP"
  193. fi
  194. OUT_JSON_MERGE_FILE_TMP="$WORK_DIR/$OUT_JSON_MERGE_FILE_TMP"
  195. CFG_FILE=$WORK_DIR/"tld.conf"
  196. TLD_LOG_FILE=$WORK_DIR/"tld.log"
  197. HWP_LOG_FILE=$WORK_DIR/"hwp.log"
  198. OUT1_FILE_TMP=$WORK_DIR/"hwperf_fw_*.*bin"
  199. OUT2_FILE_TMP=$WORK_DIR/"hwperf_host_*.*bin"
  200. OUT3_FILE_TMP=$WORK_DIR/"hwperf_client_*.*bin"
  201. OUT1_FILE="./"
  202. OUT2_FILE="./"
  203. OUT3_DIR="./"
  204. # check if any filter is enabled first so that we can terminate before any
  205. # filter is set
  206. if [ x"$HWPERF_FW_FILTER" != x ] || [ x"$HWPERF_HOST_FILTER" != x ]; then
  207. if [ x"$OS" = xANDROID ]; then
  208. USERID=$USER_ID
  209. else
  210. USERID=`id -u`
  211. fi
  212. # root privileges are needed to set filters - return error if executed
  213. # as regular user
  214. if [ "$USERID" != "0" ]; then
  215. echo "[Error] This script needs to be executed with root privileges"
  216. exit 1
  217. fi
  218. # if we have root privileges we can check for the debug files
  219. if [ -d "/sys/kernel/debug/pvr" ]; then
  220. DEBUG_DIR="/sys/kernel/debug/pvr"
  221. elif [ -d "/proc/pvr" ]; then
  222. DEBUG_DIR="/proc/pvr"
  223. else
  224. echo "Error: No valid debug path (Neither /sys/kernel/debug/pvr or /proc/pvr exist)"
  225. exit 1
  226. fi
  227. fi
  228. if [ x"$DEVICE" = xall ]; then
  229. DEVICES=$(seq $MIN_DEVICE_ID $MAX_DEVICE_ID)
  230. else
  231. DEVICES=$DEVICE
  232. fi
  233. # needs to be executed before "preserve_state"
  234. for ID in $DEVICES; do
  235. eval "HWPERF_FW_FILTER_FILE_$ID=\"$DEBUG_DIR/apphint/$ID/HWPerfFWFilter\""
  236. eval "HWPERF_HOST_FILTER_FILE_$ID=\"$DEBUG_DIR/apphint/$ID/HWPerfHostFilter\""
  237. done
  238. preserve_state
  239. export PVRDebugLevel=0x00
  240. for ID in $DEVICES; do
  241. eval "_FW_FILTER_FILE=\$HWPERF_FW_FILTER_FILE_$ID"
  242. eval "_HOST_FILTER_FILE=\$HWPERF_HOST_FILTER_FILE_$ID"
  243. if [ x"$HWPERF_FW_FILTER" != x ] || [ x"$HWPERF_HOST_FILTER" != x ]; then
  244. if [ x"$HWPERF_FW_FILTER" != x ]; then
  245. if [ ! -f $_FW_FILTER_FILE ] && [ x"$DEVICE" != xall ]; then
  246. echo "[Error] Could not set HW performance events filter"
  247. restore_state
  248. exit 1
  249. fi
  250. echo $HWPERF_FW_FILTER 2>/dev/null > $_FW_FILTER_FILE 2>/dev/null
  251. if [ $? != 0 ] && [ x"$DEVICE" != xall ]; then
  252. echo "[Error] Failed to set HW performance filter"
  253. echo " Check if the parameters passed to the script are valid"
  254. restore_state
  255. exit 1
  256. fi
  257. fi
  258. if [ x"$HWPERF_HOST_FILTER" != x ]; then
  259. if [ ! -f $_HOST_FILTER_FILE ] && [ x"$DEVICE" != xall ]; then
  260. echo "[Error] Could not set host events filter"
  261. restore_state
  262. exit 1
  263. fi
  264. echo $HWPERF_HOST_FILTER 2>/dev/null > $_HOST_FILTER_FILE 2>/dev/null
  265. if [ $? != 0 ] && [ x"$DEVICE" != xall ]; then
  266. echo "[Error] Failed to set host events filter"
  267. echo " Check if the parameters passed to the script are valid"
  268. restore_state
  269. exit 1
  270. fi
  271. fi
  272. fi
  273. done
  274. # ENVIRONMENT SETUP
  275. # - Create working directory
  276. mkdir -p $WORK_DIR
  277. # - Create configuration file
  278. echo "[pvrtld]
  279. output_folder_name=$WORK_DIR
  280. output_file_save_previous=yes" > $CFG_FILE
  281. if [ "$RETAIN_TL_HEADERS" = "yes" ]; then
  282. echo "omit_header=no" >> $CFG_FILE
  283. else
  284. echo "omit_header=yes" >> $CFG_FILE
  285. fi
  286. echo "
  287. [tlctrl]
  288. enabled=yes
  289. wait_for_stream=yes
  290. ctrl_stream=yes
  291. [hwperf_fw_]
  292. enabled=yes
  293. discover=yes
  294. wait_for_stream=yes
  295. server_block_nodata=no" >> $CFG_FILE
  296. # - Add the post processing command if the tool exists
  297. if [ x"$H2J_BIN" != x ] && [ x"$EXEC_LINE" != x ]; then
  298. echo "exec=\"$EXEC_LINE\"" >> $CFG_FILE
  299. fi
  300. if [ "$HWPERF_RESET_STREAMS" = "true" ]; then
  301. echo "reset_on_open=\"yes\"" >> $CFG_FILE
  302. fi
  303. if [ x"$DEVICE" != xall ]; then
  304. echo "device=$DEVICE" >> $CFG_FILE
  305. fi
  306. echo "
  307. [hwperf_host_]
  308. enabled=yes
  309. discover=yes
  310. wait_for_stream=yes" >> $CFG_FILE
  311. # - Add the post processing command if the tool exists
  312. if [ x"$H2J_BIN" != x ] && [ x"$EXEC_LINE" != x ]; then
  313. echo "exec=\"$EXEC_LINE\"" >> $CFG_FILE
  314. fi
  315. if [ "$HWPERF_RESET_STREAMS" = "true" ]; then
  316. echo "reset_on_open=\"yes\"" >> $CFG_FILE
  317. fi
  318. if [ x"$DEVICE" != xall ]; then
  319. echo "device=$DEVICE" >> $CFG_FILE
  320. fi
  321. echo "
  322. [hwperf_client_]
  323. enabled=yes
  324. discover=yes" >> $CFG_FILE
  325. # - Add the post processing command if the tool exists
  326. if [ x"$H2J_BIN" != x ] && [ x"$EXEC_LINE" != x ]; then
  327. echo "exec=\"$EXEC_LINE\"" >> $CFG_FILE
  328. fi
  329. if [ "$HWPERF_RESET_STREAMS" = "true" ]; then
  330. echo "reset_on_open=\"yes\"" >> $CFG_FILE
  331. fi
  332. if [ x"$DEVICE" != xall ]; then
  333. echo "device=$DEVICE" >> $CFG_FILE
  334. fi
  335. # EXECUTION
  336. echo "+-----------------------------------------------------------------------------+"
  337. echo "| Starting capture of HWPerf data..."
  338. echo "+-----------------------------------------------------------------------------+"
  339. echo "| Using these temporary files:"
  340. echo "| - TLDaemon configuration file: $CFG_FILE"
  341. echo "| - TLDaemon log file: $TLD_LOG_FILE"
  342. echo "| - HWPerf binary file(s): $OUT1_FILE_TMP"
  343. echo "| - HWPerfHost binary file(s): $OUT2_FILE_TMP"
  344. echo "| - HWPerfClient binary file(s): $OUT3_FILE_TMP"
  345. if [ x"$H2J_BIN" = x ] || [ x"$EXEC_LINE" = x ]; then
  346. echo "| - No JSON output selected"
  347. else
  348. echo "| - HWPerf raw json file(s): $OUT1_JSON_FILE_TMP"
  349. echo "| - HWPerfHost raw json file(s): $OUT2_JSON_FILE_TMP"
  350. echo "| - HWPerfClient raw json file: $OUT3_JSON_FILE_TMP"
  351. if [ x"$JSM_BIN" != x ] && [ x"$PYTHON_BIN" != x ] && [ x"$OUT_JSON_MERGE_FILE" != x ]; then
  352. echo "| - HWPerf merged json file(s): $OUT_JSON_MERGE_FILE_TMP"
  353. fi
  354. echo "| - JSON conversion log file: $TLD_LOG_FILE"
  355. fi
  356. echo "+-----------------------------------------------------------------------------+"
  357. $TLD_BIN -f=$CFG_FILE -q -s 2> $TLD_LOG_FILE
  358. TLD_RET=$?
  359. # LAST MESSAGES
  360. if [ "$TLD_RET" -ne "0" ]; then
  361. echo "+-----------------------------------------------------------------------------+"
  362. echo "| Capture process exited with error code $TLD_RET"
  363. else
  364. out1filecnt=$(ls $OUT1_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
  365. out2filecnt=$(ls $OUT2_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
  366. out3filecnt=$(ls $OUT3_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
  367. if [ $out1filecnt -ne 0 ] || [ $out2filecnt -ne 0 ] || [ $out3filecnt -ne 0 ]; then
  368. if [ x"$OUT1_JSON_FILE" != x ]; then
  369. out1jsonlist=$(ls $OUT1_JSON_FILE_TMP 2>>$HWP_LOG_FILE)
  370. out1jsonfilecnt=$(ls $OUT1_JSON_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
  371. fi
  372. if [ x"$OUT2_JSON_FILE" != x ]; then
  373. out2jsonfilecnt=$(ls $OUT2_JSON_FILE_TMP 2>>$HWP_LOG_FILE | wc -l 2>>$HWP_LOG_FILE)
  374. fi
  375. if [ x"$JSM_BIN" != x ] && [ x"$PYTHON_BIN" != x ] && [ x"$OUT_JSON_MERGE_FILE" != x ]; then
  376. echo "+-----------------------------------------------------------------------------+"
  377. echo "| Merging JSON files..."
  378. echo "+-----------------------------------------------------------------------------+"
  379. for i in $out1jsonlist; do
  380. DEVICE_ID_POSTFIX=$(echo $i | sed -n /.*$OUT1_JSON_FILE_PREFIX/s/.*$OUT1_JSON_FILE_PREFIX//p)
  381. $PYTHON_BIN $JSM_BIN -d $WORK_DIR -f $OUT1_JSON_FILE_PREFIX$DEVICE_ID_POSTFIX \
  382. -s $OUT2_JSON_FILE_PREFIX$DEVICE_ID_POSTFIX \
  383. -o $WORK_DIR/$OUT_JSON_MERGE_FILE_PREFIX$DEVICE_ID_POSTFIX
  384. done
  385. fi
  386. echo "+-----------------------------------------------------------------------------+"
  387. echo "| Data captured, files moved to CWD."
  388. if [ $out1filecnt -ne 0 ]; then
  389. mv $OUT1_FILE_TMP $OUT1_FILE
  390. fi
  391. if [ x"$OUT1_JSON_FILE" != x ] && [ $out1jsonfilecnt -ne 0 ]; then
  392. mv $OUT1_JSON_FILE_TMP $OUT1_JSON_FILE
  393. fi
  394. if [ $out2filecnt -ne 0 ]; then
  395. mv $OUT2_FILE_TMP $OUT2_FILE
  396. fi
  397. if [ x"$OUT2_JSON_FILE" != x ] && [ $out2jsonfilecnt -ne 0 ]; then
  398. mv $OUT2_JSON_FILE_TMP $OUT2_JSON_FILE
  399. fi
  400. if [ x"$OUT_JSON_MERGE_FILE" != x ]; then
  401. if [ $(ls $OUT_JSON_MERGE_FILE_TMP | wc -l 2>>$HWP_LOG_FILE) -ne 0 ]; then
  402. mv $OUT_JSON_MERGE_FILE_TMP $OUT_JSON_MERGE_FILE
  403. fi
  404. fi
  405. if ls $OUT3_FILE_TMP >>$HWP_LOG_FILE 2>&1; then
  406. mv $OUT3_FILE_TMP $OUT3_DIR
  407. if [ -n "$OUT3_JSON_FILE_TMP" ] && ls $OUT3_JSON_FILE_TMP >>$HWP_LOG_FILE 2>&1; then
  408. mv $OUT3_JSON_FILE_TMP $OUT3_JSON_DIR
  409. fi
  410. fi
  411. else
  412. echo "+-----------------------------------------------------------------------------+"
  413. echo "| No data captured, binary files do not exist."
  414. fi
  415. fi
  416. # Give time for the Log file to be flushed to disk
  417. sync
  418. if [ "$CAT_LOG" = "yes" ]; then
  419. echo "+-----------------------------------------------------------------------------+"
  420. echo "| TLDaemon debug log file..."
  421. echo "| $TXT_READER $TLD_LOG_FILE"
  422. echo "+-----------------------------------------------------------------------------+"
  423. $TXT_READER $TLD_LOG_FILE
  424. echo "+-----------------------------------------------------------------------------+"
  425. echo "| pvrhwperf debug log file..."
  426. echo "| $TXT_READER $HWP_LOG_FILE"
  427. echo "+-----------------------------------------------------------------------------+"
  428. $TXT_READER $HWP_LOG_FILE
  429. fi
  430. echo "+-----------------------------------------------------------------------------+"
  431. restore_state