67 lines
2.1 KiB
Python
67 lines
2.1 KiB
Python
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)
|