44#include "state.h"
55#include "sockpoll.h"
66
7- extern void restore_rst08h ();
7+ extern void gdbserver_trap ();
88
99void modulecall ()
1010{
@@ -19,26 +19,38 @@ void modulecall()
1919 return ;
2020 }
2121
22+ // reset breaking
23+ gdbserver_state .trap_flags = 0 ;
24+
2225 struct breakpoint_t * trapped_breakpoint = NULL ;
26+ uint16_t * pc = & gdbserver_state .registers [REGISTERS_PC ];
2327
2428 if (gdbserver_state .client_socket )
2529 {
2630 print42 ("execution stopped\n" );
27- uint16_t * pc = & gdbserver_state .registers [REGISTERS_PC ];
28-
29- // unwind RST08
30- (* pc )-- ;
3131
32- for ( uint8_t i = 0 ; i < MAX_BREAKPOINTS_COUNT ; i ++ )
32+ if ( gdbserver_state . temporary_breakpoint . address == ( * pc - 1 ) )
3333 {
34- struct breakpoint_t * b = & gdbserver_state .breakpoints [i ];
35- if (b -> address == * pc )
34+ // we've hit temp breakpoint, original instruction
35+ // note, we do not put RST08 back, because it is temporary
36+ * (uint8_t * )gdbserver_state .temporary_breakpoint .address =
37+ gdbserver_state .temporary_breakpoint .original_instruction ;
38+ // unwind RST08
39+ (* pc )-- ;
40+ }
41+ else
42+ {
43+ for (uint8_t i = 0 ; i < MAX_BREAKPOINTS_COUNT ; i ++ )
3644 {
37- trapped_breakpoint = b ;
45+ struct breakpoint_t * b = & gdbserver_state .breakpoints [i ];
46+ if (b -> address == (* pc - 1 )) // offset for RST08
47+ {
48+ trapped_breakpoint = b ;
3849
39- // restore original instruction
40- * (uint8_t * )b -> address = b -> original_instruction ;
41- break ;
50+ // restore original instruction
51+ * (uint8_t * )b -> address = b -> original_instruction ;
52+ break ;
53+ }
4254 }
4355 }
4456
@@ -53,6 +65,12 @@ void modulecall()
5365 }
5466 }
5567
68+ if (trapped_breakpoint )
69+ {
70+ // unwind RST08
71+ (* pc )-- ;
72+ }
73+
5674 while (1 )
5775 {
5876 switch (poll_fd (gdbserver_state .client_socket ))
@@ -83,13 +101,18 @@ void modulecall()
83101done :
84102 print42 ("resuming execution\n" );
85103
86- // we have to restore RST08 on the breakpoint
87104 if (trapped_breakpoint && trapped_breakpoint -> address == gdbserver_state .registers [REGISTERS_PC ])
105+ {
106+ // we have to restore RST08 on the breakpoint
107+ gdbserver_state .trap_flags |= TRAP_FLAG_RESTORE_RST08H ;
108+ }
109+
110+ if (gdbserver_state .trap_flags )
88111 {
89112 gdbserver_state .trap_handler .page = 0xFF ;
90- gdbserver_state .trap_handler .address = trapped_breakpoint -> address ;
113+ gdbserver_state .trap_handler .address = * pc ;
91114 gdbserver_state .trap_handler .next_address = 0x0000 ;
92- gdbserver_state .trap_handler .handler = (uint16_t )restore_rst08h ;
115+ gdbserver_state .trap_handler .handler = (uint16_t )gdbserver_trap ;
93116
94117 set_trap (& gdbserver_state .trap_handler );
95118 }
0 commit comments