rtems_cache_coherent_allocate() crash on CPU unaligned memory access

Mike Looijmans mike.looijmans at topic.nl
Wed Jun 14 13:27:26 UTC 2017

The system has a LEON2 CPU that has 512MB RAM attached.

I want to use 128MB of that memory as cache coherent memory, so I've mapped it 
to a non-cacheable region of the LEON2 address space, at 0xB0000000. The lower 
256 is mapped to 0x40000000.

In the bsp_start() routine, just like e.g. the Zynq BSP, I call (simplified code):

   rtems_cache_coherent_add_area(0xB0000000, 0x08000000);

The driver calls, at some point (I also tried passing "8" or "PAGE_SIZE" as 
alignment parameter instead of "0"):

   rtems_cache_coherent_allocate(256*1024, 0, 0);

The result is always (as reported by grmon):

   IU in error mode (tt = 0x07, mem address not aligned)
   0x4016c008: c600a004  ld  [%g2 + 0x4], %g3  <_Heap_Block_allocate+20>

Note: If I don't call rtems_cache_coherent_add_area() in the BSP startup, 
there's no crash, but rtems_cache_coherent_allocate will actually use the 
normal heap instead of the coherent one.

Why I'm doing this: The hardware writes to the (shared) DDR controller 
directly, and the LEON2 snoop unit cannot "see" that. Hence I want the LEON2 
to read/write the memory that the hardware accesses without using the data 
cache, otherwise it won't be coherent. I've verified with grmon that this 
memory map really does work correctly.

Some extra debugging info:

grmon2> dis _Heap_Block_allocate
        0x4016bff4: 9de3bfa0  save  %sp, -96, %sp        <_Heap_Block_allocate+0>
        0x4016bff8: c2066004  ld  [%i1 + 0x4], %g1       <_Heap_Block_allocate+4>
        0x4016bffc: ba06bff8  add  %i2, -8, %i5          <_Heap_Block_allocate+8>
        0x4016c000: 82087ffe  and  %g1, 0xFFFFFFFE, %g1  <_Heap_Block_allocate+12>
        0x4016c004: 84064001  add  %i1, %g1, %g2         <_Heap_Block_allocate+16>
    0=> 0x4016c008: c600a004  ld  [%g2 + 0x4], %g3       <_Heap_Block_allocate+20>
        0x4016c00c: b8100018  mov  %i0, %i4              <_Heap_Block_allocate+24>
        0x4016c010: 8088e001  andcc  %g3, 0x1, %g0       <_Heap_Block_allocate+28>
        0x4016c014: 1280000f  bne  0x4016C050            <_Heap_Block_allocate+32>
        0x4016c018: 96274019  sub  %i5, %i1, %o3         <_Heap_Block_allocate+36>
        0x4016c01c: f806600c  ld  [%i1 + 0xC], %i4       <_Heap_Block_allocate+40>
        0x4016c020: da066008  ld  [%i1 + 0x8], %o5       <_Heap_Block_allocate+44>
        0x4016c024: de062044  ld  [%i0 + 0x44], %o7      <_Heap_Block_allocate+48>
        0x4016c028: c806204c  ld  [%i0 + 0x4C], %g4      <_Heap_Block_allocate+52>
        0x4016c02c: da272008  st  %o5, [%i4 + 0x8]       <_Heap_Block_allocate+56>

grmon2> bt

        %pc          %sp
   #0   0x4016c008   0x4efffc10   <_Heap_Block_allocate+0x14>
   #1   0x4016b7ac   0x4efffc70   <_Heap_Allocate_aligned_with_boundary+0x1e4>
   #2   0x40163f44   0x4efffcd8   <rtems_cache_coherent_allocate+0x28>
   #3   0x4011873c   0x4efffd38   <mydriver_core_probe+0x778>
   #4   0x40116228   0x4efffdb0   <mydriver_initialize+0x7c>
   #5   0x40171db0   0x4efffe10   <rtems_io_initialize+0x4c>
   #6   0x4016aaec   0x4efffe70   <_IO_Initialize_all_drivers+0x2c>
   #7   0x4016aa24   0x4efffed0   <rtems_initialize_device_drivers+0x4>
   #8   0x40161384   0x4effff30   <boot_card+0x44>

Kind regards,

Mike Looijmans
System Expert

TOPIC Products
Materiaalweg 4, NL-5681 RJ Best
Postbus 440, NL-5680 AK Best
Telefoon: +31 (0) 499 33 69 79
E-mail: mike.looijmans at topicproducts.com
Website: www.topicproducts.com

Please consider the environment before printing this e-mail

More information about the users mailing list