Squash of rizinorg/rizin PR #6434 ("improve TMS320C55x+ analysis and RzIL") rebased onto dev, with the PR head's doubled c55plus_il.c (every symbol defined twice, failing to compile) de-duplicated to a single clean copy. Substantially extends the C55x/C55x+ RzIL lifter over the existing structured- operand helpers: mov/copy (immediate, register, memory load/store, half-register read-modify-write), the full addressing-mode set with post-modify side effects, control and system-register moves, 40-bit accumulator ALU with shifted sources, 16-bit and dual-memory add/sub, the ST0_55 status-flag model (cmp/cmpand/rol/ror, named-bit bset/bclr), a documented psh/pop stack model, address-unit amov/aadd/ asub and amar, and bcc/callcc control transfer. The multiply/MAC family and satr are lifted with explicit, documented integer-mode approximations (not verified DSP semantics); irreducibly multi-output primitives (bit counts, Viterbi, FIR, distance) are left correct-or-NULL. The register file covers ac0-7 and xar, found by validating on real Motorola Wrigley C55x+ firmware whose prologues save 40-bit accumulators as dbl(acN)+acN.g pairs. Adds RzIL-VM emulation tests (including the C55x and C55x+ _decrypt emulateme binaries), per-instruction IL assertions, and ~95% instruction-class disassembly coverage per corpus; pins little-endian in the VM tests for big-endian hosts; and regenerates the analysis expectations against current dev.
111 lines
4 KiB
Text
111 lines
4 KiB
Text
|
|
NAME=arp TMS320 c55x
|
|
FILE==
|
|
CMDS=<<EOF
|
|
e asm.arch=tms320
|
|
e analysis.arch=tms320
|
|
e analysis.cpu=c55x
|
|
arp
|
|
ar
|
|
EOF
|
|
EXPECT=<<EOF
|
|
=PC pc
|
|
=A0 ar0
|
|
=A1 ar1
|
|
=A2 ar2
|
|
=A3 ar3
|
|
=A4 ar4
|
|
=R0 ar0
|
|
ctr ac0 .40 496 0 # Accumulator 0
|
|
ctr ac1 .40 501 0 # Accumulator 1
|
|
ctr ac2 .40 506 0 # Accumulator 2
|
|
ctr ac3 .40 511 0 # Accumulator 3
|
|
gpr ar0 .16 516 0 # Auxiliary registers 0
|
|
gpr ar1 .16 518 0 # Auxiliary registers 1
|
|
gpr ar2 .16 520 0 # Auxiliary registers 2
|
|
gpr ar3 .16 522 0 # Auxiliary registers 3
|
|
gpr ar4 .16 524 0 # Auxiliary registers 4
|
|
gpr ar5 .16 526 0 # Auxiliary registers 5
|
|
gpr ar6 .16 528 0 # Auxiliary registers 6
|
|
gpr ar7 .16 530 0 # Auxiliary registers 7
|
|
gpr xar0 .23 532 0 # Extended auxiliary registers 0
|
|
gpr xar1 .23 535 0 # Extended auxiliary registers 1
|
|
gpr xar2 .23 538 0 # Extended auxiliary registers 2
|
|
gpr xar3 .23 541 0 # Extended auxiliary registers 3
|
|
gpr xar4 .23 544 0 # Extended auxiliary registers 4
|
|
gpr xar5 .23 547 0 # Extended auxiliary registers 5
|
|
gpr xar6 .23 550 0 # Extended auxiliary registers 6
|
|
gpr xar7 .23 553 0 # Extended auxiliary registers 7
|
|
ctr bk03 .16 556 0 # Circular buffer size registers
|
|
ctr bk47 .16 558 0 # Circular buffer size registers
|
|
ctr bkc .16 560 0 # Circular buffer size registers
|
|
ctr brc0 .16 562 0 # Block-repeat counters 0
|
|
ctr brc1 .16 564 0 # Block-repeat counters 1
|
|
ctr brs1 .16 566 0 # BRC1 save register
|
|
ctr bsa01 .16 568 0 # Circular buffer start address registers
|
|
ctr bsa23 .16 570 0 # Circular buffer start address registers
|
|
ctr bsa45 .16 572 0 # Circular buffer start address registers
|
|
ctr bsa67 .16 574 0 # Circular buffer start address registers
|
|
ctr bsac .16 576 0 # Circular buffer start address registers
|
|
ctr cdp .16 578 0 # Coefficient data pointer (low part of XCDP)
|
|
ctr cdph .7 580 0 # High part of XCDP
|
|
ctr cfct .8 581 0 # Control-flow context register
|
|
ctr csr .16 582 0 # Computed single-repeat register
|
|
ctr dbier0 .16 584 0 # Debug interrupt enable registers 0
|
|
ctr dbier1 .16 586 0 # Debug interrupt enable registers 1
|
|
ctr dp .16 588 0 # Data page register (low part of XDP)
|
|
ctr dph .7 590 0 # High part of XDP
|
|
ctr ier0 .16 591 0 # Interrupt enable registers 0
|
|
ctr ier1 .16 593 0 # Interrupt enable registers 1
|
|
ctr ifr0 .16 595 0 # Interrupt flag registers 0
|
|
ctr ifr1 .16 597 0 # Interrupt flag registers 1
|
|
ctr ivpd .16 599 0 # Interrupt vector pointers
|
|
ctr ivph .16 601 0 # Interrupt vector pointers
|
|
ctr pc .24 603 0 # Program counter
|
|
ctr pdp .9 606 0 # Peripheral data page register
|
|
ctr rea0 .24 608 0 # Block-repeat end address registers 0
|
|
ctr rea1 .24 611 0 # Block-repeat end address registers 1
|
|
ctr reta .24 614 0 # Return address register
|
|
ctr rptc .16 617 0 # Single-repeat counter
|
|
ctr rsa0 .24 619 0 # Block-repeat start address registers 0
|
|
ctr rsa1 .24 622 0 # Block-repeat start address registers 1
|
|
ctr sp .16 625 0 # Data stack pointer (low part of XSP)
|
|
ctr sph .7 627 0 # High part of XSP and XSSP
|
|
ctr ssp .16 628 0 # System stack pointer (low part of XSSP)
|
|
ctr st0_55 .16 630 0 # Status registers 0
|
|
ctr st1_55 .16 632 0 # Status registers 1
|
|
ctr st2_55 .16 634 0 # Status registers 2
|
|
ctr st3_55 .16 636 0 # Status registers 3
|
|
ctr t0 .16 638 0 # Temporary register 0
|
|
ctr t1 .16 640 0 # Temporary register 1
|
|
ctr t2 .16 642 0 # Temporary register 2
|
|
ctr t3 .16 644 0 # Temporary register 3
|
|
ctr trn0 .16 646 0 # Transition registers 1
|
|
ctr trn1 .16 648 0 # Transition registers 1
|
|
ctr xcdp .23 650 0 # Extended coefficient data pointer
|
|
ctr xdp .23 653 0 # Extended data page register
|
|
ctr xsp .23 656 0 # Extended data stack pointer
|
|
ctr xssp .23 659 0 # Extended system stack pointer
|
|
ctr ac4 .40 664 0 # Accumulator 4
|
|
ctr ac5 .40 669 0 # Accumulator 5
|
|
ctr ac6 .40 674 0 # Accumulator 6
|
|
ctr ac7 .40 679 0 # Accumulator 7
|
|
|
|
ar0 = 0x0000
|
|
ar1 = 0x0000
|
|
ar2 = 0x0000
|
|
ar3 = 0x0000
|
|
ar4 = 0x0000
|
|
ar5 = 0x0000
|
|
ar6 = 0x0000
|
|
ar7 = 0x0000
|
|
xar0 = 0x000000
|
|
xar1 = 0x000000
|
|
xar2 = 0x000000
|
|
xar3 = 0x000000
|
|
xar4 = 0x000000
|
|
xar5 = 0x000000
|
|
xar6 = 0x000000
|
|
xar7 = 0x000000
|
|
EOF
|
|
RUN
|