Need help finding the cause of an ARM4 Exception

Gedare Bloom gedare at rtems.org
Wed Aug 12 20:50:36 UTC 2020


On Wed, Aug 12, 2020 at 2:28 PM Richi Dubey <richidubey at gmail.com> wrote:
>
> Hi,
>
> Can someone please help me figure out why I am getting the _ARMV4_Exception_data_abort_default?
>
> I have attached the gdb script (Provided by Mr. Huber) that I used with this email. I have also printed the commands I have used to run gdb and qemu.
>
> I have provided my view on this exception and the link to PR with my changes at the end.
>
> qemu executed with the command:
> --------------------------------------------------------------------------------------------------------------------------
>  ./qemu-system-arm -net none -nographic -M realview-pbx-a9 -m 256M -kernel ~/quick-start/build/b3-realview/arm-rtems5/c/realview_pbx_a9_qemu/testsuites/smptests/smpstrongapa01.exe -smp 3 -S -s
>
> --------------------------------------------------------------------------------------------------------------------------
>
> GDB commands used:
> --------------------------------------------------------------------------------------------------------------------------
>
>  ~/quick-start/rtems/5/bin$ ./arm-rtems5-gdb --command=arm.gdb ~/quick-start/build/b3-realview/arm-rtems5/c/realview_pbx_a9_qemu/testsuites/smptests/smpstrongapa01.exe
> .
> .
> .
> Loading section .fini_array, size 0x4 lma 0x121184
> Loading section .rtemsroset, size 0x74 lma 0x121188
> Loading section .data, size 0x530 lma 0x200000
> Start address 0x00100040, load size 136967
> Transfer rate: 26751 KB/sec, 1778 bytes/write.
> (gdb) continue
> Continuing.
>
> Thread 1 hit Breakpoint 2, _ARMV4_Exception_data_abort_default () at /home/richi/quick-start/src/rtems/c/src/../../cpukit/score/cpu/arm/armv4-exception-default.S:70
> 70 sub sp, #MORE_CONTEXT_SIZE
> (gdb) bt
> #0  _ARMV4_Exception_data_abort_default () at /home/richi/quick-start/src/rtems/c/src/../../cpukit/score/cpu/arm/armv4-exception-default.S:70
> #1  0x00118c64 in _Scheduler_strong_APA_Get_lowest_scheduled (context=0x200620 <_Configuration_Scheduler_strong_APA_dflt>, filter_base=0x201910 <_RTEMS_tasks_Objects+600>) at /home/richi/quick-start/src/rtems/c/src/../../cpukit/score/src/schedulerstrongapa.c:318
> Backtrace stopped: previous frame inner to this frame (corrupt stack?)
> (gdb) reset
> Loading section .start, size 0x8e0 lma 0x100000
> Loading section .text, size 0x1f00c lma 0x100900
> Loading section .init, size 0xc lma 0x11f90c
> Loading section .fini, size 0xc lma 0x11f918
> Loading section .rodata, size 0x184b lma 0x11f928
> Loading section .ARM.exidx, size 0x8 lma 0x121174
> Loading section .eh_frame, size 0x4 lma 0x12117c
> Loading section .init_array, size 0x4 lma 0x121180
> Loading section .fini_array, size 0x4 lma 0x121184
> Loading section .rtemsroset, size 0x74 lma 0x121188
> Loading section .data, size 0x530 lma 0x200000
> Start address 0x00100040, load size 136967
> Transfer rate: 8359 KB/sec, 1778 bytes/write.
> (gdb) b _Scheduler_strong_APA_Get_lowest_scheduled
> Breakpoint 7 at 0x118bee: file /home/richi/quick-start/src/rtems/c/src/../../cpukit/score/src/schedulerstrongapa.c, line 287.
> (gdb) continue
> Continuing.
>
> Thread 1 hit Breakpoint 7, _Scheduler_strong_APA_Get_lowest_scheduled (context=0x200620 <_Configuration_Scheduler_strong_APA_dflt>, filter_base=0x201910 <_RTEMS_tasks_Objects+600>) at /home/richi/quick-start/src/rtems/c/src/../../cpukit/score/src/schedulerstrongapa.c:287
> 287  front = 0;
> (gdb) ni
> 0x00118bf0 287  front = 0;
> (gdb)
> 289  rear = -1;
> (gdb)
> 0x00118bf6 289  rear = -1;
> (gdb)
> 291  self = _Scheduler_strong_APA_Get_self( context );
> (gdb)
> 0x00118bfa 291  self = _Scheduler_strong_APA_Get_self( context );
> (gdb)
> 0x00118bfe 291  self = _Scheduler_strong_APA_Get_self( context );
> (gdb)
> 293  visited = self->visited->visited;
> (gdb)
> 0x00118c02 293  visited = self->visited->visited;
> (gdb)
> 0x00118c04 293  visited = self->visited->visited;
> (gdb)
> 294  queue = self->queue->Cpu;
> (gdb)
> 0x00118c08 294  queue = self->queue->Cpu;
> (gdb)
> 0x00118c0a 294  queue = self->queue->Cpu;
> (gdb)
> 295  caller = self->caller->caller;
> (gdb)
> 0x00118c0e 295  caller = self->caller->caller;
> (gdb)
> 0x00118c10 295  caller = self->caller->caller;
> (gdb)
> 297  filter_priority = _Scheduler_Node_get_priority( filter_base );
> (gdb)
> 0x00118c14 297  filter_priority = _Scheduler_Node_get_priority( filter_base );
> (gdb)
> 0x00118c18 297  filter_priority = _Scheduler_Node_get_priority( filter_base );
> (gdb)
> 298  filter_priority = SCHEDULER_PRIORITY_PURIFY( filter_priority );
> (gdb)
> 0x00118c20 298  filter_priority = SCHEDULER_PRIORITY_PURIFY( filter_priority );
> (gdb)
> 0x00118c24 298  filter_priority = SCHEDULER_PRIORITY_PURIFY( filter_priority );
> (gdb)
> 0x00118c28 298  filter_priority = SCHEDULER_PRIORITY_PURIFY( filter_priority );
> (gdb)
> 0x00118c2c 298  filter_priority = SCHEDULER_PRIORITY_PURIFY( filter_priority );
> (gdb)
> 0x00118c30 298  filter_priority = SCHEDULER_PRIORITY_PURIFY( filter_priority );
> (gdb)
> 300  ret = NULL; //To remove compiler warning.
> (gdb)
> 0x00118c36 300  ret = NULL; //To remove compiler warning.
> (gdb)
> 304  filter_node = _Scheduler_strong_APA_Node_downcast( filter_base );
> (gdb)
> 0x00118c3a 304  filter_node = _Scheduler_strong_APA_Node_downcast( filter_base );
> (gdb)
> 0x00118c3e 304  filter_node = _Scheduler_strong_APA_Node_downcast( filter_base );
> (gdb)
> 306  max_priority_num = 0;//Max (Lowest) priority encountered so far.
> (gdb)
> 0x00118c44 306  max_priority_num = 0;//Max (Lowest) priority encountered so far.
> (gdb)
> 312  cpu_max = _SMP_Get_processor_maximum();
> (gdb)
> 0x00118c4c 312  cpu_max = _SMP_Get_processor_maximum();
> (gdb)
> 314  for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
> (gdb)
> 0x00118c50 314  for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
> (gdb)
> 0x00118c52 314  for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
> (gdb)
> 0x00118cb2 314  for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
> (gdb)
> 0x00118cb4 314  for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
> (gdb)
> 0x00118cb6 314  for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
> (gdb)
> 0x00118cb8 314  for ( cpu_index = 0 ; cpu_index < cpu_max ; ++cpu_index ) {
> (gdb)
> 315    visited[ cpu_index ] = false;
> (gdb)
> 0x00118c56 315    visited[ cpu_index ] = false;
> (gdb)
> 0x00118c58 315    visited[ cpu_index ] = false;
> (gdb)
> 0x00118c5a 315    visited[ cpu_index ] = false;
> (gdb)
> 0x00118c5c 315    visited[ cpu_index ] = false;
> (gdb)
>
> Thread 1 hit Breakpoint 2, _ARMV4_Exception_data_abort_default () at /home/richi/quick-start/src/rtems/c/src/../../cpukit/score/cpu/arm/armv4-exception-default.S:70
> 70 sub sp, #MORE_CONTEXT_SIZE
> (gdb)
> 71 stmdb sp!, {r0-r12}
> (gdb)

You should be able to print the exception context and see what are the
values of some different registers. This might be helpful.

data_abort means you tried to access some bad data address with a
memory read/write - this is often either a null pointer or a corrupted
pointer.

I'm a little bit confused about
https://github.com/richidubey/rtems/pull/7/files#diff-37221bf93c4995ceebac60adf1ab84b3R109

typedef struct
{
  bool visited[ RTEMS_ZERO_LENGTH_ARRAY ];
} Scheduler_strong_APA_Visited;

I don't see where this gets initialized.

You have Scheduler_strong_APA_Visited *visited;
inside of the context. Then you get
visited = self->visited->visited;

Probably this is now a pointer to a 0-length array, and you make a
bunch of bad writes past the end of it.

> --------------------------------------------------------------------------------------------------------------------------
>
> The exception occurs just after the visited array gets (or tries to get) initialized.
> I believe this could be because :
>
> 1) I might not have defined the variable properly here between lines 260 to 262 . I do not understand how this configuration definition works in this case, i.e. for SCHEDULER_STRONG_APA_CONTEXT_NAME( name  ) or for #define RTEMS_SCHEDULER_STRONG_APA( name, prio_count ). I would appreciate it if someone could explain to me how this works.
>

This code is initializing the default scheduler context for strong
apa. You need to make sure this initializer is in sync with the
definition of the strong apa context structure layout. Right now, this
is not matching up correctly with how you have defined
Scheduler_strong_APA_Context;

> 2) Of this comment by Dr. Bloom. which I still don't know how to address. Someone, please help me out with this as well.
>

If there is code that casts a Scheduler_SMP_Node* to an
Scheduler_strong_APA_Node* it will not work correctly the way you have
structured the Scheduler_strong_APA_Node, because you have something
(Chain_Node) in the structure prior to the Scheduler_SMP_Node.

I think you need to review how C structs are laid out in memory.

> Please find the Pull Request at: https://github.com/richidubey/rtems/pull/7
>
> Thanks,
> Richi.
> _______________________________________________
> devel mailing list
> devel at rtems.org
> http://lists.rtems.org/mailman/listinfo/devel


More information about the devel mailing list