Skip to content

Commit b42850c

Browse files
authored
Merge pull request #1011 from ucgJhe/qdb
Qdb: support mcu
2 parents e14238f + 186c2e2 commit b42850c

File tree

4 files changed

+188
-106
lines changed

4 files changed

+188
-106
lines changed

qiling/debugger/qdb/frontend.py

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
from 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
1515
from .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

230241
def 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

Comments
 (0)