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.hu...@embedded-brains.de
PGP : Public key available on request.
Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel