RTEMS stack + TSIM-LEON2 weird behaviour
Joel Sherrill
joel.sherrill at OARcorp.com
Mon May 19 13:43:12 UTC 2008
Jiri Gaisler wrote:
> The code at line 228 in start.S stores the memory size into
> address 0x7C0 in the trap table:
>
> Assembly:
>
> set (SYM(rdb_start)), %g6 ! End of work-space area
> st %sp, [%g6]
> set (SYM(Configuration)), %l1
> ld [%l1+4], %l3 ! work_space_size
> sub %sp, %l3, %sp ! set %sp to area below work_space
> andn %sp, 0x0f, %sp ! align stack on 16-byte boundary
>
> mov %sp, %fp ! Set frame pointer
> nop
>
> Simulator:
>
> 49 40001038 0d100001 sethi %hi(0x40000400), %g6
> 50 4000103c 8c11a3c0 or %g6, 0x3c0, %g6
> 51 40001040 dc218000 st %sp, [%g6]
> 60 40001044 2310005b sethi %hi(0x40016c00), %l1
> 61 40001048 a2146134 or %l1, 0x134, %l1
> 62 4000104c e6046004 ld [%l1 + 0x4], %l3
> 66 40001050 9c238013 sub %sp, %l3, %sp
> 75 40001054 9c2ba00f andn %sp, 0xf, %sp
> 76 40001058 bc10000e mov %sp, %fp
> 77 4000105c 01000000 nop
>
>
> I think that the comment 'End of work-space area' is not quite correct.
> The rdbmon debug stub uses the 0x7C0 info to know how much memory is
> in the system.
>
I knew it went somewhere but not precisely the magic.
Fix the comment as you see fit and submit it for 4.7 and 4.8.
I think the memory on this BSP (until last week) was laid out
with .bss, C program heap, starting stack and then RTEMS
Workspace. Weird that the starting stack was in the middle
and unlike any other BSP.
I changed this area of code last week on the head. The C program
heap and RTEMS workspace are not contiguous and the
starting stack is at the end of memory. This lets the sparc
BSPs use the new shared code to split the memory up.
--joel
> Jiri.
>
> Joel Sherrill wrote:
>
>> Jiri Gaisler wrote:
>>
>>> %sp is set either by the boot loader (mkprom), grmon
>>> or rdbmon (gdb stub). The %sp is also stored to an
>>> unused part of the trap table (0x7C0). This works
>>> fine without any problems on both simulator and
>>> real hardware ...
>>>
>>>
>> I understand that but what is the purpose
>> of the sub instruction at line 228 of start.S?
>> It is using the original %sp in math to get
>> the starting stack.
>>
>> Is the value of %sp always 0 here? Or is it
>> possible to be non-zero?
>> If it is always zero, then a mov would be safer.
>>
>> If it is non-zero, does this statement make sense?
>>
>> I trust the environment is right when the BSP
>> gets control. I have never seen a problem but
>> the math just bothers me and there must be
>> a guarantee I am missing.
>>
>> --joel
>>
>>> Jiri.
>>>
>>> Joel Sherrill wrote:
>>>
>>>
>>>
>>>> I don't disagree. But why is the stack pointer set the way it is in
>>>> start.S? It assumes some value is in %sp from the invoking environment.
>>>> If that
>>>> isn't 0, it looks to me that the code doesn't work.
>>>>
>>>> --joel
>>>>
>>>>
>>>>> Jiri.
>>>>>
>>>>>
>>>>>
>>>>> Joel Sherrill wrote:
>>>>>
>>>>>
>>>>>
>>>>>> Aitor.Viana.Sanchez at esa.int wrote:
>>>>>>
>>>>>>
>>>>>>
>>>>>>>> The initial value of %sp seens to be 0 on the sparc configurations I
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> have.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> So the sub instruction you highlighted above would set the %sp to
>>>>>>>> the area below the work space.
>>>>>>>> This code hasn't changed in a LONG time and makes
>>>>>>>> assumptions about
>>>>>>>> the execution environment which I cannot personally guarantee. Jiri
>>>>>>>> would be able to do so.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> i am pretty sure (Jiri will correct me if I am wrong) that TSIM
>>>>>>> initializes %sp and %fp to allow direct RAM execution in case the SW
>>>>>>> does not have a bootstrap SW behind (e.g. mkprom)
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> My first thought this morning is that this may have been a valid
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> assumption
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> at one time (initial %sp is 0) but with more variations and starting
>>>>>>>> environments,
>>>>>>>> it may not be valid anymore. I would guess that the "sub" statement
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> would
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>> be better changed to a "mov %l3, %sp" and ignore the inherited %sp.
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>> I think this a good solution.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> It is certainly simple. We need confirmation from Jiri or Daniel.
>>>>>>
>>>>>>
>>>>>>
>>>>>>> Regards,
>>>>>>>
>>>>>>> Aitor
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>
--
Joel Sherrill, Ph.D. Director of Research & Development
joel.sherrill at OARcorp.com On-Line Applications Research
Ask me about RTEMS: a free RTOS Huntsville AL 35805
Support Available (256) 722-9985
More information about the users
mailing list