16static u32 __saved_dbg_ex_vector[0x80 / 4] = { 0 };
19static void *_old_l1_handlers[16] = { 0 };
21static int _installed_levels = 0;
23static EE_ExceptionHandler *ee_level1_exception_handlers[16] = { 0 };
24static EE_ExceptionHandler *ee_level2_exception_handlers[4] = { 0 };
35 int excode = M_EE_GET_CAUSE_EXCODE(frame->cause);
36 EE_ExceptionHandler *handler = ee_level1_exception_handlers[excode];
46 int exc2 = M_EE_GET_CAUSE_EXC2(frame->cause);
47 EE_ExceptionHandler *handler = ee_level2_exception_handlers[exc2];
55EE_ExceptionHandler *ee_dbg_get_level1_handler(
int cause)
57 if((cause < 0) || (cause > 13)) {
return(NULL); }
59 return(ee_level1_exception_handlers[cause]);
62EE_ExceptionHandler *ee_dbg_set_level1_handler(
int cause, EE_ExceptionHandler *handler)
64 EE_ExceptionHandler *old_handler;
67 if((cause < 0) || (cause > 13)) {
return(NULL); }
71 old_handler = ee_level1_exception_handlers[cause];
72 ee_level1_exception_handlers[cause] = handler;
74 if(oldintr) { EIntr(); }
79EE_ExceptionHandler *ee_dbg_get_level2_handler(
int cause)
81 if((cause < 0) || (cause > 3)) {
return(NULL); }
83 return(ee_level2_exception_handlers[cause]);
86EE_ExceptionHandler *ee_dbg_set_level2_handler(
int cause, EE_ExceptionHandler *handler)
88 EE_ExceptionHandler *old_handler;
91 if((cause < 0) || (cause > 3)) {
return(NULL); }
95 old_handler = ee_level2_exception_handlers[cause];
96 ee_level2_exception_handlers[cause] = handler;
98 if(oldintr) { EIntr(); }
103extern void _ee_dbg_set_bpda(u32, u32, u32);
104extern void _ee_dbg_set_bpdv(u32, u32, u32);
105extern void _ee_dbg_set_bpx(u32, u32, u32);
108void ee_dbg_set_bpr(u32 addr, u32 mask, u32 opmode_mask) { _ee_dbg_set_bpda(addr, mask, EE_BPC_DRE | opmode_mask); }
111void ee_dbg_set_bpw(u32 addr, u32 mask, u32 opmode_mask) { _ee_dbg_set_bpda(addr, mask, EE_BPC_DWE | opmode_mask); }
114void ee_dbg_set_bprw(u32 addr, u32 mask, u32 opmode_mask) { _ee_dbg_set_bpda(addr, mask, EE_BPC_DRE | EE_BPC_DWE | opmode_mask); }
117void ee_dbg_set_bpv(u32 value, u32 mask, u32 opmode_mask) { _ee_dbg_set_bpdv(value, mask, opmode_mask); }
120void ee_dbg_set_bpx(u32 addr, u32 mask, u32 opmode_mask) { _ee_dbg_set_bpx(addr, mask, opmode_mask); }
122void ee_dbg_clr_bpda(
void)
124 u32 bpc = ee_dbg_get_bpc();
126 bpc &= ~(EE_BPC_DWE | EE_BPC_DRE);
128 if(!(bpc & (EE_BPC_DVE)))
131 bpc &= ~(EE_BPC_DUE | EE_BPC_DSE | EE_BPC_DKE | EE_BPC_DXE | EE_BPC_DTE);
137void ee_dbg_clr_bpdv(
void)
139 u32 bpc = ee_dbg_get_bpc();
141 bpc &= ~(EE_BPC_DVE);
143 if(!(bpc & (EE_BPC_DWE | EE_BPC_DRE)))
146 bpc &= ~(EE_BPC_DUE | EE_BPC_DSE | EE_BPC_DKE | EE_BPC_DXE | EE_BPC_DTE);
152void ee_dbg_clr_bpx(
void)
154 u32 bpc = ee_dbg_get_bpc();
155 bpc &= ~(EE_BPC_IXE | EE_BPC_IUE | EE_BPC_ISE | EE_BPC_IKE | EE_BPC_ITE);
159void ee_dbg_clr_bps(
void)
161 ee_dbg_set_bpc(EE_BPC_BED);
170extern void __ee_level1_ex_vector(
void);
171extern void __ee_level2_ex_vector(
void);
173int ee_dbg_install(
int levels)
178 if(_installed_levels & levels)
185 for(i = 0; i < 16; i++) { ee_level1_exception_handlers[i] = NULL; }
190 for(i = 0; i < 4; i++) { ee_level2_exception_handlers[i] = NULL; }
193 oldop = ee_set_opmode(0);
198 memcpy(&__saved_dbg_ex_vector, (
void *) (0x80000100), 0x80);
201 memcpy((
void *) (0x80000100), &__ee_level2_ex_vector, 32);
203 ee_set_opmode(oldop);
204 if(oldintr) { EIntr(); }
210 for(i = 1; i <= 3; i++)
212 _old_l1_handlers[i] = GetExceptionHandler(i);
213 SetVTLBRefillHandler(i, __ee_level1_ex_vector);
216 for(i = 4; i <= 7; i++)
218 _old_l1_handlers[i] = GetExceptionHandler(i);
219 SetVCommonHandler(i, __ee_level1_ex_vector);
222 for(i = 10; i <= 13; i++)
224 _old_l1_handlers[i] = GetExceptionHandler(i);
225 SetVCommonHandler(i, __ee_level1_ex_vector);
232 _installed_levels |= levels;
237int ee_dbg_remove(
int levels)
241 if((levels < 1) || (levels > 3)) {
return(-1); }
243 if(!(_installed_levels & levels)) {
return(-1); }
245 if((levels & _installed_levels) & 2)
248 oldop = ee_set_opmode(0);
253 memcpy((
void *) (0x80000100), &__saved_dbg_ex_vector,
sizeof(__saved_dbg_ex_vector));
255 ee_set_opmode(oldop);
256 if(oldintr) { EIntr(); }
261 _installed_levels &= 1;
264 if((levels & _installed_levels) & 1)
268 for(i = 1; i <= 3; i++)
270 if(_old_l1_handlers[i] != NULL)
272 SetVTLBRefillHandler(i, _old_l1_handlers[i]);
273 _old_l1_handlers[i] = NULL;
276 for(i = 4; i <= 7; i++)
278 if(_old_l1_handlers[i] != NULL)
280 SetVCommonHandler(i, _old_l1_handlers[i]);
281 _old_l1_handlers[i] = NULL;
284 for(i = 10; i <= 13; i++)
286 if(_old_l1_handlers[i] != NULL)
288 SetVCommonHandler(i, _old_l1_handlers[i]);
289 _old_l1_handlers[i] = NULL;
296 _installed_levels &= 2;