ps2sdk  1.1
A collection of Open Source libraries used for developing applications on Sony's PlayStation 2® (PS2).
ee_debug.c File Reference
#include <kernel.h>
#include <ee_debug.h>
#include <string.h>
#include "eedebug_defs.h"
+ Include dependency graph for ee_debug.c:

Go to the source code of this file.

Functions

void _def_ee_ex_handler (EE_RegFrame *frame)
 
void ee_level1_ex_dispatcher (EE_RegFrame *frame)
 
void ee_level2_ex_dispatcher (EE_RegFrame *frame)
 
EE_ExceptionHandleree_dbg_get_level1_handler (int cause)
 
EE_ExceptionHandleree_dbg_set_level1_handler (int cause, EE_ExceptionHandler *handler)
 
EE_ExceptionHandleree_dbg_get_level2_handler (int cause)
 
EE_ExceptionHandleree_dbg_set_level2_handler (int cause, EE_ExceptionHandler *handler)
 
void _ee_dbg_set_bpda (u32, u32, u32)
 
void _ee_dbg_set_bpdv (u32, u32, u32)
 
void _ee_dbg_set_bpx (u32, u32, u32)
 
void ee_dbg_set_bpr (u32 addr, u32 mask, u32 opmode_mask)
 
void ee_dbg_set_bpw (u32 addr, u32 mask, u32 opmode_mask)
 
void ee_dbg_set_bprw (u32 addr, u32 mask, u32 opmode_mask)
 
void ee_dbg_set_bpv (u32 value, u32 mask, u32 opmode_mask)
 
void ee_dbg_set_bpx (u32 addr, u32 mask, u32 opmode_mask)
 
void ee_dbg_clr_bpda (void)
 
void ee_dbg_clr_bpdv (void)
 
void ee_dbg_clr_bpx (void)
 
void ee_dbg_clr_bps (void)
 
void __ee_level1_ex_vector (void)
 
void __ee_level2_ex_vector (void)
 
int ee_dbg_install (int levels)
 
int ee_dbg_remove (int levels)
 

Variables

u128 __ee_ex_l1_stack [_EX_L1_STACK_SIZE/16]
 
u128 __ee_ex_l2_stack [_EX_L2_STACK_SIZE/16]
 
EE_RegFrame __ee_ex_l1_frame
 
EE_RegFrame __ee_ex_l2_frame
 
static u32 __saved_dbg_ex_vector [0x80/4] = { 0 }
 
static void * _old_l1_handlers [16] = { 0 }
 
static int _installed_levels = 0
 
static EE_ExceptionHandleree_level1_exception_handlers [16] = { 0 }
 
static EE_ExceptionHandleree_level2_exception_handlers [4] = { 0 }
 

Function Documentation

◆ __ee_level1_ex_vector()

void __ee_level1_ex_vector ( void  )

Referenced by ee_dbg_install().

◆ __ee_level2_ex_vector()

void __ee_level2_ex_vector ( void  )

Referenced by ee_dbg_install().

◆ _def_ee_ex_handler()

void _def_ee_ex_handler ( EE_RegFrame frame)

Definition at line 26 of file ee_debug.c.

27 {
28  while(1);
29 }

◆ _ee_dbg_set_bpda()

void _ee_dbg_set_bpda ( u32  ,
u32  ,
u32   
)

◆ _ee_dbg_set_bpdv()

void _ee_dbg_set_bpdv ( u32  ,
u32  ,
u32   
)

Referenced by ee_dbg_set_bpv().

◆ _ee_dbg_set_bpx()

void _ee_dbg_set_bpx ( u32  ,
u32  ,
u32   
)

Referenced by ee_dbg_set_bpx().

◆ ee_dbg_clr_bpda()

void ee_dbg_clr_bpda ( void  )

Definition at line 120 of file ee_debug.c.

