# RK3588 DDR Init Blob — Reverse Engineering Toolkit
#
# Prerequisites:
#   apt install gcc-aarch64-linux-gnu libunicorn-dev openjdk-21-jdk-headless python3
#   pip install unicorn
#
# On Arch (boltzmann):
#   pacman -S aarch64-linux-gnu-gcc python-unicorn java-runtime
#
# Ghidra (for decompilation, x86 only):
#   Download from https://github.com/NationalSecurityAgency/ghidra/releases
#   Requires JDK 21+

CROSS    := aarch64-linux-gnu-
CC       := gcc
CFLAGS   := -O2 -Wall
LDFLAGS  := -lunicorn -lm

BLOB_DIR  := /opt/rkbin/bin/rk35
BLOB_FAST := $(BLOB_DIR)/rk3588_ddr_lp4_2112MHz_lp5_2400MHz_v1.19.bin
BLOB_CONS := $(BLOB_DIR)/rk3588_ddr_lp4_1848MHz_lp5_2112MHz_v1.19.bin
GHIDRA    := /opt/ghidra
JAVA_HOME ?= /opt/jdk21

.PHONY: all patch patch-prod patch-all emulator decompile diff clean help

help:
	@echo "RK3588 DDR Blob Toolkit"
	@echo ""
	@echo "Targets:"
	@echo "  patch-prod   - Apply production patch (40 NOP, 5 kept)"
	@echo "  patch-all    - Apply aggressive patch (all 45 NOPped)"
	@echo "  emulator     - Build unicorn-based emulator (x86 only)"
	@echo "  test-orig    - Emulate original blob"
	@echo "  test-patched - Emulate patched blob"
	@echo "  decompile    - Decompile blob with Ghidra (x86 only)"
	@echo "  annotate     - Generate annotated C source"
	@echo "  diff         - Diff fast vs conservative blobs"
	@echo "  clean        - Remove generated files"
	@echo ""
	@echo "Prerequisites:"
	@echo "  Python 3.8+, unicorn (pip), Ghidra 11.3+ (for decompile)"
	@echo "  gcc + libunicorn-dev (for emulator)"

all: patch-prod

# === Patching ===

rk3588_ddr_v1.19_prod.bin: patch_prod.py $(BLOB_FAST)
	python3 patch_prod.py $(BLOB_FAST) $@

rk3588_ddr_v1.19_patched_v2.bin: patch_timeouts.py $(BLOB_FAST)
	python3 patch_timeouts.py $(BLOB_FAST) $@

patch-prod: rk3588_ddr_v1.19_prod.bin

patch-all: rk3588_ddr_v1.19_patched_v2.bin

# === Emulation (x86 only) ===

ddr_emu: ddr_emu2.c
	$(CC) $(CFLAGS) -o $@ $< $(LDFLAGS)

emulator: ddr_emu

test-orig: ddr_emu
	./ddr_emu $(BLOB_FAST) 50000

test-patched: ddr_emu rk3588_ddr_v1.19_prod.bin
	./ddr_emu rk3588_ddr_v1.19_prod.bin 50000

# === Ghidra Decompilation (x86 only) ===

decompile: ddr_decompiled.c

ddr_decompiled.c: $(BLOB_FAST) ExportDecompiled.java
	@test -d $(GHIDRA) || (echo "Error: Ghidra not found at $(GHIDRA)" && exit 1)
	rm -rf ghidra_project ghidra_project.rep
	JAVA_HOME=$(JAVA_HOME) $(GHIDRA)/support/analyzeHeadless . ghidra_project \
		-import $(BLOB_FAST) \
		-processor 'AARCH64:LE:64:v8A' \
		-scriptPath . \
		-postScript ExportDecompiled.java $@

ddr_fast_asm.s: $(BLOB_FAST) ExportAsm.java
	@test -d $(GHIDRA) || (echo "Error: Ghidra not found at $(GHIDRA)" && exit 1)
	JAVA_HOME=$(JAVA_HOME) $(GHIDRA)/support/analyzeHeadless . ghidra_project \
		-process $$(basename $(BLOB_FAST)) \
		-noanalysis -scriptPath . \
		-postScript ExportAsm.java $@

# === Analysis ===

diff: ddr_diff.txt

ddr_diff.txt: ddr_decompiled.c ddr_conservative_decompiled.c
	diff $^ > $@ || true
	@echo "$$(wc -l < $@) lines differ"

annotate: ddr_annotated.c

# === Cleanup ===

clean:
	rm -f ddr_emu
	rm -f rk3588_ddr_v1.19_prod.bin rk3588_ddr_v1.19_patched_v2.bin
	rm -rf ghidra_project ghidra_project.rep ghidra_project.gpr
	rm -f qemu_trace_*.log
