@@ -34,8 +34,8 @@ def get_init_uc(self) -> Uc:
3434
3535 def create_disassembler (self ) -> Cs :
3636 try :
37- from capstone import CS_ARCH_RISCV , CS_MODE_RISCV32
38- return Cs (CS_ARCH_RISCV , CS_MODE_RISCV32 )
37+ from capstone import CS_ARCH_RISCV , CS_MODE_RISCV32 , CS_MODE_RISCVC
38+ return Cs (CS_ARCH_RISCV , CS_MODE_RISCV32 + CS_MODE_RISCVC )
3939 except ImportError :
4040 raise QlErrorNotImplemented ("Capstone does not yet support riscv, upgrade to capstone 5.0" )
4141
@@ -45,8 +45,37 @@ def create_assembler(self) -> Ks:
4545 def enable_float (self ):
4646 self .ql .reg .mstatus = self .ql .reg .mstatus | MSTATUS .FS_DIRTY
4747
48- def reset_register (self ):
49- self .enable_float ()
48+ def init_context (self ):
49+ self .ql . reg . pc = 0x08000000
5050
5151 def soft_interrupt_handler (self , ql , intno ):
52- raise QlErrorNotImplemented (f'Unhandled interrupt number ({ intno } )' )
52+ if intno == 2 :
53+ try :
54+ address , size = ql .reg .pc - 4 , 4
55+ tmp = ql .mem .read (address , size )
56+ qd = ql .arch .create_disassembler ()
57+
58+ insn = '\n > ' .join (f'{ insn .mnemonic } { insn .op_str } ' for insn in qd .disasm (tmp , address ))
59+ except QlErrorNotImplemented :
60+ insn = ''
61+
62+ ql .log .warning (f'[{ hex (address )} ] Illegal instruction ({ insn } )' )
63+ else :
64+ raise QlErrorNotImplemented (f'Unhandled interrupt number ({ intno } )' )
65+
66+ def step (self ):
67+ self .ql .emu_start (self .get_pc (), 0 , count = 1 )
68+ self .ql .hw .step ()
69+
70+ def stop (self ):
71+ self .runable = False
72+
73+ def run (self , count = - 1 , end = None ):
74+ self .runable = True
75+
76+ while self .runable and count != 0 :
77+ if self .get_pc () == end :
78+ break
79+
80+ self .step ()
81+ count -= 1
0 commit comments