121 {
122  u32 bpc = ee_dbg_get_bpc();
123 
124  bpc &= ~(EE_BPC_DWE | EE_BPC_DRE);
125 
126  if(!(bpc & (EE_BPC_DVE)))
127  {
128  // if Data Value breakpoint not enabled, disable all Data bp bits.
130  }
131 
132  ee_dbg_set_bpc(bpc);
133 }
#define EE_BPC_DWE
Definition: ee_cop0_defs.h:69
#define EE_BPC_DKE
Definition: ee_cop0_defs.h:93
#define EE_BPC_DVE
Definition: ee_cop0_defs.h:72
#define EE_BPC_DXE
Definition: ee_cop0_defs.h:96
#define EE_BPC_DRE
Definition: ee_cop0_defs.h:66
#define EE_BPC_DUE
Definition: ee_cop0_defs.h:87
#define EE_BPC_DSE
Definition: ee_cop0_defs.h:90
#define EE_BPC_DTE
Definition: ee_cop0_defs.h:102
u32 ee_dbg_get_bpc(void)
void ee_dbg_set_bpc(u32)
unsigned int u32
Definition: tamtypes.h:30

References EE_BPC_DKE, EE_BPC_DRE, EE_BPC_DSE, EE_BPC_DTE, EE_BPC_DUE, EE_BPC_DVE, EE_BPC_DWE, EE_BPC_DXE, ee_dbg_get_bpc(), and ee_dbg_set_bpc().

◆ ee_dbg_clr_bpdv()

void ee_dbg_clr_bpdv ( void  )

Definition at line 135 of file ee_debug.c.

136 {
137  u32 bpc = ee_dbg_get_bpc();
138 
139  bpc &= ~(EE_BPC_DVE);
140 
141  if(!(bpc & (EE_BPC_DWE | EE_BPC_DRE)))
142  {
143  // if Data Read or Data Write breakpoints not enabled, disable all Data bp bits.
145  }
146 
147  ee_dbg_set_bpc(bpc);
148 }

References EE_BPC_DKE, EE_BPC_DRE, EE_BPC_DSE, EE_BPC_DTE, EE_BPC_DUE, EE_BPC_DVE, EE_BPC_DWE, EE_BPC_DXE, ee_dbg_get_bpc(), and ee_dbg_set_bpc().

◆ ee_dbg_clr_bps()

void ee_dbg_clr_bps ( void  )

Definition at line 157 of file ee_debug.c.

158 {
160  ee_dbg_set_iab(0);
161  ee_dbg_set_iabm(0);
162  ee_dbg_set_dab(0);
163  ee_dbg_set_dabm(0);
164  ee_dbg_set_dvb(0);
165  ee_dbg_set_dvbm(0);
166 }
#define EE_BPC_BED
Definition: ee_cop0_defs.h:105
void ee_dbg_set_iab(u32)
void ee_dbg_set_dvbm(u32)
void ee_dbg_set_dabm(u32)
void ee_dbg_set_iabm(u32)
void ee_dbg_set_dvb(u32)
void ee_dbg_set_dab(u32)

References EE_BPC_BED, ee_dbg_set_bpc(), ee_dbg_set_dab(), ee_dbg_set_dabm(), ee_dbg_set_dvb(), ee_dbg_set_dvbm(), ee_dbg_set_iab(), and ee_dbg_set_iabm().

Referenced by ee_dbg_install(), and ee_dbg_remove().

◆ ee_dbg_clr_bpx()

void ee_dbg_clr_bpx ( void  )

Definition at line 150 of file ee_debug.c.

151 {
152  u32 bpc = ee_dbg_get_bpc();
154  ee_dbg_set_bpc(bpc);
155 }
#define EE_BPC_IUE
Definition: ee_cop0_defs.h:75
#define EE_BPC_ISE
Definition: ee_cop0_defs.h:78
#define EE_BPC_ITE
Definition: ee_cop0_defs.h:99
#define EE_BPC_IKE
Definition: ee_cop0_defs.h:81
#define EE_BPC_IXE
Definition: ee_cop0_defs.h:84

References EE_BPC_IKE, EE_BPC_ISE, EE_BPC_ITE, EE_BPC_IUE, EE_BPC_IXE, ee_dbg_get_bpc(), and ee_dbg_set_bpc().

