@@ -18,7 +18,7 @@ def __init__(self, ql: Qiling, entry_point: int, exit_point: int):
1818 self .ql = ql
1919
2020 self .exit_point = exit_point
21- self .bp_list = []
21+ self .swbp = set ()
2222 self .last_bp = None
2323
2424 def __entry_point_hook (ql : Qiling ):
@@ -41,32 +41,44 @@ def dbg_hook(self, ql: Qiling, address: int, size: int):
4141 if address == self .last_bp :
4242 self .last_bp = None
4343
44- elif address in self .bp_list :
44+ elif address in self .swbp :
4545 self .last_bp = address
4646
4747 ql .log .info (f'{ PROMPT } breakpoint hit, stopped at { address :#x} ' )
4848 ql .stop ()
4949
50- # # TODO: not sure what this is about
51- # if address + size == self.exit_point:
52- # ql.log.debug(f'{PROMPT} emulation entrypoint at {self.entry_point:#x}')
53- # ql.log.debug(f'{PROMPT} emulation exitpoint at {self.exit_point:#x}')
50+ def bp_insert (self , addr : int , size : int ):
51+ targets = set (addr + i for i in range (size or 1 ))
5452
55- def bp_insert (self , addr : int ):
56- if addr not in self .bp_list :
57- self .bp_list .append (addr )
58- self .ql .log .info (f'{ PROMPT } breakpoint added at { addr :#x} ' )
53+ if targets .intersection (self .swbp ):
54+ return False
55+
56+ for bp in targets :
57+ self .swbp .add (bp )
58+
59+ self .ql .log .info (f'{ PROMPT } breakpoint added at { addr :#x} ' )
60+
61+ return True
62+
63+ def bp_remove (self , addr : int , size : int ) -> bool :
64+ targets = set (addr + i for i in range (size or 1 ))
65+
66+ if not targets .issubset (self .swbp ):
67+ return False
68+
69+ for bp in targets :
70+ self .swbp .remove (bp )
5971
60- def bp_remove (self , addr : int ):
61- self .bp_list .remove (addr )
6272 self .ql .log .info (f'{ PROMPT } breakpoint removed from { addr :#x} ' )
6373
74+ return True
75+
6476 def resume_emu (self , address : Optional [int ] = None , steps : int = 0 ):
6577 if address is None :
6678 address = self .ql .arch .regs .arch_pc
6779
6880 if getattr (self .ql .arch , 'is_thumb' , False ):
69- address |= 1
81+ address |= 0b1
7082
7183 op = f'stepping { steps } instructions' if steps else 'resuming'
7284 self .ql .log .info (f'{ PROMPT } { op } from { address :#x} ' )
0 commit comments