[PATCH] score/i386: Add context switch restore external symbol as a marker.
Sebastian Huber
sebastian.huber at embedded-brains.de
Fri Jul 22 06:10:16 UTC 2016
On 22/07/16 08:03, Sebastian Huber wrote:
>
>
> On 22/07/16 07:51, Chris Johns wrote:
>> On 22/07/2016 15:39, Sebastian Huber wrote:
>>> On 22/07/16 07:30, Chris Johns wrote:
>>>> On 22/07/2016 15:26, Sebastian Huber wrote:
>>>>> Could we please use the _CPU_* prefix only for stuff defined by
>>>>> the CPU
>>>>> port interface and use something like _I386_* for things that are
>>>>> specific to a particular architecture.
>>>>
>>>> I would like this to be added to the formal _CPU_* port interface.
>>>> Without the marker the CPU will not able to support proper debugging.
>>>>
>>>> I see the patch as correct.
>>>
>>> To me this looks quite x86 specific.
>>
>> This is the current target I am working on and the only one I have
>> looked at.
>
> In order to move it to the CPU port area it should work on at least
> two architectures from my point of view. The MIPS and LM32 use already
> a _CPU_Context_switch_restore symbol. Is this similar to your x86 use
> case? CPU port defines, functions, etc. should be documented in
> "cpukit/score/cpu/no_cpu/rtems/score/cpu.h".
>
>>
>>> How would you set and use this
>>> marker on ARM, PowerPC and SPARC for example?
>>
>> I have not looked at the ARM in detail and would have to look up the
>> instructions but a guess would be 'L_restore:' in arm/cpu_asm.S. I do
>> not use the PowerPC or SPARC.
>>
>> The requirement is the marker is the address to set the PC (IP) along
>> with the registers held in the TCB so a valid stack frame exists that
>> a DWARF unwind'er can unwind. It must exist somewhere in each system
>> or the context could not be restored.
>>
>> Chris
>
> Why can't you use the PC stored in the context along with the saved
> registers? This is how the thread debug support works on ARM, PowerPC
> and SPARC. Threads that did never run have an PC set to
> _Thread_Handler(). They never called _CPU_Context_switch(), so your
> marker would not work.
>
On i386 the PC is stored on the stack frame:
#define _CPU_Context_Initialize( _the_context, _stack_base, _size, \
_isr, _entry_point, _is_fp,
_tls_area ) \
do { \
uint32_t _stack; \
\
(void) _is_fp; /* avoid warning for being unused */ \
if ( (_isr) ) (_the_context)->eflags = CPU_EFLAGS_INTERRUPTS_OFF; \
else (_the_context)->eflags = CPU_EFLAGS_INTERRUPTS_ON; \
\
_stack = ((uint32_t)(_stack_base)) + (_size); \
_stack &= ~ (CPU_STACK_ALIGNMENT - 1); \
_stack -= 2*sizeof(proc_ptr*); /* see above for why we need to do
this */ \
*((proc_ptr *)(_stack)) = (_entry_point); \
(_the_context)->ebp = (void *) 0; \
(_the_context)->esp = (void *) _stack; \
} while (0)
The stack pointer is part of the context. If you retrieve the PC from
here it should work for all threads.
--
Sebastian Huber, embedded brains GmbH
Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone : +49 89 189 47 41-16
Fax : +49 89 189 47 41-09
E-Mail : sebastian.huber at embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
More information about the devel
mailing list