◆ ee_dbg_get_level1_handler()

EE_ExceptionHandler* ee_dbg_get_level1_handler ( int  cause)

Definition at line 53 of file ee_debug.c.

54 {
55  if((cause < 0) || (cause > 13)) { return(NULL); }
56 
57  return(ee_level1_exception_handlers[cause]);
58 }
static EE_ExceptionHandler * ee_level1_exception_handlers[16]
Definition: ee_debug.c:23
#define NULL
Definition: tamtypes.h:91

References ee_level1_exception_handlers, and NULL.

◆ ee_dbg_get_level2_handler()

EE_ExceptionHandler* ee_dbg_get_level2_handler ( int  cause)

Definition at line 77 of file ee_debug.c.

78 {
79  if((cause < 0) || (cause > 3)) { return(NULL); }
80 
81  return(ee_level2_exception_handlers[cause]);
82 }
static EE_ExceptionHandler * ee_level2_exception_handlers[4]
Definition: ee_debug.c:24

References ee_level2_exception_handlers, and NULL.

◆ ee_dbg_install()

int ee_dbg_install ( int  levels)

Definition at line 171 of file ee_debug.c.

172 {
173  u32 oldintr, oldop;
174  int i;
175 
176  if(_installed_levels & levels)
177  {
178  return(-1);
179  }
180 
181  if(levels & 1)
182  {
183  for(i = 0; i < 16; i++) { ee_level1_exception_handlers[i] = NULL; }
184  }
185 
186  if(levels & 2)
187  {
188  for(i = 0; i < 4; i++) { ee_level2_exception_handlers[i] = NULL; }
189 
190  oldintr = DIntr();
191  oldop = ee_set_opmode(0);
192 
193  ee_dbg_clr_bps();
194 
195  // save the original level 2 debug exception vector.
196  memcpy(&__saved_dbg_ex_vector, (void *) (0x80000100), 0x80);
197 
198  // replace the level 2 debug exception vector with our own
199  memcpy((void *) (0x80000100), &__ee_level2_ex_vector, 32);
200 
201  ee_set_opmode(oldop);
202  if(oldintr) { EIntr(); }
203  }
204 
205  if(levels & 1)
206  {
207  // redirect desirable "Level 1" exceptions to our level 1 handler.
208  for(i = 1; i <= 3; i++)
209  {
212  }
213 
214  for(i = 4; i <= 7; i++)
215  {
218  }
219 
220  for(i = 10; i <= 13; i++)
221  {
224  }
225  }
226 
227  FlushCache(0);
228  FlushCache(2);
229 
230  _installed_levels |= levels;
231 
232  return(0);
233 }
void __ee_level2_ex_vector(void)
void __ee_level1_ex_vector(void)
static u32 __saved_dbg_ex_vector[0x80/4]
Definition: ee_debug.c:16
void ee_dbg_clr_bps(void)
Definition: ee_debug.c:157
static void * _old_l1_handlers[16]
Definition: ee_debug.c:19
static int _installed_levels
Definition: ee_debug.c:21
void SetVCommonHandler(s32 handler_num, void *handler_func)
static int ee_set_opmode(u32 opmode)
Definition: kernel.h:163
void SetVTLBRefillHandler(s32 handler_num, void *handler_func)
void FlushCache(s32 operation)
int DIntr(void)
void * GetExceptionHandler(int except_no)
int EIntr(void)

References __ee_level1_ex_vector(), __ee_level2_ex_vector(), __saved_dbg_ex_vector, _installed_levels, _old_l1_handlers, DIntr(), ee_dbg_clr_bps(), ee_level1_exception_handlers, ee_level2_exception_handlers, ee_set_opmode(), EIntr(), FlushCache(), GetExceptionHandler(), NULL, SetVCommonHandler(), and SetVTLBRefillHandler().

◆ ee_dbg_remove()

int ee_dbg_remove ( int  levels)

Definition at line 235 of file ee_debug.c.

