1111
1212from qiling .const import QL_ARCH
1313
14- from .utils import dump_regs , get_arm_flags , disasm , parse_int , handle_bnj
14+ from .utils import dump_regs , get_arm_flags , disasm , _parse_int , handle_bnj
1515from .const import *
1616
1717
@@ -59,7 +59,7 @@ def extract_count(t):
5959 elif ql .archtype == QL_ARCH .MIPS :
6060 addr = addr .replace ("fp" , "s8" )
6161
62- addr = getattr (ql .reg , addr ) if addr in ql .reg .register_mapping .keys () else parse_int (addr )
62+ addr = getattr (ql .reg , addr ) if addr in ql .reg .register_mapping .keys () else _parse_int (addr )
6363
6464 def unpack (bs , sz ):
6565 return {
@@ -164,67 +164,78 @@ def context_reg(ql: Qiling, saved_states: Optional[Mapping[str, int]] = None, /,
164164
165165 print (lines .format (* _cur_regs .values ()))
166166
167- elif ql .archtype in (QL_ARCH .ARM , QL_ARCH .ARM_THUMB ):
167+ elif ql .archtype in (QL_ARCH .ARM , QL_ARCH .ARM_THUMB , QL_ARCH .CORTEX_M ):
168+
169+ regs_in_row = 4
170+ if ql .archtype == QL_ARCH .CORTEX_M :
171+ regs_in_row = 3
168172
169173 _cur_regs .update ({"sl" : _cur_regs .pop ("r10" )})
170- _cur_regs .update ({"fp" : _cur_regs .pop ("r11" )})
171174 _cur_regs .update ({"ip" : _cur_regs .pop ("r12" )})
175+ _cur_regs .update ({"fp" : _cur_regs .pop ("r11" )})
176+
177+ # for re-order
178+ _cur_regs .update ({"xpsr" : _cur_regs .pop ("xpsr" )})
179+ _cur_regs .update ({"control" : _cur_regs .pop ("control" )})
180+ _cur_regs .update ({"primask" : _cur_regs .pop ("primask" )})
181+ _cur_regs .update ({"faultmask" : _cur_regs .pop ("faultmask" )})
182+ _cur_regs .update ({"basepri" : _cur_regs .pop ("basepri" )})
172183
184+ _diff = None
173185 if saved_states is not None :
174186 _saved_states = copy .deepcopy (saved_states )
175187 _saved_states .update ({"sl" : _saved_states .pop ("r10" )})
176- _saved_states .update ({"fp" : _saved_states .pop ("r11" )})
177188 _saved_states .update ({"ip" : _saved_states .pop ("r12" )})
189+ _saved_states .update ({"fp" : _saved_states .pop ("r11" )})
178190 _diff = [k for k in _cur_regs if _cur_regs [k ] != _saved_states [k ]]
179191
180- else :
181- _diff = None
182-
183192 lines = ""
184193 for idx , r in enumerate (_cur_regs , 1 ):
185- line = "{}{:}: 0x{{:08x}} {}\t " .format (_colors [(idx - 1 ) // 4 ], r , color .END )
194+
195+ line = "{}{:}: 0x{{:08x}} {} " .format (_colors [(idx - 1 ) // regs_in_row ], r , color .END )
186196
187197 if _diff and r in _diff :
188198 line = "{}{}" .format (color .UNDERLINE , color .BOLD ) + line
189199
190- if idx % 4 == 0 :
200+ if idx % regs_in_row == 0 :
191201 line += "\n "
192202
193203 lines += line
194204
195205 print (lines .format (* _cur_regs .values ()))
196206 print (color .GREEN , "[{cpsr[mode]} mode], Thumb: {cpsr[thumb]}, FIQ: {cpsr[fiq]}, IRQ: {cpsr[irq]}, NEG: {cpsr[neg]}, ZERO: {cpsr[zero]}, Carry: {cpsr[carry]}, Overflow: {cpsr[overflow]}" .format (cpsr = get_arm_flags (ql .reg .cpsr )), color .END , sep = "" )
197207
198- # context render for Stack
199- with context_printer (ql , "[ STACK ]" , ruler = "─" ):
200-
201- for idx in range (10 ):
202- addr = ql .reg .arch_sp + idx * ql .pointersize
203- val = ql .mem .read (addr , ql .pointersize )
204- print (f"$sp+0x{ idx * ql .pointersize :02x} │ [0x{ addr :08x} ] —▸ 0x{ ql .unpack (val ):08x} " , end = "" )
208+ if ql .archtype != QL_ARCH .CORTEX_M :
209+ # context render for Stack, skip this for CORTEX_M
210+ with context_printer (ql , "[ STACK ]" , ruler = "─" ):
205211
206- try : # try to deference wether its a pointer
207- buf = ql .mem . read ( addr , ql .pointersize )
208- except :
209- buf = None
212+ for idx in range ( 10 ):
213+ addr = ql .reg . arch_sp + idx * ql .pointersize
214+ val = ql . mem . read ( addr , ql . pointersize )
215+ print ( f"$sp+0x { idx * ql . pointersize :02x } │ [0x { addr :08x } ] —▸ 0x { ql . unpack ( val ):08x } " , end = "" )
210216
211- if (addr := ql .unpack (buf )):
212- try : # try to deference again
217+ try : # try to deference wether its a pointer
213218 buf = ql .mem .read (addr , ql .pointersize )
214219 except :
215220 buf = None
216221
217- if buf :
218- try :
219- s = ql .mem .string (addr )
222+ if ( addr := ql . unpack ( buf )) :
223+ try : # try to deference again
224+ buf = ql .mem .read (addr , ql . pointersize )
220225 except :
221- s = None
226+ buf = None
222227
223- if s and s .isprintable ():
224- print (f" ◂— { ql .mem .string (addr )} " , end = "" )
225- else :
226- print (f" ◂— 0x{ ql .unpack (buf ):08x} " , end = "" )
227- print ()
228+ if buf :
229+ try :
230+ s = ql .mem .string (addr )
231+ except :
232+ s = None
233+
234+ if s and s .isprintable ():
235+ print (f" ◂— { ql .mem .string (addr )} " , end = "" )
236+ else :
237+ print (f" ◂— 0x{ ql .unpack (buf ):08x} " , end = "" )
238+ print ()
228239
229240
230241def print_asm (ql : Qiling , insn : CsInsn , to_jump : Optional [bool ] = None , address : int = None ) -> None :
@@ -251,9 +262,7 @@ def context_asm(ql: Qiling, address: int) -> None:
251262
252263 past_list = []
253264
254- if ql .archtype in (QL_ARCH .MIPS , QL_ARCH .ARM , QL_ARCH .ARM_THUMB ):
255-
256- line = disasm (ql , address - 0x10 )
265+ line = disasm (ql , address - 0x10 )
257266
258267 while line :
259268 if line .address == address :
0 commit comments