File indexing completed on 2025-05-11 08:24:21
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <rtems/recorddump.h>
0033
0034 #include <rtems/bspIo.h>
0035 #include <rtems/score/isrlock.h>
0036 #include <rtems/score/smpimpl.h>
0037 #include <rtems/score/timecounter.h>
0038
0039 #if ISR_LOCK_NEEDS_OBJECT
0040 static ISR_lock_Control _Record_Dump_base64_lock =
0041 ISR_LOCK_INITIALIZER( "Record Dump base64" );
0042 #endif
0043
0044 static bool _Record_Dump_base64_done;
0045
0046 void _Record_Fatal_dump_base64(
0047 Internal_errors_Source source,
0048 bool always_set_to_false,
0049 Internal_errors_t code
0050 )
0051 {
0052 ISR_lock_Context lock_context;
0053 Per_CPU_Control *cpu_self;
0054 rtems_record_context record_context;
0055 sbintime_t now;
0056
0057 cpu_self = _Per_CPU_Get();
0058
0059 now = _Timecounter_Sbinuptime();
0060 rtems_record_prepare_critical( &record_context, cpu_self );
0061 rtems_record_add(
0062 &record_context,
0063 RTEMS_RECORD_UPTIME_LOW,
0064 (uint32_t) ( now >> 0 )
0065 );
0066 rtems_record_add(
0067 &record_context,
0068 RTEMS_RECORD_UPTIME_HIGH,
0069 (uint32_t) ( now >> 32 )
0070 );
0071 rtems_record_commit_critical( &record_context );
0072
0073 rtems_record_prepare_critical( &record_context, cpu_self );
0074 rtems_record_add(
0075 &record_context,
0076 RTEMS_RECORD_FATAL_SOURCE,
0077 source
0078 );
0079 rtems_record_add(
0080 &record_context,
0081 RTEMS_RECORD_FATAL_CODE,
0082 code
0083 );
0084 rtems_record_commit_critical( &record_context );
0085
0086 #if defined(RTEMS_SMP)
0087 if (
0088 source == RTEMS_FATAL_SOURCE_SMP &&
0089 code == SMP_FATAL_SHUTDOWN_RESPONSE
0090 ) {
0091 return;
0092 }
0093
0094
0095 _SMP_Request_shutdown();
0096 #endif
0097
0098 _ISR_lock_Acquire( &_Record_Dump_base64_lock, &lock_context );
0099
0100 if ( !_Record_Dump_base64_done ) {
0101 _Record_Dump_base64_done = true;
0102
0103 printk( "\n*** BEGIN OF RECORDS BASE64 ***\n" );
0104 rtems_record_dump_base64( rtems_put_char, NULL );
0105 printk( "\n*** END OF RECORDS BASE64 ***\n" );
0106 }
0107
0108 _ISR_lock_Release( &_Record_Dump_base64_lock, &lock_context );
0109 }