236 {
237  u32 oldintr, oldop;
238  int i;
239 
240  if((levels < 1) || (levels > 3)) { return(-1); }
241 
242  if(!(_installed_levels & levels)) { return(-1); }
243 
244  if((levels & _installed_levels) & 2)
245  {
246  oldintr = DIntr();
247  oldop = ee_set_opmode(0);
248 
249  ee_dbg_clr_bps();
250 
251  // restore the original debug exception vector.
252  memcpy((void *) (0x80000100), &__saved_dbg_ex_vector, sizeof(__saved_dbg_ex_vector));
253 
254  ee_set_opmode(oldop);
255  if(oldintr) { EIntr(); }
256 
257  FlushCache(0);
258  FlushCache(2);
259 
260  _installed_levels &= 1;
261  }
262 
263  if((levels & _installed_levels) & 1)
264  {
265  // restore the exception handlers that we previously hooked.
266  for(i = 1; i <= 3; i++)
267  {
268  if(_old_l1_handlers[i] != NULL)
269  {
271  _old_l1_handlers[i] = NULL;
272  }
273  }
274  for(i = 4; i <= 7; i++)
275  {
276  if(_old_l1_handlers[i] != NULL)
277  {
279  _old_l1_handlers[i] = NULL;
280  }
281  }
282  for(i = 10; i <= 13; i++)
283  {
284  if(_old_l1_handlers[i] != NULL)
285  {
287  _old_l1_handlers[i] = NULL;
288  }
289  }
290 
291  FlushCache(0);
292  FlushCache(2);
293 
294  _installed_levels &= 2;
295  }
296 
297  return(0);
298 }

References __saved_dbg_ex_vector, _installed_levels, _old_l1_handlers, DIntr(), ee_dbg_clr_bps(), ee_set_opmode(), EIntr(), FlushCache(), NULL, SetVCommonHandler(), and SetVTLBRefillHandler().

◆ ee_dbg_set_bpr()

void ee_dbg_set_bpr ( u32  addr,
u32  mask,
u32  opmode_mask 
)

Definition at line 106 of file ee_debug.c.

106 { _ee_dbg_set_bpda(addr, mask, EE_BPC_DRE | opmode_mask); }
void _ee_dbg_set_bpda(u32, u32, u32)

References _ee_dbg_set_bpda(), and EE_BPC_DRE.

◆ ee_dbg_set_bprw()

void ee_dbg_set_bprw ( u32  addr,
u32  mask,
u32  opmode_mask 
)

Definition at line 112 of file ee_debug.c.

112 { _ee_dbg_set_bpda(addr, mask, EE_BPC_DRE | EE_BPC_DWE | opmode_mask); }

References _ee_dbg_set_bpda(), EE_BPC_DRE, and EE_BPC_DWE.

◆ ee_dbg_set_bpv()

void ee_dbg_set_bpv ( u32  value,
u32  mask,
u32  opmode_mask 
)

Definition at line 115 of file ee_debug.c.

115 { _ee_dbg_set_bpdv(value, mask, opmode_mask); }
void _ee_dbg_set_bpdv(u32, u32, u32)

References _ee_dbg_set_bpdv().

◆ ee_dbg_set_bpw()

void ee_dbg_set_bpw ( u32  addr,
u32  mask,
u32  opmode_mask 
)

Definition at line 109 of file ee_debug.c.

109 { _ee_dbg_set_bpda(addr, mask, EE_BPC_DWE | opmode_mask); }

References _ee_dbg_set_bpda(), and EE_BPC_DWE.

◆ ee_dbg_set_bpx()

void ee_dbg_set_bpx ( u32  addr,
u32  mask,
u32  opmode_mask 
)

Definition at line 118 of file ee_debug.c.

118 { _ee_dbg_set_bpx(addr, mask, opmode_mask); }
void _ee_dbg_set_bpx(u32, u32, u32)

References _ee_dbg_set_bpx().

◆ ee_dbg_set_level1_handler()

EE_ExceptionHandler* ee_dbg_set_level1_handler ( int  cause,
EE_ExceptionHandler handler 
)

Definition at line 60 of file ee_debug.c.

