Running RTEMS on a LEON2 from ROM

Mike Looijmans mike.looijmans at topic.nl
Wed Jul 26 11:36:06 UTC 2017


On 26-07-17 13:10, Mike Looijmans wrote:
> On 26-07-17 10:21, Jiri Gaisler wrote:
>>
>>
>> On 07/26/2017 07:25 AM, Mike Looijmans wrote:
>>>
>>>> how you do it with standalone sis:
>>>>
>>>> $ sparc-rtems4.12-sis -leon2 application.exe
>>>>
>>>>> hi 100
>>>>> go
>>>>> hi
>>>>> reg
>>>
>>> Doesn't get very far, there's apparently no (working) memory at
>>> 0x40000000 in the simulator, it always reads back as "0", so any
>>> access to RAM results in a crash in the simulator.
>>>
>>>
>>>
>>
>> Are  you sure you are building sis and gdb from RSB head? sis in the
>> regular gdb does not support leon2 yet.
>> To advance things, you can send me your application binary and I can run
>> it in the simulator and send you the traces. If you are on 64-bit ubuntu
>> 16.04, I can also provide you with binaries for sis/gdb, or the whole RSB.
> 
> I built the current HEAD of the RSB, and ran using the simulator from that. 
> The result is the same.
> 
> Did some more digging. The problem appears to be that the simulator populates 
> the memory segments using the VMA values instead of the LMA values. So it 
> writes the data segment to RAM at 0x40000000, instead of in ROM, directly 
> following the text segment, as the boot code expects. I can see the data 
> segment contents there just after loading the elf.
> 
> When the code starts, it copies the data segment from ROM into RAM and that 
> will copy the empty ROM part onto the RAM, resulting in the all-zero data in 
> RAM that I see.
> 
> Can I load a binary image into sis? (so not an elf but a raw ROM image)
> 
> I'll try using objdump to concat the text and data into a single segment elf 
> for the simulator. Or maybe patch the VMA address to match the LMA.

That worked. According to SIS, the crash happens here:

https://git.rtems.org/rtems/tree/cpukit/score/src/heap.c?h=4.11#n274

 From sis, i can see:

     18156  0000da3c  81c3e008  retl
     18158  0000da40  01000000  nop
     18159  00006eec  c41fbff8  ldd  [ %fp + -8 ], %g2
     18162  00006ef0  b406401a  add  %i1, %i2, %i2
     18163  00006ef4  f020a008  st  %i0, [ %g2 + 8 ]
     18166  00006ef8  f020a00c  st  %i0, [ %g2 + 0xc ]
     18169  00006efc  f4208000  st  %i2, [ %g2 ]
     18172  00006f00  8220c002  sub  %g3, %g2, %g1
     18173  00006f04  88106001  or  %g1, 1, %g4
     18174  00006f08  c820a004  st  %g4, [ %g2 + 4 ]
     18177  00006f0c  c43e2020  std  %g2, [ %i0 + 0x20 ]
     18181  00006f10  c4262008  st  %g2, [ %i0 + 8 ]
     18184  00006f14  c426200c  st  %g2, [ %i0 + 0xc ]
     18187  00006f18  f6262010  st  %i3, [ %i0 + 0x10 ]
     18190  00006f1c  fa262014  st  %i5, [ %i0 + 0x14 ]
     18193  00006f20  f2262018  st  %i1, [ %i0 + 0x18 ]
     18196  00006f24  f426201c  st  %i2, [ %i0 + 0x1c ]
     18199  00006f28  c220c000  st  %g1, [ %g3 ]
     18203  40000090  91d020ff  ta  0xff
sis> reg

	  INS       LOCALS      OUTS     GLOBALS
    0:  40002500   91CFE0F0   51CF6D70   00000000
    1:  00000000   00006F28   00000008   51CF6D70
    2:  00000068   00006F2C   0A39EDAF   40007380
    3:  00000010   00000000   00000007   91CFE0F0
    4:  400FFE70   00000000   FFFFFFFF   51CF6D71
    5:  40002568   00000000   00000008   00000000
    6:  400FFE10   00000000   400FFDB0   00000000
    7:  00006EE4   00000000   00006DD0   00000000

  psr: 00400FC3   wim: 00000002   tbr: 40000090   y: 00000000


Looked this address up in the "objdump -S" output, and that shows the 
following source code and assembly there:

   /* Heap control */
   heap->page_size = page_size;
     6f18:	f6 26 20 10 	st  %i3, [ %i0 + 0x10 ]
   heap->min_block_size = min_block_size;
     6f1c:	fa 26 20 14 	st  %i5, [ %i0 + 0x14 ]
   heap->area_begin = heap_area_begin;
     6f20:	f2 26 20 18 	st  %i1, [ %i0 + 0x18 ]
   heap->area_end = heap_area_end;
     6f24:	f4 26 20 1c 	st  %i2, [ %i0 + 0x1c ]
   heap->last_block = last_block;
   _Heap_Free_list_head( heap )->next = first_block;
   _Heap_Free_list_tail( heap )->prev = first_block;

   /* Last block */
   last_block->prev_size = first_block_size;
     6f28:	c2 20 c0 00 	st  %g1, [ %g3 ]


Something's up with the heap initialization. Haven't found out what exactly 
though. %g3=91CFE0F0 but should be in the RAM range (400XXXXX) for that "st" 
to make sense.



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