blob: 36166dd99d8ffd361ecd0f315a93aefd66a935d6 [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#!/bin/sh
2set -e
3
4peek4()
5{
6 FILE="$1"
7 OFFSET="$2"
8 COUNT="$3"
9 if [ -z "$OFFSET" ]; then
10 OFFSET=0
11 fi
12 if [ -z "$COUNT" ]; then
13 COUNT=1
14 fi
15 dd if="$FILE" bs=4 count=$COUNT skip=$(($OFFSET / 4)) status=none | hexdump -v -e '/4 "%08X\n"'
16}
17
18while [ -n "$1" ]; do
19 BIN="$1"
20 shift
21 MAGIC="$(peek4 "$BIN")"
22 if [ "$MAGIC" != "43504450" ]; then # CPDP
23 echo "$BIN is not a CP ramdump file!"
24 continue
25 fi
26 NR_FILES="$(peek4 "$BIN" 4)"
27 NR_FILES=$((0x$NR_FILES))
28 if [ $NR_FILES -eq 0 ]; then
29 echo "$BIN contains no dump files"
30 continue
31 else
32 echo "$BIN contains $NR_FILES dump files"
33 fi
34 OUTDIR="${BIN%.bin}-unpacked"
35 mkdir -p "$OUTDIR"
36 N=0
37 for I in `seq 0 $(($NR_FILES - 1))`; do
38 OFS=$(($I * 136 + 8))
39 FNAME="$(printf '%s' "$(dd if="$BIN" bs=1 count=128 skip=$OFS status=none)")"
40 OFS=$(($OFS + 128))
41 FILEOFS=$((0x`peek4 "$BIN" $OFS`))
42 OFS=$(($OFS + 4))
43 FILELEN=$((0x`peek4 "$BIN" $OFS`))
44 echo "$I. $FNAME|$FILEOFS|$FILELEN"
45 if [ $FILELEN -ne 0 ]; then
46 tail -c +$(($FILEOFS + 1)) "$BIN" | head -c $FILELEN > "$OUTDIR/$FNAME"
47 N=$(($N + 1))
48 fi
49 done
50 echo "$N dump files unpacked under $OUTDIR"
51 BASE="$(basename "$BIN")"
52 SFX="$(echo "$BASE" | sed 's/^COM_DDR_//')"
53 if [ -n "$SFX" -a "$SFX" != "$BASE" ]; then
54 DIR="$(dirname "$BIN")"
55 if [ -e "$OUTDIR/com_DSP_DDR.bin" -o -e "$OUTDIR/com_dsp_ddr.bin" ]; then
56 rm -fv "$DIR"/*"DSP_DDR_$SFX" "$DIR"/*"dsp_ddr_$SFX"
57 else
58 mv -v "$DIR"/*"DSP_DDR_$SFX" "$DIR"/*"dsp_ddr_$SFX" "$OUTDIR" || true
59 fi
60 for C in "$DIR"/com_dspdump_*; do
61 [ -e "$C" ] && mv -v "$C" "$OUTDIR" || true
62 done
63 for C in "$DIR"/com_extra_*; do
64 [ -e "$C" ] && mv -v "$C" "$OUTDIR" || true
65 done
66 fi
67done