88 lines
3.0 KiB
Bash
Executable File
88 lines
3.0 KiB
Bash
Executable File
#!/bin/bash
|
|
#
|
|
# This is a utility to deploy and run a simple Hexagon-based binary to the
|
|
# Hexagon simulator.
|
|
#
|
|
# Note that the binary must be built with the same HEXAGON_SDK_ROOT,
|
|
# HEXAGON_TOOLS_ROOT, HEXAGON_ARCH, and HEXAGON_TOOL_VER specified here,
|
|
# otherwise runtime errors will likely occur.
|
|
#
|
|
# Syntax: run-on-hexagon-sim.sh path-to-binary
|
|
|
|
set -e
|
|
|
|
if [ -z "$HEXAGON_SDK_ROOT" ]; then
|
|
echo "HEXAGON_SDK_ROOT must be set!"
|
|
exit 1
|
|
fi
|
|
|
|
if [ -z "$HEXAGON_TOOLS_ROOT" ]; then
|
|
echo "HEXAGON_TOOLS_ROOT must be set!"
|
|
exit 1
|
|
fi
|
|
|
|
# These should match the versions specified in hexagon.toolchain
|
|
: "${HEXAGON_ARCH:=v68}"
|
|
: "${HEXAGON_TOOL_VER:=v86}"
|
|
|
|
BINARY_PATH=$1
|
|
[ -z "$BINARY_PATH" ] && echo "You must specify a path to the binary as the first argument" && exit 1
|
|
shift
|
|
|
|
EXE_NAME="$(basename ${BINARY_PATH})"
|
|
HEXAGON_LIBS_DIR=${HEXAGON_TOOLS_ROOT}/lib
|
|
HEXAGON_LIBC_DIR="${HEXAGON_TOOLS_ROOT}/target/hexagon/lib/${HEXAGON_ARCH}/G0/pic"
|
|
HEXAGON_SIM="${HEXAGON_TOOLS_ROOT}/bin/hexagon-sim"
|
|
SIM_STACK_SIZE=0x400000 # 4 MB
|
|
|
|
# Copy everything into a temp dir to avoid scrambling our build (etc) dirs.
|
|
HVX_SIM_TEMP_DIR=$(mktemp -d)
|
|
|
|
### Create configuration files for Hexagon simulator's cosimulation plugins
|
|
echo "${HVX_SIM_TEMP_DIR}/qtimer.so --csr_base=0xFC900000 --irq_p=1 --freq=19200000 --cnttid=1" > ${HVX_SIM_TEMP_DIR}/q6ss.cfg
|
|
echo "${HVX_SIM_TEMP_DIR}/l2vic.so 32 0xFC910000" >> ${HVX_SIM_TEMP_DIR}/q6ss.cfg
|
|
|
|
### Create RTOS config files
|
|
echo "${HVX_SIM_TEMP_DIR}/qurt_model.so" > ${HVX_SIM_TEMP_DIR}/osam.cfg
|
|
|
|
# Copy the executable and a bunch of helper libs into the same dir;
|
|
# trying to get the library loading correct otherwise is far too tricky.
|
|
cp -f ${BINARY_PATH} ${HVX_SIM_TEMP_DIR}/${EXE_NAME}
|
|
cp -f ${HEXAGON_SDK_ROOT}/libs/run_main_on_hexagon/ship/hexagon_tool${HEXAGON_TOOL_VER}_${HEXAGON_ARCH}/run_main_on_hexagon_sim ${HVX_SIM_TEMP_DIR}/
|
|
cp -f ${HEXAGON_SDK_ROOT}/rtos/qurt/compute${HEXAGON_ARCH}/debugger/lnx64/qurt_model.so ${HVX_SIM_TEMP_DIR}/
|
|
cp -f ${HEXAGON_SDK_ROOT}/rtos/qurt/compute${HEXAGON_ARCH}/sdksim_bin/runelf.pbn ${HVX_SIM_TEMP_DIR}/
|
|
cp -f ${HEXAGON_LIBS_DIR}/iss/l2vic.so ${HVX_SIM_TEMP_DIR}/
|
|
cp -f ${HEXAGON_LIBS_DIR}/iss/qtimer.so ${HVX_SIM_TEMP_DIR}/
|
|
cp -f ${HEXAGON_LIBC_DIR}/libc++abi.so.1 ${HVX_SIM_TEMP_DIR}/
|
|
cp -f ${HEXAGON_LIBC_DIR}/libc++abi.so.1.0 ${HVX_SIM_TEMP_DIR}/
|
|
cp -f ${HEXAGON_LIBC_DIR}/libc++.so.1 ${HVX_SIM_TEMP_DIR}/
|
|
cp -f ${HEXAGON_LIBC_DIR}/libc++.so.1.0 ${HVX_SIM_TEMP_DIR}/
|
|
|
|
### Invoke the simulator for executable
|
|
cd ${HVX_SIM_TEMP_DIR}
|
|
|
|
LD_LIBRARY_PATH=${HVX_SIM_TEMP_DIR}:${LD_LIBRARY_PATH} \
|
|
${HEXAGON_SIM} \
|
|
-m${HEXAGON_ARCH} \
|
|
--simulated_returnval \
|
|
--usefs . \
|
|
--pmu_statsfile ${HVX_SIM_TEMP_DIR}/pmu_stats.txt \
|
|
--cosim_file ${HVX_SIM_TEMP_DIR}/q6ss.cfg \
|
|
--l2tcm_base 0xd800 \
|
|
--rtos ${HVX_SIM_TEMP_DIR}/osam.cfg \
|
|
${HVX_SIM_TEMP_DIR}/runelf.pbn \
|
|
-- \
|
|
${HVX_SIM_TEMP_DIR}/run_main_on_hexagon_sim \
|
|
stack_size=${SIM_STACK_SIZE} \
|
|
-- \
|
|
${HVX_SIM_TEMP_DIR}/${EXE_NAME} $@
|
|
|
|
if (($? != 0 )); then
|
|
echo "Simulator run failed!"
|
|
rm -rf "${HVX_SIM_TEMP_DIR}"
|
|
exit 1
|
|
fi
|
|
|
|
### Cleanup
|
|
rm -rf "${HVX_SIM_TEMP_DIR}"
|