From 06d3d0d7264e8034245cf33044913fda99626401 Mon Sep 17 00:00:00 2001 From: Markus Fritsche Date: Wed, 15 Apr 2026 08:03:43 +0200 Subject: [PATCH] benchmark: AI-Ghidra landscape + case-4 harness (synthetic PHY) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - benchmark/ai_ghidra/SETUP.md documents the GhidrAssist 1.5.0 install at /opt/ghidra/Ghidra/Extensions/GhidrAssist/ on oppenheimer (CT131), with dirac endpoints (Hermes-2-Pro 8B @ :8080, Qwen-coder 1.5B @ :8081) already reachable + tested. Final enable+config is UI-only; two clicks on next Ghidra launch. - gdb_debug/harness.c extended with case 4 = train_phy_block running under a synthetic PHY at 0x40000000. Static MMIO shim satisfies polls 1-3; poll 4 needs dynamic state-machine (next session, via SIGBUS handler or ptrace) — documented in the README. Vendor tree investigation: Rockchip's own sdram_rk3588.c / sdram_rk3568.c are STUBS (return -1). No free function names from there. Path forward: mine the vendor kernel's rockchip_dmc.c (devfreq DDR scaling driver) for register-offset naming hints at runtime-call level. Co-Authored-By: Claude Opus 4.6 (1M context) --- benchmark/ai_ghidra/SETUP.md | 72 +++++++++++++++++++++++++ benchmark/gdb_debug/Makefile | 3 +- benchmark/gdb_debug/func_04.o | Bin 0 -> 720 bytes benchmark/gdb_debug/gdb_debug.elf | Bin 76152 -> 77280 bytes benchmark/gdb_debug/harness.c | 86 +++++++++++++++++++++++++++--- 5 files changed, 154 insertions(+), 7 deletions(-) create mode 100644 benchmark/ai_ghidra/SETUP.md create mode 100644 benchmark/gdb_debug/func_04.o diff --git a/benchmark/ai_ghidra/SETUP.md b/benchmark/ai_ghidra/SETUP.md new file mode 100644 index 0000000..0146f1a --- /dev/null +++ b/benchmark/ai_ghidra/SETUP.md @@ -0,0 +1,72 @@ +# AI-Ghidra on oppenheimer (2026-04-15) + +GhidrAssist wired to dirac's local LLMs. Two-click finish on next +launch because Ghidra's plugin enable/config step is UI-only. + +## What's installed + +- **GhidrAssist 1.5.0** (jtang613 fork — actual + `github.com/symgraph/GhidrAssist`) at + `/opt/ghidra/Ghidra/Extensions/GhidrAssist/` on oppenheimer (CT131). +- Built for Ghidra 11.4.3; our install is 11.3. Should load + (API-compatible) but if "Extension failed to load" appears, upgrade + Ghidra to 11.4.3+. + +## Dirac LLM endpoints (OpenAI v1 compatible) + +| port | model | size | role | +|------|-------|------|------| +| 8080 | `Hermes-2-Pro-Llama-3-8B-Q4_K_M.gguf` | ~4.8 GB | main — tool-calling, agentic rename, function-calling mode | +| 8081 | `qwen2.5-coder-1.5b-instruct-q4_k_m.gguf` | ~1 GB | fast — quick renames, short comments | + +Base URLs: +- `http://192.168.88.194:8080/v1/` (Hermes) +- `http://192.168.88.194:8081/v1/` (Qwen-Coder) + +Fully OpenAI-compatible: `/v1/models`, `/v1/chat/completions`. Tested +from oppenheimer; reachable, responses sane. + +## Finish config (UI, next launch) + +1. Open Ghidra, open any project. +2. CodeBrowser → **File → Configure → Miscellaneous** → tick + **Enable GhidrAssist**. +3. Reopen CodeBrowser; GhidrAssist tab appears. +4. Settings: + - **API type:** OpenAI compatible + - **API base URL:** `http://192.168.88.194:8080/v1` + - **Model name:** `Hermes-2-Pro-Llama-3-8B-Q4_K_M.gguf` + - **API key:** any non-empty string (llama.cpp ignores it) + - **System prompt** (recommended): + ``` + You are a reverse engineering assistant. When asked for a rename, + return ONLY the new name — do not use tool calls unless the + conversation is explicitly in function-calling mode. + ``` + +## Tested calls + +- Qwen-coder 1.5B, memset-shaped function → returned `set_char` (close, + not ideal). +- Hermes 8B w/o system prompt → invokes `rename_function` tool call + immediately — perfect for GhidrAssist's agentic rename mode, awkward + for plain Q&A. + +## Use patterns + +- **Agentic rename pass over our 118 DDR functions** (Hermes + tool + calls auto-invoked). +- **Quick second opinion on a decompiler output** — Hermes or Qwen, + non-agentic. +- **Bulk scripted pass** — Ghidra headless + GhidrAssist's JSON API + (see `ghidra_scripts/README.txt` in the extension dir). + +## Cold-start bookkeeping + +llama-server cold-loads in ~15 s. First call after dirac wake returns +HTTP 503 `{"error":"Loading model"}` — retry after ~15 s. + +## Offline fallback + +Clevo (980M, 4 GB VRAM) can host Qwen-coder 1.5B when dirac is down. +Hermes 8B won't fit in 4 GB. diff --git a/benchmark/gdb_debug/Makefile b/benchmark/gdb_debug/Makefile index dffc28e..7c4ac6e 100644 --- a/benchmark/gdb_debug/Makefile +++ b/benchmark/gdb_debug/Makefile @@ -18,8 +18,9 @@ endef $(eval $(call WRAP_BIN,func_01,01_memset)) $(eval $(call WRAP_BIN,func_02,02_memcpy32)) $(eval $(call WRAP_BIN,func_03,03_magic_memset)) +$(eval $(call WRAP_BIN,func_04,04_train_phy_block)) -gdb_debug.elf: harness.c func_01.o func_02.o func_03.o +gdb_debug.elf: harness.c func_01.o func_02.o func_03.o func_04.o gcc -O0 -g -Wall -o $@ $^ clean: diff --git a/benchmark/gdb_debug/func_04.o b/benchmark/gdb_debug/func_04.o new file mode 100644 index 0000000000000000000000000000000000000000..2ec987bfec181e340899e67ad00fd5fc7d8b9b58 GIT binary patch literal 720 zcmb<-^>JfjWMqH=MuzPS2p&w7fnfrYpaWRgfq|8Qg@GZ);pfAC79$1)hlz{=j5`@6 z9CzCDuoNBm|38FL0l|LQ&S1ot0F(~_;ufGdi^C_7nnZ>LLC9hUVPYV)4EusWW*%UU zzlLxLCW{%1i$Ts6z#=XU70*C3#uzOA@jtpaLwr(ZUSd&Yd|GK>*W>qQ!gI;lEZb@PikS-~L&>1jRN@7VOnv=-lg8T>aJ2RSY2Phxie@M{^ zRsrHOLDeEtE1;YTC=D_nq>cm1mw?ioKpNd{kdy+{A|I$a7=>=XAW#CE{v4=6MVLk? HjjkU6lNVRm literal 0 HcmV?d00001 diff --git a/benchmark/gdb_debug/gdb_debug.elf b/benchmark/gdb_debug/gdb_debug.elf index 3c8cc43ff762de8be527ac406dec12f2af604d53..bf616fd3faad6bcb2275b47dcab0ff4c2e0d41cd 100755 GIT binary patch literal 77280 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 kbase read by func at +0xB8 */ + volatile uint8_t *phy = (volatile uint8_t *)(FAKE_PHY_BASE + 0x8000); + + if (let_polls_pass) { + /* Pre-populate the registers the function polls so each LDR + * sees a "done" value on the first iteration. */ + *(volatile uint32_t *)(phy + PHY_STAT_A_OFF) = 0xF0000001U; /* bits[31:28] non-zero */ + *(volatile uint32_t *)(phy + PHY_STAT_B_OFF) = 0xF0000001U; + *(volatile uint32_t *)(phy + PHY_HANDSHAKE_OFF) = 0x00000003U; /* bits[1:0] non-zero */ + } + printf("synthetic PHY mapped at 0x%lx, polls = %s\n", + (unsigned long)m, let_polls_pass ? "PASS" : "STUCK (will loop)"); +} + static void __attribute__((noinline)) -call_func(void (*fn)(void), int which) { +call_func(void (*fn)(void), int which, int variant) { switch (which) { case 1: { char buf[64] = {0}; @@ -52,12 +111,25 @@ call_func(void (*fn)(void), int which) { printf("calling magic_memset — SIGSEGVs on LDR of 0x1fe004 in user mode.\n"); ((f3_t)fn)(); break; + case 4: { + prep_synthetic_phy(variant); + printf("calling train_phy_block(ctx)\n"); + ((f4_t)fn)((uint64_t)&ctx); + printf("train_phy_block returned successfully.\n"); + volatile uint8_t *phy = (volatile uint8_t *)(FAKE_PHY_BASE + 0x8000); + printf("post: CTL=0x%08x CFG_A=0x%08x CFG_B=0x%08x\n", + *(volatile uint32_t *)(phy + PHY_CTL_OFF), + *(volatile uint32_t *)(phy + PHY_CFG_A_OFF), + *(volatile uint32_t *)(phy + PHY_CFG_B_OFF)); + break; + } } } int main(int argc, char **argv) { - if (argc != 2) { fprintf(stderr, "usage: %s {1|2|3}\n", argv[0]); return 2; } + if (argc < 2) { fprintf(stderr, "usage: %s {1|2|3|4} [stuck]\n", argv[0]); return 2; } int which = atoi(argv[1]); + int variant = (argc >= 3 && strcmp(argv[2], "stuck") == 0) ? 0 : 1; void (*fn)(void); switch (which) { case 1: fn = rwx_copy(_binary_func_01_bin_start, @@ -66,9 +138,11 @@ int main(int argc, char **argv) { _binary_func_02_bin_end - _binary_func_02_bin_start); break; case 3: fn = rwx_copy(_binary_func_03_bin_start, _binary_func_03_bin_end - _binary_func_03_bin_start); break; + case 4: fn = rwx_copy(_binary_func_04_bin_start, + _binary_func_04_bin_end - _binary_func_04_bin_start); break; default: fprintf(stderr, "unknown index %d\n", which); return 2; } printf("function %d loaded at %p\n", which, fn); - call_func(fn, which); + call_func(fn, which, variant); return 0; }