From ae98262bb788599bc1dfc9d9e5521a9d6bcc19e4 Mon Sep 17 00:00:00 2001 From: "Dr. Christian Giessen" Date: Wed, 22 Apr 2026 20:05:17 +0000 Subject: [PATCH] Fix Constant-YOP table, Type 18, truncation guards Type 9 Constant-YOP: Implement exact constant table from docs. Index = (YY<<2)|CC, value = 1<size instead of checking op->size after it was set to 3. (was: always true, guards never triggered) --- examples/build/type18_test.dsp | 17 +++++++++++++++++ r2plugin/asm_adsp219x.c | 30 ++++++++++++++++++++---------- r2plugin/asm_adsp219x.so | Bin 28512 -> 28512 bytes 3 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 examples/build/type18_test.dsp diff --git a/examples/build/type18_test.dsp b/examples/build/type18_test.dsp new file mode 100644 index 0000000..172974a --- /dev/null +++ b/examples/build/type18_test.dsp @@ -0,0 +1,17 @@ +/* + * type18_test.dsp -- Verify Type 18 mode control encoding. + */ + .section/PM program0; + .global _start; +_start: + ena ar_sat; + dis ar_sat; + ena m_mode; + dis m_mode; + ena bit_rev; + dis bit_rev; + ena timer; + dis timer; + nop; +_halt: + jump _halt; diff --git a/r2plugin/asm_adsp219x.c b/r2plugin/asm_adsp219x.c index 3a83c5f..16ea33d 100644 --- a/r2plugin/asm_adsp219x.c +++ b/r2plugin/asm_adsp219x.c @@ -61,10 +61,11 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask) { ut32 ins, ins2 = 0; const ut8 *b = op->bytes; - if (op->size < 3) return false; + int avail = op->size; + if (avail < 3) return false; ins = ((ut32) b[0] << 16) | ((ut32) b[1] << 8) | (ut32) b[2]; - if (op->size >= 6) + if (avail >= 6) ins2 = ((ut32) b[3] << 16) | ((ut32) b[4] << 8) | (ut32) b[5]; op->size = 3; op->type = R_ANAL_OP_TYPE_UNK; @@ -217,13 +218,22 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask) return true; } - /* Constant YOP form: CC=bits7-6, BO=bits5-4 */ + /* Constant YOP form: YY=bits12-11, CC=bits7-6, BO=bits5-4. + Index = (YY<<2)|CC. BO=01: val = 1<> 11) & 0x3; ut32 cc = (ins >> 6) & 0x3; ut32 bo = (ins >> 4) & 0x3; - int val = (int) cc; - if (bo & 0x2) - val = -val; + ut32 idx = (yy << 2) | cc; + int32_t val; + if (idx == 15) + val = (bo & 0x2) ? 32767 : -32768; + else if (bo & 0x2) + val = -((int32_t)(1 << idx)) - 1; + else + val = (int32_t)(1 << idx); op->mnemonic = r_str_newf ("%s%s%s%s = %s(%s, %d)", cp, cs, sp, dst, f, x, val); return true; @@ -285,7 +295,7 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask) /* Type 36: Long Jump/Call (2-word, bits 23-16 = 00000101) */ if ((ins >> 16) == 0x05) { - if (op->size < 6) + if (avail < 6) { op->mnemonic = r_str_newf ("trunc L%s 0x%06X", ((ins >> 12) & 1) ? "CALL" : "JUMP", ins); @@ -314,7 +324,7 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask) /* Type 22: DM/PM = Data16 (2-word, bits 23-13 = 00000011110) */ if ((ins >> 13) == 0x1E && !((ins >> 12) & 1)) { - if (op->size < 6) + if (avail < 6) { op->mnemonic = r_str_newf ("trunc DM_IMM16 0x%06X", ins); @@ -336,7 +346,7 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask) /* Type 22a: PM = Data24 (2-word, bits 23-13 = 00000011111) */ if ((ins >> 13) == 0x1F) { - if (op->size < 6) + if (avail < 6) { op->mnemonic = r_str_newf ("trunc PM_IMM24 0x%06X", ins); @@ -512,7 +522,7 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask) for (i = 0; i < 8; i++) { ut32 v = (ins >> (i * 2)) & 0x3; - if (v == 1) + if (v == 2) pos += snprintf (buf + pos, sizeof (buf) - pos, "%sDIS %s", pos ? ", " : "", mbits[i]); diff --git a/r2plugin/asm_adsp219x.so b/r2plugin/asm_adsp219x.so index 967848e94a2ac305f5f87b9cfed0f605215fc472..8e1ced56cd1968cbed9d42c28c2351d5ebed2208 100755 GIT binary patch literal 28512 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 literal 28512 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∋q_bhBgHo=>ZGfcn(8TM{r|X$NGl0U{k20t2@}R zxkog1Z0c-l4mCIB=1t8(4_#=*Qxv)ywgmAdgsv@OLs!G5=3vw2O`EnrB%u}rXJ`^@ zL-(eMhc3Xbjm@DT9`7LV%A>cX^tOcF@&!Gop|yQO2aIp*XlfQc9i74Mmevg+(Y+zq zjvl*3!=??vO%08bHneS)EL3moXm6qiLWnJpA%J9wf$Bszt#1u=%K@&e_LO^r-ik7M z5(SNn2Ho8eY-wn3q6bivt*P*o`%8i1Ssy{KFQ^23Wz~T2tO^!g6{sxn1cH?-SK`}Y z!CFsAzzc;m{{Qd+7n2`O!OyHHPJHgfC7xJeJVhhn0T}Xu8gSv~AE%)njWJ1kaME)$ zCN+uN?k$@_4eLQeU5d7Fsl6lAoV&4obME@ht!+((f&3qot zO-2uT8#RIEqJ$rub+CNBE-=l}oV+jO{TwS;jsoo=S)TWqOh+{%^@~%^#J-jHf5pH^ zH_P+BmFZrzB_5qyeCetpSK&^oLWqlDtp7#Mv z`F?}>&GG-Wmgo5s#hO#oUr#tz;cU0&5>KE&<7avExl#qpsHxfiKN|9Bs}v*CPEww5 znEn3*ZL}BX_~LyrQXMJC=4 zqeL#Akk|WAzMmS@<7dBdzZ?gD3faW|Ie#!yH`)^qmS=hdjfwJn-^(;FQ5a>GV>)8U zyX%zz(<)V+cy~{fRACf^bn*CkpUIT_VKMCvu8NOQBFwat