comparison src/cs/services/dar/dar_emergency.c @ 0:92470e5d0b9e

src: partial import from FC Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 15 May 2020 01:28:16 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:92470e5d0b9e
1 /****************************************************************************/
2 /* */
3 /* File Name: dar_emergency.c */
4 /* */
5 /* Purpose: This function is called when the DAR entity has detected */
6 /* an emergency ( Error or exception) */
7 /* */
8 /* */
9 /* Version 0.1 */
10 /* */
11 /* Date Modification */
12 /* ------------------------------------ */
13 /* 17 October 2001 Create */
14 /* */
15 /* Author Stephanie Gerthoux */
16 /* */
17 /* (C) Copyright 2001 by Texas Instruments Incorporated, All Rights Reserved*/
18 /****************************************************************************/
19
20 #include "rv/rv_defined_swe.h"
21 #ifdef RVM_DAR_SWE
22 /* ************************************************ */
23 /* THE DAR ENTITY IS ENABLED */
24 /* ************************************************ */
25
26 #include <string.h>
27 #include "rvm/rvm_gen.h"
28 #include "dar/dar_api.h"
29 #include "dar/dar_macro_i.h"
30 #include "dar/dar_messages_i.h"
31 #include "dar/dar_const_i.h"
32 #include "dar/dar_diagnose_i.h"
33 #include "dar/dar_msg_ft.h"
34
35 #ifndef _WINDOWS
36 #include "timer/timer.h"
37 #endif
38
39 /**** Global variable ****/
40 /* index used in the circular buffer*/
41 extern UINT16 dar_current_index;
42
43 /* Write buffer*/
44 extern char dar_write_buffer[DAR_MAX_BUFFER_SIZE];
45
46 /* Get the dar current status */
47 extern T_DAR_RECOVERY_STATUS dar_current_status;
48
49 /* Get the dar exception status */
50 extern UINT8 dar_exception_status;
51
52 /* Define a pointer to the Global Environment Control block */
53 extern T_DAR_ENV_CTRL_BLK *dar_gbl_var_p;
54
55 /* Define the recovery buffer */
56 extern UINT8 dar_recovery_buffer[DAR_RECOVERY_DATA_MAX_BUFFER_SIZE];
57
58 /* Ram buffer that contains the Debug Unit register */
59 extern UINT32 debug_RAM[DEBUG_UNIT_WORD_SIZE];
60
61
62 /**** Extern functions ****/
63 extern void * dar_read_mbox (UINT8 mbox);
64
65 extern void exception(void);
66
67
68 /********************************************************************************/
69 /* */
70 /* Function Name: dar_process_emergency */
71 /* */
72 /* Purpose: This function is called to process emergency data and to store */
73 /* them in RAM buffer when an emergency has been detected */
74 /* */
75 /* */
76 /* Input Parameters: */
77 /* Pointer to the message to store */
78 /* Data Format, ( the Binary format is not supported) */
79 /* Data Use Id, */
80 /* Flags */
81 /* */
82 /* Output Parameters: */
83 /* Validation of the diagnose execution. */
84 /* */
85 /* */
86 /* */
87 /* Revision History: */
88 /* None. */
89 /* */
90 /********************************************************************************/
91 T_RV_RET dar_process_emergency( T_DAR_INFO *buffer_p,
92 T_DAR_FORMAT format,
93 T_RVM_USE_ID dar_use_id,
94 UINT32 flags)
95 {
96 /* Declare local variables */
97 UINT32 i = 0;
98 UINT32 length = 0;
99 T_RV_HDR *msg_p = ( T_RV_HDR*) dar_read_mbox(DAR_MBOX);
100
101 /**** Update the DAR recovery status ****/
102 dar_current_status = DAR_EMERGENCY_SCUTTLING;
103
104 /**** Empty the mail box before the reset of the system ****/
105 while(msg_p != NULL)
106 {
107 /* If it's a Write message, store it in the RAM */
108 /* ( it is not interesting to store filter message ) */
109 if ((msg_p->msg_id) == DAR_WRITE_REQ)
110 {
111 /* store the message in the RAM*/
112 dar_write_data_in_buffer((T_DAR_WRITE_START *)msg_p);
113 }
114
115 /* free the Header of the message */
116 rvf_free_buf((T_RVF_BUFFER *) msg_p);
117
118 /* Read the next message */
119 msg_p = ( T_RV_HDR*) dar_read_mbox(DAR_MBOX);
120
121 } /* while (msg_p != NULL) */
122
123 /**** Store emergency data in RAM buffer ****/
124 /* Diagnose string length */
125 length = (UINT16) strlen(buffer_p);
126
127 /**** Check if the DAR entity is started ****/
128 if (dar_gbl_var_p != NULL )
129 {
130 /* Data format */
131 dar_gbl_var_p->format = format;
132 }
133
134 if ( flags & DAR_NEW_ENTRY )
135 {
136 /** Circular buffer to store data **/
137 /* Add 0xFF to separate 2 strings */
138 dar_write_buffer[dar_current_index] = 0xF;
139 DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */
140 dar_write_buffer[dar_current_index] = 0xF;
141 DAR_PLUS_PLUS(dar_current_index); /* to detected if it is the end of the buffer */
142
143 /* The group_nb is 16 bit length, and the buffer is an UINT8 length */
144 /* So the group_nb must be stocked by dividing it in 2 parts */
145 dar_write_buffer[dar_current_index] = ((dar_use_id>>16)& 0x7FFF)>>8;
146 /*add the 8 first bits of the Use id group*/
147 DAR_PLUS_PLUS(dar_current_index);
148 dar_write_buffer[dar_current_index] = (dar_use_id>>16)& 0x7FFF;
149 /*add the 8 last bits of the Use id group*/
150 DAR_PLUS_PLUS(dar_current_index);
151
152 /* The mask is 16 bit length, and the buffer is an UINT8 length */
153 /* So the mask must be stocked by dividing it in 2 parts */
154 dar_write_buffer[dar_current_index] = ((dar_use_id)&0xFFFF)>>8;
155 /* add the 8 first bits of the Use id mask */
156 DAR_PLUS_PLUS(dar_current_index);
157 dar_write_buffer[dar_current_index] = (dar_use_id)&0xFFFF;
158 /* add the 8 last bits of the Use id mask */
159 DAR_PLUS_PLUS(dar_current_index);
160
161 /* Add the dar_level data */
162 dar_write_buffer[dar_current_index] = DAR_ERROR;
163 DAR_PLUS_PLUS(dar_current_index);
164 }
165
166 /* circular buffer to store diagnose data in RAM buffer */
167 for (i=0; i < length; i++ )
168 {
169 /* copy string in the RAM char by char*/
170 dar_write_buffer[dar_current_index]=buffer_p[i];
171
172 /* detection of the end of the buffer */
173 /* When current = DAR_MAX_BUFFER_SIZE , current = 0 */
174 DAR_PLUS_PLUS(dar_current_index);
175 }
176
177 /* DAR information is redirected to standard trace */
178 //DAR_SEND_TRACE("Circular buffer :",RV_TRACE_LEVEL_ERROR);
179 //rvf_send_trace(buffer_p, length, NULL_PARAM, RV_TRACE_LEVEL_ERROR, DAR_USE_ID);
180
181 /* Trace the buffer (used for debug) */
182 rvf_delay(RVF_MS_TO_TICKS(1000));
183
184
185 /**** Check if the DAR entity is started ****/
186 if (dar_gbl_var_p != NULL )
187 {
188 if (dar_gbl_var_p->entity_dar_callback != NULL )
189 {
190 /* Call the MMI callback function to save some parameters before reset */
191 dar_gbl_var_p->entity_dar_callback(dar_recovery_buffer,DAR_RECOVERY_DATA_MAX_BUFFER_SIZE);
192 }
193 }
194
195 /* The system is reset if requested */
196 if ( flags & DAR_EMERGENCY_RESET )
197 {
198 dar_reset();
199 }
200 return(RV_OK);
201
202 } /* dar_process_emergency */
203
204
205 /********************************************************************************/
206 /* */
207 /* Function Name: dar_exception_arm_undefined */
208 /* */
209 /* Purpose: This function is called to process ARM undefined instruction */
210 /* exception and to store this exception in the RAM buffer */
211 /* */
212 /* Input Parameters: */
213 /* None */
214 /* */
215 /* Output Parameters: */
216 /* Validation of the diagnose execution. */
217 /* */
218 /* */
219 /* */
220 /* Revision History: */
221 /* None. */
222 /* */
223 /********************************************************************************/
224 void dar_exception_arm_undefined(void)
225 {
226 /* Declare local variables */
227 T_DAR_INFO *buffer_p= " DAR Emergency exception : ARM undefined ";/*exception data to store*/
228
229 /* Update the DAR recovery status */
230 dar_current_status = DAR_EMERGENCY_SCUTTLING;
231
232 /* Update the DAR exception status */
233 dar_exception_status = DAR_EXCEPTION_UNDEFINED;
234
235 /* Empty the mail box and store data in RAM buffer */
236 dar_empty_mb_and_save_data(buffer_p);
237
238 /* Check if the DAR entity is started */
239 if (dar_gbl_var_p != NULL )
240 {
241 if (dar_gbl_var_p->entity_dar_callback != NULL)
242 {
243 /* Call the MMI callback function to save some parameters before reset */
244 dar_gbl_var_p->entity_dar_callback(dar_recovery_buffer,DAR_RECOVERY_DATA_MAX_BUFFER_SIZE);
245 }
246 }
247
248 #ifndef _WINDOWS
249 /* branch to "exception" defined in the int.s*/
250 exception();
251 #endif
252
253 } /* dar_exception_arm_undefined */
254
255 /********************************************************************************/
256 /* */
257 /* Function Name: dar_exception_arm_swi */
258 /* */
259 /* Purpose: This function is called to process ARM SW Interrupt exception */
260 /* and to store this exception in the RAM buffer */
261 /* */
262 /* Input Parameters: */
263 /* None */
264 /* */
265 /* Output Parameters: */
266 /* Validation of the diagnose execution. */
267 /* */
268 /* */
269 /* */
270 /* Revision History: */
271 /* None. */
272 /* */
273 /********************************************************************************/
274 void dar_exception_arm_swi(void)
275 {
276 /* Declare local variables */
277 T_DAR_INFO *buffer_p= " DAR Emergency exception : ARM SWI ";/*exception data to store*/
278
279 /* Update the DAR recovery status */
280 dar_current_status = DAR_EMERGENCY_SCUTTLING;
281
282 /* Update the DAR exception status */
283 dar_exception_status = DAR_EXCEPTION_SWI;
284
285 /* Empty the mail box and store data in RAM buffer */
286 dar_empty_mb_and_save_data(buffer_p);
287
288 /* Check if the DAR entity is started */
289 if (dar_gbl_var_p != NULL )
290 {
291 if ( dar_gbl_var_p->entity_dar_callback != NULL)
292 {
293 /* Call the MMI callback function to save some parameters before reset */
294 dar_gbl_var_p->entity_dar_callback(dar_recovery_buffer,DAR_RECOVERY_DATA_MAX_BUFFER_SIZE);
295 }
296 }
297
298 #ifndef _WINDOWS
299 /* branch to "exception" defined in the int.s*/
300 exception();
301 #endif
302
303 } /* dar_exception_arm_swi */
304
305 /********************************************************************************/
306 /* */
307 /* Function Name: dar_exception_arm_abort_prefetch */
308 /* */
309 /* Purpose: This function is called to process ARM abort prefetch exception */
310 /* and to store this exception in the RAM buffer */
311 /* */
312 /* Input Parameters: */
313 /* None */
314 /* */
315 /* Output Parameters: */
316 /* Validation of the diagnose execution. */
317 /* */
318 /* */
319 /* */
320 /* Revision History: */
321 /* None. */
322 /* */
323 /********************************************************************************/
324 void dar_exception_arm_abort_prefetch(void)
325 {
326 #ifndef _WINDOWS
327 /* Local variable */
328 UINT8 i;
329 #endif
330
331 #if ((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
332 /* Debug unit pointer */
333 volatile UINT32 *debug_register_p;
334 #endif
335
336 /* Declare local variables */
337 T_DAR_INFO *buffer_p = " DAR Emergency exception : ARM abort prefetch";/*exception data to store*/
338
339 /* Update the DAR recovery status */
340 dar_current_status = DAR_EMERGENCY_SCUTTLING;
341
342 /* Update the DAR exception status */
343 dar_exception_status = DAR_EXCEPTION_PREFETCH_ABORT;
344
345 /* Empty the mail box and store data in RAM buffer */
346 dar_empty_mb_and_save_data(buffer_p);
347
348 /* Check if the DAR entity is started */
349 if (dar_gbl_var_p != NULL )
350 {
351 if (dar_gbl_var_p->entity_dar_callback != NULL)
352 {
353 /* Call the MMI callback function to save some parameters before reset */
354 dar_gbl_var_p->entity_dar_callback(dar_recovery_buffer,DAR_RECOVERY_DATA_MAX_BUFFER_SIZE);
355 }
356 }
357
358 #if ((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
359 /* Initialize the adress of the Debug Unit pointer */
360 debug_register_p = (volatile UINT32*) DAR_DEBUG_UNIT_REGISTER;
361 #endif
362
363 #ifndef _WINDOWS
364 #if ((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
365 /* Save the Debug Unit into the RAM */
366 for (i=0; i<DEBUG_UNIT_WORD_SIZE; i++ )
367 {
368 debug_RAM[i] = *debug_register_p;
369 debug_register_p++;
370 }
371 #endif
372
373 /* branch to "exception" defined in the int.s*/
374 exception();
375 #endif
376
377 } /* dar_exception_arm_abort_prefetch */
378
379 /********************************************************************************/
380 /* */
381 /* Function Name: dar_exception_arm_abort_data */
382 /* */
383 /* Purpose: This function is called to process ARM abort data exception */
384 /* and to store this exception in the RAM buffer */
385 /* */
386 /* Input Parameters: */
387 /* None */
388 /* */
389 /* Output Parameters: */
390 /* Validation of the diagnose execution. */
391 /* */
392 /* */
393 /* */
394 /* Revision History: */
395 /* None. */
396 /* */
397 /********************************************************************************/
398 void dar_exception_arm_abort_data(void)
399 {
400 #ifndef _WINDOWS
401 /* Local variable */
402 UINT8 i;
403 #endif
404
405 #if ((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
406 /* Debug unit pointer */
407 volatile UINT32 *debug_register_p;
408 #endif
409
410 /* Declare local variables */
411 T_DAR_INFO *buffer_p= " DAR Emergency exception : ARM abort data";/*exception data to store*/
412
413 /* Update the DAR recovery status */
414 dar_current_status = DAR_EMERGENCY_SCUTTLING;
415
416 /* Update the DAR exception status */
417 dar_exception_status = DAR_EXCEPTION_DATA_ABORT;
418
419 /* Empty the mail box and store data in RAM buffer */
420 dar_empty_mb_and_save_data(buffer_p);
421
422 /* Check if the DAR entity is started */
423 if (dar_gbl_var_p != NULL )
424 {
425 if (dar_gbl_var_p->entity_dar_callback != NULL)
426 {
427
428 /* Call the MMI callback function to save some parameters before reset */
429 dar_gbl_var_p->entity_dar_callback(dar_recovery_buffer,DAR_RECOVERY_DATA_MAX_BUFFER_SIZE);
430 }
431 }
432
433 #if ((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
434 /* Initialize the adress of the Debug Unit pointer */
435 debug_register_p = (volatile UINT32*) DAR_DEBUG_UNIT_REGISTER;
436 #endif
437
438 #ifndef _WINDOWS
439 #if ((CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 10) || (CHIPSET == 11) || (CHIPSET == 12))
440 /* Save the Debug Unit into the RAM */
441 for (i=0; i<DEBUG_UNIT_WORD_SIZE; i++ )
442 {
443 debug_RAM[i] = *debug_register_p;
444 debug_register_p++;
445 }
446 #endif
447
448 /* branch to "exception" defined in the int.s*/
449 exception();
450 #endif
451
452 } /* dar_exception_arm_abort_data */
453
454 /********************************************************************************/
455 /* */
456 /* Function Name: dar_exception_arm_reserved */
457 /* */
458 /* Purpose: This function is called to process ARM exception */
459 /* and to store this exception in the RAM buffer */
460 /* */
461 /* Input Parameters: */
462 /* None */
463 /* */
464 /* Output Parameters: */
465 /* Validation of the diagnose execution. */
466 /* */
467 /* */
468 /* */
469 /* Revision History: */
470 /* None. */
471 /* */
472 /********************************************************************************/
473 void dar_exception_arm_reserved(void)
474 {
475 /* Declare local variables */
476 T_DAR_INFO *buffer_p= " DAR Emergency exception : ARM reserved";/*exception data to store*/
477
478 /* Update the DAR recovery status */
479 dar_current_status = DAR_EMERGENCY_SCUTTLING;
480
481 /* Update the DAR exception status */
482 dar_exception_status = DAR_EXCEPTION_RESERVED;
483
484 /* Empty the mail box and store data in RAM buffer */
485 dar_empty_mb_and_save_data(buffer_p);
486
487 /* Check if the DAR entity is started */
488 if (dar_gbl_var_p != NULL )
489 {
490 if (dar_gbl_var_p->entity_dar_callback != NULL)
491 {
492 /* Call the MMI callback function to save some parameters before reset */
493 dar_gbl_var_p->entity_dar_callback(dar_recovery_buffer,DAR_RECOVERY_DATA_MAX_BUFFER_SIZE);
494 }
495 }
496
497 #ifndef _WINDOWS
498 /* branch to "exception" defined in the int.s*/
499 exception();
500 #endif
501
502 } /* dar_exception_arm_reserved */
503
504 /********************************************************************************/
505 /* */
506 /* Function Name: dar_exception */
507 /* */
508 /* Purpose: This function is called to vector exceptions to the correct */
509 /* handler */
510 /* */
511 /* Input Parameters: */
512 /* abort type which come from int.s ( -> magic number) */
513 /* */
514 /* Output Parameters: */
515 /* Validation of the diagnose execution. */
516 /* */
517 /* */
518 /* */
519 /* Revision History: */
520 /* None. */
521 /* */
522 /********************************************************************************/
523 void dar_exception(int abort_type)
524 {
525 switch (abort_type)
526 {
527 /* magic numbers come from int.s There is no way to make compiler derived
528 * constants out of them
529 */
530 case 1:
531 dar_exception_arm_undefined();
532 break;
533 case 2:
534 dar_exception_arm_swi();
535 break;
536 case 3:
537 dar_exception_arm_abort_prefetch();
538 break;
539 case 4:
540 dar_exception_arm_abort_data();
541 break;
542 case 5:
543 dar_exception_arm_reserved();
544 break;
545 }
546 } /* dar_exception */
547
548 #else
549 /* ************************************************ */
550 /* THE DAR ENTITY IS DISABLED */
551 /* ************************************************ */
552
553 void dar_exception(int abort_type)
554 {
555 #ifndef _WINDOWS
556 /* branch to "exception" defined in the int.s*/
557 exception();
558 #endif
559 } /* dar_exception */
560
561 #endif /* #ifdef RVM_DAR_SWE */
562