File indexing completed on 2025-05-11 08:24:13
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 #ifndef _RTEMS_RECORD_H
0029 #define _RTEMS_RECORD_H
0030
0031 #include "recorddata.h"
0032
0033 #include <rtems/score/atomic.h>
0034 #include <rtems/score/cpu.h>
0035 #include <rtems/score/interr.h>
0036 #include <rtems/score/percpu.h>
0037 #include <rtems/score/watchdog.h>
0038 #include <rtems/counter.h>
0039
0040 #ifdef __cplusplus
0041 extern "C" {
0042 #endif
0043
0044 typedef struct Record_Control {
0045 Atomic_Uint head;
0046 unsigned int tail;
0047 unsigned int mask;
0048 Watchdog_Control Watchdog;
0049 RTEMS_ALIGNED( CPU_CACHE_LINE_BYTES )
0050 rtems_record_item Items[ RTEMS_ZERO_LENGTH_ARRAY ];
0051 } Record_Control;
0052
0053 typedef struct {
0054 unsigned int item_count;
0055 Record_Control *controls;
0056 } Record_Configuration;
0057
0058 typedef struct {
0059 Record_Control *control;
0060 unsigned int head;
0061 uint32_t now;
0062 uint32_t level;
0063 } rtems_record_context;
0064
0065 extern const Record_Configuration _Record_Configuration;
0066
0067 void _Record_Initialize( void );
0068
0069 void _Record_Interrupt_initialize( void );
0070
0071 bool _Record_Thread_create(
0072 struct _Thread_Control *executing,
0073 struct _Thread_Control *created
0074 );
0075
0076 void _Record_Thread_start(
0077 struct _Thread_Control *executing,
0078 struct _Thread_Control *started
0079 );
0080
0081 void _Record_Thread_restart(
0082 struct _Thread_Control *executing,
0083 struct _Thread_Control *restarted
0084 );
0085
0086 void _Record_Thread_delete(
0087 struct _Thread_Control *executing,
0088 struct _Thread_Control *deleted
0089 );
0090
0091 void _Record_Thread_switch(
0092 struct _Thread_Control *executing,
0093 struct _Thread_Control *heir
0094 );
0095
0096 void _Record_Thread_begin( struct _Thread_Control *executing );
0097
0098 void _Record_Thread_exitted( struct _Thread_Control *executing );
0099
0100 void _Record_Fatal_dump_base64(
0101 Internal_errors_Source source,
0102 bool always_set_to_false,
0103 Internal_errors_t code
0104 );
0105
0106 void _Record_Fatal_dump_base64_zlib(
0107 Internal_errors_Source source,
0108 bool always_set_to_false,
0109 Internal_errors_t code
0110 );
0111
0112 void _Record_Thread_terminate(
0113 struct _Thread_Control *executing
0114 );
0115
0116 static inline unsigned int _Record_Index(
0117 const Record_Control *control,
0118 unsigned int index
0119 )
0120 {
0121 return index & control->mask;
0122 }
0123
0124 static inline unsigned int _Record_Head( Record_Control *control )
0125 {
0126 #ifdef RTEMS_SMP
0127
0128
0129
0130
0131 return _Atomic_Fetch_add_uint( &control->head, 0, ATOMIC_ORDER_ACQUIRE );
0132 #else
0133 return _Atomic_Load_uint( &control->head, ATOMIC_ORDER_ACQUIRE );
0134 #endif
0135 }
0136
0137 static inline unsigned int _Record_Tail( const Record_Control *control )
0138 {
0139 return control->tail;
0140 }
0141
0142 static inline bool _Record_Is_overflow(
0143 const Record_Control *control,
0144 unsigned int tail,
0145 unsigned int head
0146 )
0147 {
0148 return head - tail >= control->mask + 1U;
0149 }
0150
0151 static inline unsigned int _Record_Capacity(
0152 const Record_Control *control,
0153 unsigned int tail,
0154 unsigned int head
0155 )
0156 {
0157 return ( tail - head - 1U ) & control->mask;
0158 }
0159
0160 static inline rtems_counter_ticks _Record_Now( void )
0161 {
0162 return rtems_counter_read();
0163 }
0164
0165 typedef struct RTEMS_PACKED {
0166 uint32_t format;
0167 uint32_t magic;
0168 rtems_record_item Version;
0169 rtems_record_item Processor_maximum;
0170 rtems_record_item Count;
0171 rtems_record_item Frequency;
0172 rtems_record_item Info[64];
0173 } Record_Stream_header;
0174
0175 size_t _Record_Stream_header_initialize( Record_Stream_header *header );
0176
0177 size_t _Record_String_to_items(
0178 rtems_record_event event,
0179 const char *str,
0180 size_t len,
0181 rtems_record_item *items,
0182 size_t item_count
0183 );
0184
0185 void _Record_Caller( void *return_address );
0186
0187 void _Record_Caller_3(
0188 void *return_address,
0189 rtems_record_event event,
0190 rtems_record_data data
0191 );
0192
0193 void _Record_Caller_4(
0194 void *return_address,
0195 rtems_record_event event_0,
0196 rtems_record_data data_0,
0197 rtems_record_event event_1,
0198 rtems_record_data data_1
0199 );
0200
0201 void _Record_Caller_arg( void *return_address, rtems_record_data data );
0202
0203 void _Record_Caller_arg_2(
0204 void *return_address,
0205 rtems_record_data data_0,
0206 rtems_record_data data_1
0207 );
0208
0209 void _Record_Caller_arg_3(
0210 void *return_address,
0211 rtems_record_data data_0,
0212 rtems_record_data data_1,
0213 rtems_record_data data_2
0214 );
0215
0216 void _Record_Caller_arg_4(
0217 void *return_address,
0218 rtems_record_data data_0,
0219 rtems_record_data data_1,
0220 rtems_record_data data_2,
0221 rtems_record_data data_3
0222 );
0223
0224 void _Record_Caller_arg_5(
0225 void *return_address,
0226 rtems_record_data data_0,
0227 rtems_record_data data_1,
0228 rtems_record_data data_2,
0229 rtems_record_data data_3,
0230 rtems_record_data data_4
0231 );
0232
0233 void _Record_Caller_arg_6(
0234 void *return_address,
0235 rtems_record_data data_0,
0236 rtems_record_data data_1,
0237 rtems_record_data data_2,
0238 rtems_record_data data_3,
0239 rtems_record_data data_4,
0240 rtems_record_data data_5
0241 );
0242
0243 void _Record_Caller_arg_7(
0244 void *return_address,
0245 rtems_record_data data_0,
0246 rtems_record_data data_1,
0247 rtems_record_data data_2,
0248 rtems_record_data data_3,
0249 rtems_record_data data_4,
0250 rtems_record_data data_5,
0251 rtems_record_data data_6
0252 );
0253
0254 void _Record_Caller_arg_8(
0255 void *return_address,
0256 rtems_record_data data_0,
0257 rtems_record_data data_1,
0258 rtems_record_data data_2,
0259 rtems_record_data data_3,
0260 rtems_record_data data_4,
0261 rtems_record_data data_5,
0262 rtems_record_data data_6,
0263 rtems_record_data data_7
0264 );
0265
0266 void _Record_Caller_arg_9(
0267 void *return_address,
0268 rtems_record_data data_0,
0269 rtems_record_data data_1,
0270 rtems_record_data data_2,
0271 rtems_record_data data_3,
0272 rtems_record_data data_4,
0273 rtems_record_data data_5,
0274 rtems_record_data data_6,
0275 rtems_record_data data_7,
0276 rtems_record_data data_8
0277 );
0278
0279 void _Record_Caller_arg_10(
0280 void *return_address,
0281 rtems_record_data data_0,
0282 rtems_record_data data_1,
0283 rtems_record_data data_2,
0284 rtems_record_data data_3,
0285 rtems_record_data data_4,
0286 rtems_record_data data_5,
0287 rtems_record_data data_6,
0288 rtems_record_data data_7,
0289 rtems_record_data data_8,
0290 rtems_record_data data_9
0291 );
0292
0293 void _Record_Entry_2(
0294 void *return_address,
0295 rtems_record_event event,
0296 rtems_record_data data_0,
0297 rtems_record_data data_1
0298 );
0299
0300 void _Record_Entry_3(
0301 void *return_address,
0302 rtems_record_event event,
0303 rtems_record_data data_0,
0304 rtems_record_data data_1,
0305 rtems_record_data data_2
0306 );
0307
0308 void _Record_Entry_4(
0309 void *return_address,
0310 rtems_record_event event,
0311 rtems_record_data data_0,
0312 rtems_record_data data_1,
0313 rtems_record_data data_2,
0314 rtems_record_data data_3
0315 );
0316
0317 void _Record_Entry_5(
0318 void *return_address,
0319 rtems_record_event event,
0320 rtems_record_data data_0,
0321 rtems_record_data data_1,
0322 rtems_record_data data_2,
0323 rtems_record_data data_3,
0324 rtems_record_data data_4
0325 );
0326
0327 void _Record_Entry_6(
0328 void *return_address,
0329 rtems_record_event event,
0330 rtems_record_data data_0,
0331 rtems_record_data data_1,
0332 rtems_record_data data_2,
0333 rtems_record_data data_3,
0334 rtems_record_data data_4,
0335 rtems_record_data data_5
0336 );
0337
0338 void _Record_Entry_7(
0339 void *return_address,
0340 rtems_record_event event,
0341 rtems_record_data data_0,
0342 rtems_record_data data_1,
0343 rtems_record_data data_2,
0344 rtems_record_data data_3,
0345 rtems_record_data data_4,
0346 rtems_record_data data_5,
0347 rtems_record_data data_6
0348 );
0349
0350 void _Record_Entry_8(
0351 void *return_address,
0352 rtems_record_event event,
0353 rtems_record_data data_0,
0354 rtems_record_data data_1,
0355 rtems_record_data data_2,
0356 rtems_record_data data_3,
0357 rtems_record_data data_4,
0358 rtems_record_data data_5,
0359 rtems_record_data data_6,
0360 rtems_record_data data_7
0361 );
0362
0363 void _Record_Entry_9(
0364 void *return_address,
0365 rtems_record_event event,
0366 rtems_record_data data_0,
0367 rtems_record_data data_1,
0368 rtems_record_data data_2,
0369 rtems_record_data data_3,
0370 rtems_record_data data_4,
0371 rtems_record_data data_5,
0372 rtems_record_data data_6,
0373 rtems_record_data data_7,
0374 rtems_record_data data_8
0375 );
0376
0377 void _Record_Entry_10(
0378 void *return_address,
0379 rtems_record_event event,
0380 rtems_record_data data_0,
0381 rtems_record_data data_1,
0382 rtems_record_data data_2,
0383 rtems_record_data data_3,
0384 rtems_record_data data_4,
0385 rtems_record_data data_5,
0386 rtems_record_data data_6,
0387 rtems_record_data data_7,
0388 rtems_record_data data_8,
0389 rtems_record_data data_9
0390 );
0391
0392 void _Record_Exit_2(
0393 void *return_address,
0394 rtems_record_event event,
0395 rtems_record_data data_0,
0396 rtems_record_data data_1
0397 );
0398
0399 void _Record_Exit_3(
0400 void *return_address,
0401 rtems_record_event event,
0402 rtems_record_data data_0,
0403 rtems_record_data data_1,
0404 rtems_record_data data_2
0405 );
0406
0407 void _Record_Exit_4(
0408 void *return_address,
0409 rtems_record_event event,
0410 rtems_record_data data_0,
0411 rtems_record_data data_1,
0412 rtems_record_data data_2,
0413 rtems_record_data data_3
0414 );
0415
0416 void _Record_Exit_5(
0417 void *return_address,
0418 rtems_record_event event,
0419 rtems_record_data data_0,
0420 rtems_record_data data_1,
0421 rtems_record_data data_2,
0422 rtems_record_data data_3,
0423 rtems_record_data data_4
0424 );
0425
0426 void _Record_Exit_6(
0427 void *return_address,
0428 rtems_record_event event,
0429 rtems_record_data data_0,
0430 rtems_record_data data_1,
0431 rtems_record_data data_2,
0432 rtems_record_data data_3,
0433 rtems_record_data data_4,
0434 rtems_record_data data_5
0435 );
0436
0437 void _Record_Exit_7(
0438 void *return_address,
0439 rtems_record_event event,
0440 rtems_record_data data_0,
0441 rtems_record_data data_1,
0442 rtems_record_data data_2,
0443 rtems_record_data data_3,
0444 rtems_record_data data_4,
0445 rtems_record_data data_5,
0446 rtems_record_data data_6
0447 );
0448
0449 void _Record_Exit_8(
0450 void *return_address,
0451 rtems_record_event event,
0452 rtems_record_data data_0,
0453 rtems_record_data data_1,
0454 rtems_record_data data_2,
0455 rtems_record_data data_3,
0456 rtems_record_data data_4,
0457 rtems_record_data data_5,
0458 rtems_record_data data_6,
0459 rtems_record_data data_7
0460 );
0461
0462 void _Record_Exit_9(
0463 void *return_address,
0464 rtems_record_event event,
0465 rtems_record_data data_0,
0466 rtems_record_data data_1,
0467 rtems_record_data data_2,
0468 rtems_record_data data_3,
0469 rtems_record_data data_4,
0470 rtems_record_data data_5,
0471 rtems_record_data data_6,
0472 rtems_record_data data_7,
0473 rtems_record_data data_8
0474 );
0475
0476 void _Record_Exit_10(
0477 void *return_address,
0478 rtems_record_event event,
0479 rtems_record_data data_0,
0480 rtems_record_data data_1,
0481 rtems_record_data data_2,
0482 rtems_record_data data_3,
0483 rtems_record_data data_4,
0484 rtems_record_data data_5,
0485 rtems_record_data data_6,
0486 rtems_record_data data_7,
0487 rtems_record_data data_8,
0488 rtems_record_data data_9
0489 );
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510 static inline void rtems_record_prepare_critical(
0511 rtems_record_context *context,
0512 const Per_CPU_Control *cpu_self
0513 )
0514 {
0515 Record_Control *control;
0516 unsigned int head;
0517
0518 context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 );
0519 control = cpu_self->record;
0520 context->control = control;
0521 head = _Record_Head( control );
0522 context->head = head;
0523 }
0524
0525
0526
0527
0528
0529
0530
0531
0532
0533
0534
0535
0536 static inline void rtems_record_prepare( rtems_record_context *context )
0537 {
0538 uint32_t level;
0539 const Per_CPU_Control *cpu_self;
0540 Record_Control *control;
0541 unsigned int head;
0542
0543 _CPU_ISR_Disable( level );
0544 RTEMS_COMPILER_MEMORY_BARRIER();
0545 context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 );
0546 context->level = level;
0547 cpu_self = _Per_CPU_Get();
0548 control = cpu_self->record;
0549 context->control = control;
0550 head = _Record_Head( control );
0551 context->head = head;
0552 }
0553
0554
0555
0556
0557
0558
0559
0560
0561 static inline void rtems_record_add(
0562 rtems_record_context *context,
0563 rtems_record_event event,
0564 rtems_record_data data
0565 )
0566 {
0567 Record_Control *control;
0568 rtems_record_item *item;
0569 unsigned int head;
0570
0571 control = context->control;
0572 head = context->head;
0573 item = &control->Items[ _Record_Index( control, head ) ];
0574 context->head = head + 1;
0575
0576 item->event = context->now | event;
0577 item->data = data;
0578 }
0579
0580
0581
0582
0583
0584
0585
0586
0587 static inline void rtems_record_commit_critical( rtems_record_context *context )
0588 {
0589 _Atomic_Store_uint(
0590 &context->control->head,
0591 context->head,
0592 ATOMIC_ORDER_RELEASE
0593 );
0594 }
0595
0596
0597
0598
0599
0600
0601 static inline void rtems_record_commit( rtems_record_context *context )
0602 {
0603 rtems_record_commit_critical( context );
0604 RTEMS_COMPILER_MEMORY_BARRIER();
0605 _CPU_ISR_Enable( context->level );
0606 }
0607
0608
0609
0610
0611
0612
0613
0614 void rtems_record_produce( rtems_record_event event, rtems_record_data data );
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624 void rtems_record_produce_2(
0625 rtems_record_event event_0,
0626 rtems_record_data data_0,
0627 rtems_record_event event_1,
0628 rtems_record_data data_1
0629 );
0630
0631
0632
0633
0634
0635
0636
0637 void rtems_record_produce_n(
0638 const rtems_record_item *items,
0639 size_t n
0640 );
0641
0642
0643
0644
0645
0646
0647 void rtems_record_line( void );
0648
0649
0650
0651
0652
0653
0654
0655
0656
0657 void rtems_record_line_2(
0658 rtems_record_event event,
0659 rtems_record_data data
0660 );
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670
0671
0672 void rtems_record_line_3(
0673 rtems_record_event event_0,
0674 rtems_record_data data_0,
0675 rtems_record_event event_1,
0676 rtems_record_data data_1
0677 );
0678
0679
0680
0681
0682
0683
0684
0685
0686
0687 void rtems_record_line_arg( rtems_record_data data );
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698 void rtems_record_line_arg_2(
0699 rtems_record_data data_0,
0700 rtems_record_data data_1
0701 );
0702
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713 void rtems_record_line_arg_3(
0714 rtems_record_data data_0,
0715 rtems_record_data data_1,
0716 rtems_record_data data_2
0717 );
0718
0719
0720
0721
0722
0723
0724
0725
0726
0727
0728
0729
0730 void rtems_record_line_arg_4(
0731 rtems_record_data data_0,
0732 rtems_record_data data_1,
0733 rtems_record_data data_2,
0734 rtems_record_data data_3
0735 );
0736
0737
0738
0739
0740
0741
0742
0743
0744
0745
0746
0747
0748
0749 void rtems_record_line_arg_5(
0750 rtems_record_data data_0,
0751 rtems_record_data data_1,
0752 rtems_record_data data_2,
0753 rtems_record_data data_3,
0754 rtems_record_data data_4
0755 );
0756
0757
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768
0769
0770 void rtems_record_line_arg_6(
0771 rtems_record_data data_0,
0772 rtems_record_data data_1,
0773 rtems_record_data data_2,
0774 rtems_record_data data_3,
0775 rtems_record_data data_4,
0776 rtems_record_data data_5
0777 );
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793 void rtems_record_line_arg_7(
0794 rtems_record_data data_0,
0795 rtems_record_data data_1,
0796 rtems_record_data data_2,
0797 rtems_record_data data_3,
0798 rtems_record_data data_4,
0799 rtems_record_data data_5,
0800 rtems_record_data data_6
0801 );
0802
0803
0804
0805
0806
0807
0808
0809
0810
0811
0812
0813
0814
0815
0816
0817
0818 void rtems_record_line_arg_8(
0819 rtems_record_data data_0,
0820 rtems_record_data data_1,
0821 rtems_record_data data_2,
0822 rtems_record_data data_3,
0823 rtems_record_data data_4,
0824 rtems_record_data data_5,
0825 rtems_record_data data_6,
0826 rtems_record_data data_7
0827 );
0828
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845 void rtems_record_line_arg_9(
0846 rtems_record_data data_0,
0847 rtems_record_data data_1,
0848 rtems_record_data data_2,
0849 rtems_record_data data_3,
0850 rtems_record_data data_4,
0851 rtems_record_data data_5,
0852 rtems_record_data data_6,
0853 rtems_record_data data_7,
0854 rtems_record_data data_8
0855 );
0856
0857
0858
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874 void rtems_record_line_arg_10(
0875 rtems_record_data data_0,
0876 rtems_record_data data_1,
0877 rtems_record_data data_2,
0878 rtems_record_data data_3,
0879 rtems_record_data data_4,
0880 rtems_record_data data_5,
0881 rtems_record_data data_6,
0882 rtems_record_data data_7,
0883 rtems_record_data data_8,
0884 rtems_record_data data_9
0885 );
0886
0887
0888
0889
0890
0891
0892
0893
0894
0895
0896 #define rtems_record_caller() _Record_Caller( RTEMS_RETURN_ADDRESS() )
0897
0898
0899
0900
0901
0902
0903
0904
0905
0906
0907
0908
0909
0910
0911 #define rtems_record_caller_3( event, data ) \
0912 _Record_Caller_3( RTEMS_RETURN_ADDRESS(), event, data )
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925
0926
0927
0928
0929 #define rtems_record_caller_4( event_0, data_0, event_1, data_1 ) \
0930 _Record_Caller_4( \
0931 RTEMS_RETURN_ADDRESS(), \
0932 event_0, \
0933 data_0, \
0934 event_1, \
0935 data_1 \
0936 )
0937
0938
0939
0940
0941
0942
0943
0944
0945
0946
0947
0948
0949
0950 #define rtems_record_caller_arg( data ) \
0951 _Record_Caller_arg( RTEMS_RETURN_ADDRESS(), data )
0952
0953
0954
0955
0956
0957
0958
0959
0960
0961
0962
0963
0964
0965
0966 #define rtems_record_caller_arg_2( data_0, data_1 ) \
0967 _Record_Caller_arg_2( \
0968 RTEMS_RETURN_ADDRESS(), \
0969 data_0, \
0970 data_1 \
0971 )
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981
0982
0983
0984
0985
0986
0987 #define rtems_record_caller_arg_3( data_0, data_1, data_2 ) \
0988 _Record_Caller_arg_3( \
0989 RTEMS_RETURN_ADDRESS(), \
0990 data_0, \
0991 data_1, \
0992 data_2 \
0993 )
0994
0995
0996
0997
0998
0999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010 #define rtems_record_caller_arg_4( data_0, data_1, data_2, data_3 ) \
1011 _Record_Caller_arg_4( \
1012 RTEMS_RETURN_ADDRESS(), \
1013 data_0, \
1014 data_1, \
1015 data_2, \
1016 data_3 \
1017 )
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035 #define rtems_record_caller_arg_5( data_0, data_1, data_2, data_3, data_4 ) \
1036 _Record_Caller_arg_5( \
1037 RTEMS_RETURN_ADDRESS(), \
1038 data_0, \
1039 data_1, \
1040 data_2, \
1041 data_3, \
1042 data_4 \
1043 )
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062 #define rtems_record_caller_arg_6( \
1063 data_0, \
1064 data_1, \
1065 data_2, \
1066 data_3, \
1067 data_4, \
1068 data_5 \
1069 ) \
1070 _Record_Caller_arg_6( \
1071 RTEMS_RETURN_ADDRESS(), \
1072 data_0, \
1073 data_1, \
1074 data_2, \
1075 data_3, \
1076 data_4, \
1077 data_5 \
1078 )
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098 #define rtems_record_caller_arg_7( \
1099 data_0, \
1100 data_1, \
1101 data_2, \
1102 data_3, \
1103 data_4, \
1104 data_5, \
1105 data_6 \
1106 ) \
1107 _Record_Caller_arg_7( \
1108 RTEMS_RETURN_ADDRESS(), \
1109 data_0, \
1110 data_1, \
1111 data_2, \
1112 data_3, \
1113 data_4, \
1114 data_5, \
1115 data_6 \
1116 )
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137 #define rtems_record_caller_arg_8( \
1138 data_0, \
1139 data_1, \
1140 data_2, \
1141 data_3, \
1142 data_4, \
1143 data_5, \
1144 data_6, \
1145 data_7 \
1146 ) \
1147 _Record_Caller_arg_8( \
1148 RTEMS_RETURN_ADDRESS(), \
1149 data_0, \
1150 data_1, \
1151 data_2, \
1152 data_3, \
1153 data_4, \
1154 data_5, \
1155 data_6, \
1156 data_7 \
1157 )
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179 #define rtems_record_caller_arg_9( \
1180 data_0, \
1181 data_1, \
1182 data_2, \
1183 data_3, \
1184 data_4, \
1185 data_5, \
1186 data_6, \
1187 data_7, \
1188 data_8 \
1189 ) \
1190 _Record_Caller_arg_9( \
1191 RTEMS_RETURN_ADDRESS(), \
1192 data_0, \
1193 data_1, \
1194 data_2, \
1195 data_3, \
1196 data_4, \
1197 data_5, \
1198 data_6, \
1199 data_7, \
1200 data_8 \
1201 )
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224 #define rtems_record_caller_arg_10( \
1225 data_0, \
1226 data_1, \
1227 data_2, \
1228 data_3, \
1229 data_4, \
1230 data_5, \
1231 data_6, \
1232 data_7, \
1233 data_8, \
1234 data_9 \
1235 ) \
1236 _Record_Caller_arg_10( \
1237 RTEMS_RETURN_ADDRESS(), \
1238 data_0, \
1239 data_1, \
1240 data_2, \
1241 data_3, \
1242 data_4, \
1243 data_5, \
1244 data_6, \
1245 data_7, \
1246 data_8, \
1247 data_9 \
1248 )
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258 #define rtems_record_entry( event ) \
1259 rtems_record_produce( event, (rtems_record_data) RTEMS_RETURN_ADDRESS() )
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270 #define rtems_record_entry_1( event, data ) \
1271 rtems_record_produce_2( \
1272 event, \
1273 (rtems_record_data) RTEMS_RETURN_ADDRESS(), \
1274 RTEMS_RECORD_ARG_0, \
1275 data \
1276 )
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288 #define rtems_record_entry_2( event, data_0, data_1 ) \
1289 _Record_Entry_2( RTEMS_RETURN_ADDRESS(), event, data_0, data_1 )
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302 #define rtems_record_entry_3( event, data_0, data_1, data_2 ) \
1303 _Record_Entry_3( \
1304 RTEMS_RETURN_ADDRESS(), \
1305 event, \
1306 data_0, \
1307 data_1, \
1308 data_2 \
1309 )
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323 #define rtems_record_entry_4( event, data_0, data_1, data_2, data_3 ) \
1324 _Record_Entry_4( \
1325 RTEMS_RETURN_ADDRESS(), \
1326 event, \
1327 data_0, \
1328 data_1, \
1329 data_2, \
1330 data_3 \
1331 )
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346 #define rtems_record_entry_5( \
1347 event, \
1348 data_0, \
1349 data_1, \
1350 data_2, \
1351 data_3, \
1352 data_4 \
1353 ) \
1354 _Record_Entry_5( \
1355 RTEMS_RETURN_ADDRESS(), \
1356 event, \
1357 data_0, \
1358 data_1, \
1359 data_2, \
1360 data_3, \
1361 data_4 \
1362 )
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378 #define rtems_record_entry_6( \
1379 event, \
1380 data_0, \
1381 data_1, \
1382 data_2, \
1383 data_3, \
1384 data_4, \
1385 data_5 \
1386 ) \
1387 _Record_Entry_6( \
1388 RTEMS_RETURN_ADDRESS(), \
1389 event, \
1390 data_0, \
1391 data_1, \
1392 data_2, \
1393 data_3, \
1394 data_4, \
1395 data_5 \
1396 )
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413 #define rtems_record_entry_7( \
1414 event, \
1415 data_0, \
1416 data_1, \
1417 data_2, \
1418 data_3, \
1419 data_4, \
1420 data_5, \
1421 data_6 \
1422 ) \
1423 _Record_Entry_7( \
1424 RTEMS_RETURN_ADDRESS(), \
1425 event, \
1426 data_0, \
1427 data_1, \
1428 data_2, \
1429 data_3, \
1430 data_4, \
1431 data_5, \
1432 data_6 \
1433 )
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451 #define rtems_record_entry_8( \
1452 event, \
1453 data_0, \
1454 data_1, \
1455 data_2, \
1456 data_3, \
1457 data_4, \
1458 data_5, \
1459 data_6, \
1460 data_7 \
1461 ) \
1462 _Record_Entry_8( \
1463 RTEMS_RETURN_ADDRESS(), \
1464 event, \
1465 data_0, \
1466 data_1, \
1467 data_2, \
1468 data_3, \
1469 data_4, \
1470 data_5, \
1471 data_6, \
1472 data_7 \
1473 )
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492 #define rtems_record_entry_9( \
1493 event, \
1494 data_0, \
1495 data_1, \
1496 data_2, \
1497 data_3, \
1498 data_4, \
1499 data_5, \
1500 data_6, \
1501 data_7, \
1502 data_8 \
1503 ) \
1504 _Record_Entry_9( \
1505 RTEMS_RETURN_ADDRESS(), \
1506 event, \
1507 data_0, \
1508 data_1, \
1509 data_2, \
1510 data_3, \
1511 data_4, \
1512 data_5, \
1513 data_6, \
1514 data_7, \
1515 data_8 \
1516 )
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536 #define rtems_record_entry_10( \
1537 event, \
1538 data_0, \
1539 data_1, \
1540 data_2, \
1541 data_3, \
1542 data_4, \
1543 data_5, \
1544 data_6, \
1545 data_7, \
1546 data_8, \
1547 data_9 \
1548 ) \
1549 _Record_Entry_10( \
1550 RTEMS_RETURN_ADDRESS(), \
1551 event, \
1552 data_0, \
1553 data_1, \
1554 data_2, \
1555 data_3, \
1556 data_4, \
1557 data_5, \
1558 data_6, \
1559 data_7, \
1560 data_8, \
1561 data_9 \
1562 )
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572 #define rtems_record_exit( event ) \
1573 rtems_record_produce( event, (rtems_record_data) RTEMS_RETURN_ADDRESS() )
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584 #define rtems_record_exit_1( event, data ) \
1585 rtems_record_produce_2( \
1586 event, \
1587 (rtems_record_data) RTEMS_RETURN_ADDRESS(), \
1588 RTEMS_RECORD_RETURN_0, \
1589 data \
1590 )
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602 #define rtems_record_exit_2( event, data_0, data_1 ) \
1603 _Record_Entry_2( RTEMS_RETURN_ADDRESS(), event, data_0, data_1 )
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616 #define rtems_record_exit_3( event, data_0, data_1, data_2 ) \
1617 _Record_Exit_3( \
1618 RTEMS_RETURN_ADDRESS(), \
1619 event, \
1620 data_0, \
1621 data_1, \
1622 data_2 \
1623 )
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637 #define rtems_record_exit_4( event, data_0, data_1, data_2, data_3 ) \
1638 _Record_Exit_4( \
1639 RTEMS_RETURN_ADDRESS(), \
1640 event, \
1641 data_0, \
1642 data_1, \
1643 data_2, \
1644 data_3 \
1645 )
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660 #define rtems_record_exit_5( \
1661 event, \
1662 data_0, \
1663 data_1, \
1664 data_2, \
1665 data_3, \
1666 data_4 \
1667 ) \
1668 _Record_Exit_5( \
1669 RTEMS_RETURN_ADDRESS(), \
1670 event, \
1671 data_0, \
1672 data_1, \
1673 data_2, \
1674 data_3, \
1675 data_4 \
1676 )
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692 #define rtems_record_exit_6( \
1693 event, \
1694 data_0, \
1695 data_1, \
1696 data_2, \
1697 data_3, \
1698 data_4, \
1699 data_5 \
1700 ) \
1701 _Record_Exit_6( \
1702 RTEMS_RETURN_ADDRESS(), \
1703 event, \
1704 data_0, \
1705 data_1, \
1706 data_2, \
1707 data_3, \
1708 data_4, \
1709 data_5 \
1710 )
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727 #define rtems_record_exit_7( \
1728 event, \
1729 data_0, \
1730 data_1, \
1731 data_2, \
1732 data_3, \
1733 data_4, \
1734 data_5, \
1735 data_6 \
1736 ) \
1737 _Record_Exit_7( \
1738 RTEMS_RETURN_ADDRESS(), \
1739 event, \
1740 data_0, \
1741 data_1, \
1742 data_2, \
1743 data_3, \
1744 data_4, \
1745 data_5, \
1746 data_6 \
1747 )
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765 #define rtems_record_exit_8( \
1766 event, \
1767 data_0, \
1768 data_1, \
1769 data_2, \
1770 data_3, \
1771 data_4, \
1772 data_5, \
1773 data_6, \
1774 data_7 \
1775 ) \
1776 _Record_Exit_8( \
1777 RTEMS_RETURN_ADDRESS(), \
1778 event, \
1779 data_0, \
1780 data_1, \
1781 data_2, \
1782 data_3, \
1783 data_4, \
1784 data_5, \
1785 data_6, \
1786 data_7 \
1787 )
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806 #define rtems_record_exit_9( \
1807 event, \
1808 data_0, \
1809 data_1, \
1810 data_2, \
1811 data_3, \
1812 data_4, \
1813 data_5, \
1814 data_6, \
1815 data_7, \
1816 data_8 \
1817 ) \
1818 _Record_Exit_9( \
1819 RTEMS_RETURN_ADDRESS(), \
1820 event, \
1821 data_0, \
1822 data_1, \
1823 data_2, \
1824 data_3, \
1825 data_4, \
1826 data_5, \
1827 data_6, \
1828 data_7, \
1829 data_8 \
1830 )
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850 #define rtems_record_exit_10( \
1851 event, \
1852 data_0, \
1853 data_1, \
1854 data_2, \
1855 data_3, \
1856 data_4, \
1857 data_5, \
1858 data_6, \
1859 data_7, \
1860 data_8, \
1861 data_9 \
1862 ) \
1863 _Record_Exit_10( \
1864 RTEMS_RETURN_ADDRESS(), \
1865 event, \
1866 data_0, \
1867 data_1, \
1868 data_2, \
1869 data_3, \
1870 data_4, \
1871 data_5, \
1872 data_6, \
1873 data_7, \
1874 data_8, \
1875 data_9 \
1876 )
1877
1878
1879
1880
1881
1882
1883 uint32_t rtems_record_interrupt_disable( void );
1884
1885
1886
1887
1888
1889
1890
1891
1892 void rtems_record_interrupt_enable( uint32_t level );
1893
1894
1895
1896
1897
1898
1899 typedef struct {
1900
1901
1902
1903
1904 rtems_record_item *fetched_items;
1905
1906
1907
1908
1909
1910 size_t fetched_count;
1911
1912
1913
1914
1915
1916 struct {
1917 #ifdef RTEMS_SMP
1918
1919
1920
1921
1922 uint32_t cpu_index;
1923 #endif
1924
1925
1926
1927
1928
1929 size_t cpu_todo;
1930
1931
1932
1933
1934 rtems_record_item *storage_items;
1935
1936
1937
1938
1939
1940 size_t storage_item_count;
1941 } internal;
1942 } rtems_record_fetch_control;
1943
1944
1945
1946
1947
1948 typedef enum {
1949
1950
1951
1952
1953 RTEMS_RECORD_FETCH_DONE,
1954
1955
1956
1957
1958
1959 RTEMS_RECORD_FETCH_CONTINUE,
1960
1961
1962
1963
1964
1965 RTEMS_RECORD_FETCH_INVALID_ITEM_COUNT
1966 } rtems_record_fetch_status;
1967
1968
1969
1970
1971
1972
1973
1974
1975 size_t rtems_record_get_item_count_for_fetch( void );
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991 void rtems_record_fetch_initialize(
1992 rtems_record_fetch_control *control,
1993 rtems_record_item *items,
1994 size_t count
1995 );
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017 rtems_record_fetch_status rtems_record_fetch(
2018 rtems_record_fetch_control *control
2019 );
2020
2021
2022
2023 #ifdef __cplusplus
2024 }
2025 #endif
2026
2027 #endif