blob: 2f7940ec9fedcce61b36113cbcdf4ac25034b59a [file] [log] [blame]
#!/system/bin/sh
#set -x
###### KNOWN ISSUES ######
# - qbpfs pull is returning $?=0 when it fails
# - AP needs a more deterministic way of detecting the max dumps the BP will
# store. Otherwise the script will fail to calculate the rollover back
# to index 0.
###### FUNCTIONS ######
setupDirs() {
case $parentExists in
1)
outDirRoot=$1
outDirBranch=$2
;;
0)
outDirRoot="/data/misc/ril"
outDirBranch="bp-dump/${timestamp}/qcom"
cd $outDirRoot
case $? in 0) ;; *) echo "Couldn\'t cd to $outDirRoot"; exit 1;; esac
# Set delimiter to slash for separating directories
OIFS=$IFS; IFS='/'
for dir in $outDirBranch; do
mkdir "$dir" 2>/dev/null
cd "$dir" 2>&1
case $? in 0) ;; *) echo "Couldn\'t cd to $dir"; exit 1;; esac
outDirBranchUnwind="$dir $outDirBranchUnwind"
done
IFS=$OIFS
;;
esac
outDir="${outDirRoot}/${outDirBranch}"
}
processLogs() {
# Initialize communication with the BP
qbpfs hello
case $? in 0) ;; *) echo "qbpfs hello failed"; return;; esac
local maxIndexes=$1
local nextErrIndex=""
local indexesToPull=""
case $maxIndexes in
0)
echo "Nothing to do for indexes=0"
return
;;
1)
# If we only support one dump, then we can detect when it has finished
# by first removing the err_index.txt and then watching for it to
# reappear.
qbpfs rm "/err/err_index.txt"
indexesToPull="00"
nextErrIndex="00"
;;
*)
# If we support more than one dump, we can watch the index to change.
qbpfs pull "/err/err_index.txt" "${outDir}/err_index.txt" 2>&1
local lastErrIndex=`cat ${outDir}/err_index.txt`
rm "${outDir}/err_index.txt"
case $maxIndexes in
2)
indexesToPull="00 01"
case $lastErrIndex in
"") nextErrIndex="00";;
00) nextErrIndex="01";;
01) nextErrIndex="00";;
esac
;;
3)
indexesToPull="00 01 02"
case $lastErrIndex in
"") nextErrIndex="00";;
00) nextErrIndex="01";;
01) nextErrIndex="02";;
02) nextErrIndex="00";;
esac
;;
4)
indexesToPull="00 01 02 03"
case $lastErrIndex in
"") nextErrIndex="00";;
00) nextErrIndex="01";;
01) nextErrIndex="02";;
02) nextErrIndex="03";;
03) nextErrIndex="00";;
esac
;;
*)
echo "No support for indexes=$maxIndexes"
return
;;
esac
;;
esac
# Trigger dump from RAM to EFS
echo dump_log > /sys/class/radio/mdm6600/command
local errIndex=""
# Loop until err_index.txt changes
for i in 1 2 3 4 5 ; do
qbpfs ls # This defeats a dir caching bug in the BP
qbpfs pull "/err/err_index.txt" "${outDir}/err_index.txt" 2>&1
errIndex=$(cat ${outDir}/err_index.txt)
rm "${outDir}/err_index.txt"
case $errIndex in
$nextErrIndex)
break
;;
*)
case $i in
5) echo "Could not find BP log after $i attempts"; return;;
*) echo "No change to err_index.txt: $errIndex"; sleep 1;;
esac
;;
esac
done
# Dump err_index.txt
echo "file:begin:txt:${outDirBranch}/err_index.txt"
echo "$errIndex"
echo "file:end:txt:${outDirBranch}/err_index.txt"
# Do NOT redirect stderr to stdout for bin files. It may confuse the base64 decoder.
for i in $indexesToPull ; do
dataIndexFile="err_data_index${i}_log00.txt"
qbpfs pull "/err/${dataIndexFile}" "${outDir}/${dataIndexFile}" 2>&1
case $? in 0) ;; *) echo "qbpfs pull failed for /err/${dataIndexFile}"; continue;; esac
echo "file:begin:txt:${outDirBranch}/${dataIndexFile}"
cat "${outDir}/${dataIndexFile}"
catRes=$?
echo "file:end:txt:${outDirBranch}/${dataIndexFile}"
rm "${outDir}/${dataIndexFile}"
case $catRes in 0) ;; *) echo "cat failed for /err/${dataIndexFile}"; continue;; esac
binFileExtensions="crs f3 id"
for ext in $binFileExtensions; do
binFile="err_f3_index${i}.${ext}"
qbpfs pull "/err/${binFile}" "${outDir}/${binFile}" 2>&1
case $? in 0) ;; *) echo "qbpfs pull failed for /err/${binFile}"; continue;; esac
base64 -e "${outDir}/${binFile}" "${outDir}/${binFile}-base64" 2>&1
case $? in
0)
;;
*)
echo "base64 failed for ${outDir}/${binFile}"
rm "${outDir}/${binFile}"
continue
;;
esac
echo "file:begin:bin:${outDirBranch}/${binFile}"
cat "${outDir}/${binFile}-base64"
catRes=$?
echo "file:end:bin:${outDirBranch}/${binFile}"
case $catRes in 0) ;; *) "cat failed for ${outDir}/${binFile}-base64";; esac
rm "${outDir}/${binFile}" "${outDir}/${binFile}-base64"
done
done
}
cleanupDirs() {
case $parentExists in
0)
# Cleanup output dirs
cd $outDir
case $? in 0) ;; *) echo "Couldn\'t cd to $outDir"; exit 1;; esac
for dir in $outDirBranchUnwind; do
cd ..
rmdir $dir
done
;;
esac
}
###### MAIN ROUTINE ######
# Generate a timestamp if none passed in from parent script
case $1 in
"") timestamp=$(date +'%Y-%m-%d_%H-%M-%S'); parentExists=0;;
*) timestamp=$1; parentExists=1;;
esac
echo "Dumping QCOM BP logs @ $timestamp"
setupDirs $2 $3
processLogs 2
cleanupDirs