mirror of
https://github.com/open-goal/jak-project
synced 2026-08-19 06:02:15 -04:00
bfc4c18ada
- Adds `capstone` as a disassembling library that could eventually replace Zydis (for now left that alone) - Replicates all of the existing x86 tests to ARM64, fixed a bunch of underlying issues along the way - There are a very small handful of tests remaining that need to be enabled / fixed
67 lines
2.1 KiB
Python
Vendored
Generated
67 lines
2.1 KiB
Python
Vendored
Generated
from capstone import *
|
|
from capstone.riscv import *
|
|
from capstone.riscv_const import *
|
|
import sys
|
|
|
|
def test():
|
|
print("Test test_riscv_sysreg (Python)")
|
|
errors = []
|
|
# csrr a0, sstatus (0x10002573)
|
|
# csrr a0, mtvec (0x30502573)
|
|
# csrr a0, mcause (0x34202573)
|
|
CODE = b"\x73\x25\x00\x10\x73\x25\x50\x30\x73\x25\x20\x34"
|
|
|
|
expected_sysregs = [
|
|
RISCV_SYSREG_SSTATUS,
|
|
RISCV_SYSREG_MTVEC,
|
|
RISCV_SYSREG_MCAUSE,
|
|
]
|
|
|
|
try:
|
|
md = Cs(CS_ARCH_RISCV, CS_MODE_RISCV64)
|
|
md.detail = True
|
|
|
|
count = 0
|
|
for insn in md.disasm(CODE, 0):
|
|
found_sysreg = False
|
|
for op in insn.operands:
|
|
if op.type == RISCV_OP_CSR:
|
|
if count >= len(expected_sysregs):
|
|
errors.append(f"FAIL: Found CSR operand in instruction {count}, but only {len(expected_sysregs)} expected.")
|
|
break
|
|
|
|
if op.csr != expected_sysregs[count]:
|
|
errors.append(f"FAIL: Expected sysreg {expected_sysregs[count]}, got {op.csr}")
|
|
|
|
if op.csr == RISCV_SYSREG_SSTATUS:
|
|
print(" Recognized SSTATUS")
|
|
elif op.csr == RISCV_SYSREG_MTVEC:
|
|
print(" Recognized MTVEC")
|
|
elif op.csr == RISCV_SYSREG_MCAUSE:
|
|
print(" Recognized MCAUSE")
|
|
|
|
found_sysreg = True
|
|
|
|
if not found_sysreg:
|
|
errors.append(f"FAIL: No CSR operand found in instruction {count}")
|
|
|
|
count += 1
|
|
|
|
if count != 3:
|
|
errors.append(f"FAIL: Expected 3 instructions, got {count}")
|
|
except CsError as e:
|
|
errors.append(str(e))
|
|
|
|
return errors
|
|
|
|
if __name__ == '__main__':
|
|
errs = test()
|
|
if not errs:
|
|
print("Python sysreg test PASSED")
|
|
sys.exit(0)
|
|
else:
|
|
print("Python sysreg test FAILED")
|
|
for e in errs:
|
|
print(f" {e}")
|
|
sys.exit(1)
|