61 {
62  EE_ExceptionHandler *old_handler;
63  u32 oldintr;
64 
65  if((cause < 0) || (cause > 13)) { return(NULL); }
66 
67  oldintr = DIntr();
68 
69  old_handler = ee_level1_exception_handlers[cause];
70  ee_level1_exception_handlers[cause] = handler;
71 
72  if(oldintr) { EIntr(); }
73 
74  return(old_handler);
75 }
int() EE_ExceptionHandler(struct st_EE_RegFrame *)
Definition: ee_debug.h:28

References DIntr(), ee_level1_exception_handlers, EIntr(), and NULL.

◆ ee_dbg_set_level2_handler()

EE_ExceptionHandler* ee_dbg_set_level2_handler ( int  cause,
EE_ExceptionHandler handler 
)

Definition at line 84 of file ee_debug.c.

85 {
86  EE_ExceptionHandler *old_handler;
87  u32 oldintr;
88 
89  if((cause < 0) || (cause > 3)) { return(NULL); }
90 
91  oldintr = DIntr();
92 
93  old_handler = ee_level2_exception_handlers[cause];
94  ee_level2_exception_handlers[cause] = handler;
95 
96  if(oldintr) { EIntr(); }
97 
98  return(old_handler);
99 }

References DIntr(), ee_level2_exception_handlers, EIntr(), and NULL.

◆ ee_level1_ex_dispatcher()

void ee_level1_ex_dispatcher ( EE_RegFrame frame)

Definition at line 31 of file ee_debug.c.

32 {
33  int excode = M_EE_GET_CAUSE_EXCODE(frame->cause);
35 
36  if(handler)
37  {
38  handler(frame);
39  }
40 }
#define M_EE_GET_CAUSE_EXCODE(__cause)
Definition: ee_cop0_defs.h:19

References EE_RegFrame::cause, ee_level1_exception_handlers, and M_EE_GET_CAUSE_EXCODE.

◆ ee_level2_ex_dispatcher()

void ee_level2_ex_dispatcher ( EE_RegFrame frame)

Definition at line 42 of file ee_debug.c.

43 {
44  int exc2 = M_EE_GET_CAUSE_EXC2(frame->cause);
46 
47  if(handler)
48  {
49  handler(frame);
50  }
51 }
#define M_EE_GET_CAUSE_EXC2(__cause)
Definition: ee_cop0_defs.h:20

References EE_RegFrame::cause, ee_level2_exception_handlers, and M_EE_GET_CAUSE_EXC2.

Variable Documentation

◆ __ee_ex_l1_frame

EE_RegFrame __ee_ex_l1_frame

Definition at line 12 of file ee_debug.c.

◆ __ee_ex_l1_stack

u128 __ee_ex_l1_stack[_EX_L1_STACK_SIZE/16]

Definition at line 8 of file ee_debug.c.

◆ __ee_ex_l2_frame

EE_RegFrame __ee_ex_l2_frame

Definition at line 13 of file ee_debug.c.

◆ __ee_ex_l2_stack

u128 __ee_ex_l2_stack[_EX_L2_STACK_SIZE/16]

Definition at line 9 of file ee_debug.c.

◆ __saved_dbg_ex_vector

u32 __saved_dbg_ex_vector[0x80/4] = { 0 }
static

Definition at line 16 of file ee_debug.c.

Referenced by ee_dbg_install(), and ee_dbg_remove().

◆ _installed_levels

int _installed_levels = 0
static

Definition at line 21 of file ee_debug.c.

Referenced by ee_dbg_install(), and ee_dbg_remove().

◆ _old_l1_handlers

void* _old_l1_handlers[16] = { 0 }
static

Definition at line 19 of file ee_debug.c.

Referenced by ee_dbg_install(), and ee_dbg_remove().

◆ ee_level1_exception_handlers

EE_ExceptionHandler* ee_level1_exception_handlers[16] = { 0 }
static

◆ ee_level2_exception_handlers

EE_ExceptionHandler* ee_level2_exception_handlers[4] = { 0 }
static