From de067535202d1f590d46467dd0045deb5ebd5bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gie=C3=9Fen?= Date: Wed, 22 Apr 2026 22:39:53 +0200 Subject: [PATCH] Clean up plugin build workflow and docs --- .gitignore | 3 +++ README.md | 23 ++++++++++++++++------- r2plugin/Makefile | 25 +++++++++++++++++-------- r2plugin/README.md | 10 ++++++++++ r2plugin/asm_adsp219x.c | 2 ++ r2plugin/asm_adsp219x.so | Bin 28512 -> 0 bytes 6 files changed, 48 insertions(+), 15 deletions(-) create mode 100644 .gitignore delete mode 100755 r2plugin/asm_adsp219x.so diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f72f18f --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +r2plugin/*.so +examples/build/*.o +examples/build/*.elf diff --git a/README.md b/README.md index 52f7d1d..132aa1d 100644 --- a/README.md +++ b/README.md @@ -24,14 +24,23 @@ engineering ADSP-2191 firmware. ## Plugin Status -Currently decodes: NOP, IDLE, Type 1 (multifunction), Type 3 -(direct memory), Type 4 (compute + memory), Type 6/7 (immediate -loads), Type 10/10a (jump/call), Type 17 (reg move), Type 20 -(RTS/RTI). +The decoder now covers most ADSP-219x instruction types and has +assembler verification for 34 of 37 documented opcode families. -Work in progress: Type 9/9a (standalone compute), Type 11 -(DO UNTIL), Type 15 (shift), Type 18 (mode control), Type 25 -(saturate). +Assembler-verified coverage includes: + +- Types 1, 3, 4, 6, 7, 8, 9, 9a, 10, 10a, 11, 12, 14, 15, 16, + 17, 18, 19, 20, 21, 21a, 23, 24, 25, 26, 29, 30, 32, 33, 34, + 35, 36, 37 + +Structural-only coverage remains for: + +- Type 22 / 22a (2-word immediate data write) +- Type 31 (IDLE) +- Type 32a (DAG register store with transfer) + +For the current verification matrix and test inputs, see +`r2plugin/TESTING.md`. ## Assembler diff --git a/r2plugin/Makefile b/r2plugin/Makefile index 1449d1c..7b80baf 100644 --- a/r2plugin/Makefile +++ b/r2plugin/Makefile @@ -1,15 +1,24 @@ -NAME=asm_adsp219x -R2_PLUGINS=$(shell r2 -H R2_USER_PLUGINS) -R2_INCDIR=$(shell r2 -H R2_INCDIR) -R2_LIBDIR=$(shell r2 -H R2_LIBDIR) +NAME ?= asm_adsp219x +CC ?= gcc +CFLAGS ?= -Wall -Wextra -O2 -fPIC +LDFLAGS ?= +LDLIBS ?= -lr_arch -lr_util + +R2_PLUGINS := $(shell r2 -H R2_USER_PLUGINS) +R2_INCDIR := $(shell r2 -H R2_INCDIR) +R2_LIBDIR := $(shell r2 -H R2_LIBDIR) + +CPPFLAGS += -I$(R2_INCDIR) -I$(R2_INCDIR)/sdb all: $(NAME).so $(NAME).so: $(NAME).c - gcc -shared -Wall -O2 -fPIC \ - -I$(R2_INCDIR) -I$(R2_INCDIR)/sdb \ + $(CC) $(CPPFLAGS) $(CFLAGS) -shared $(LDFLAGS) \ -L$(R2_LIBDIR) \ - $(NAME).c -o $@ -lr_arch -lr_util + $< -o $@ $(LDLIBS) + +test: $(NAME).so + r2 -q -a adsp219x -L ./$(NAME).so -b 24 -c "pd 48" ../examples/isa_test.bin >/dev/null install: $(NAME).so mkdir -p $(R2_PLUGINS) @@ -21,4 +30,4 @@ uninstall: clean: rm -f $(NAME).so -.PHONY: all install uninstall clean +.PHONY: all test install uninstall clean diff --git a/r2plugin/README.md b/r2plugin/README.md index 5a6579e..c01b30e 100644 --- a/r2plugin/README.md +++ b/r2plugin/README.md @@ -10,6 +10,9 @@ ADSP-2191) 24-bit instructions in radare2 and iaito. Requires: GCC, radare2 >= 5.8.0 (RArchPlugin API). +The `Makefile` also provides `make test`, which builds the plugin and +runs a smoke test against `../examples/isa_test.bin`. + ## Usage r2 -a adsp219x -b 24 firmware.bin @@ -20,9 +23,16 @@ Compare against the assembler-verified test ROM: r2 -a adsp219x -b 24 -q -c "pd 48" ../examples/isa_test.bin +Or run the local plugin without installing it: + + make test + The test ROM (`isa_test.dsp`) was assembled with open21xx and contains known opcodes for all major instruction types. +For the current verification matrix and remaining structural-only +types, see `TESTING.md`. + ## Coding Standards This plugin follows the GNU Coding Standards for C source code. diff --git a/r2plugin/asm_adsp219x.c b/r2plugin/asm_adsp219x.c index d67d4b0..6f8a89e 100644 --- a/r2plugin/asm_adsp219x.c +++ b/r2plugin/asm_adsp219x.c @@ -64,6 +64,7 @@ get_reg (int gp, int idx) static bool decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask) { + (void) as; ut32 ins, ins2 = 0; const ut8 *b = op->bytes; int avail = op->size; @@ -814,6 +815,7 @@ decode (RArchSession *as, RAnalOp *op, RAnalOpMask mask) static int archinfo (RArchSession *s, ut32 q) { + (void) s; switch (q) { case R_ARCH_INFO_CODE_ALIGN: return 3; case R_ARCH_INFO_MINOP_SIZE: case R_ARCH_INFO_MAXOP_SIZE: return 3; diff --git a/r2plugin/asm_adsp219x.so b/r2plugin/asm_adsp219x.so deleted file mode 100755 index 8632862fac89515f77baee7541716917eddfbd29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28512 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