powerpc: Add r2 to CPU context

The r2 may be used for thread-local storage.
This commit is contained in:
Sebastian Huber
2013-06-24 15:21:46 +02:00
parent 8dc2e7bd7e
commit 39a4574652
5 changed files with 20 additions and 12 deletions

View File

@@ -68,6 +68,7 @@ void _CPU_Context_Initialize(
ppc_context *the_ppc_context;
uint32_t msr_value;
uint32_t sp;
register uint32_t gpr2 __asm__("2");
sp = (uint32_t)stack_base + size - PPC_MINIMUM_STACK_FRAME_SIZE;
@@ -127,6 +128,7 @@ void _CPU_Context_Initialize(
the_ppc_context->gpr1 = sp;
the_ppc_context->msr = msr_value;
the_ppc_context->lr = (uint32_t) entry_point;
the_ppc_context->gpr2 = gpr2;
#ifdef __ALTIVEC__
_CPU_Context_initialize_altivec( the_ppc_context );

View File

@@ -23,7 +23,7 @@
* COPYRIGHT (c) 1989-1997.
* On-Line Applications Research Corporation (OAR).
*
* Copyright (c) 2011-2012 embedded brains GmbH.
* Copyright (c) 2011-2013 embedded brains GmbH.
*
* The license and distribution terms for this file may in
* the file LICENSE in this distribution or at
@@ -323,6 +323,8 @@ PROC (_CPU_Context_switch):
PPC_GPR_STORE r30, PPC_CONTEXT_OFFSET_GPR30(r3)
PPC_GPR_STORE r31, PPC_CONTEXT_OFFSET_GPR31(r3)
stw r2, PPC_CONTEXT_OFFSET_GPR2(r3)
/* Restore context from r4 */
restore_context:
@@ -363,6 +365,8 @@ restore_context:
PPC_GPR_LOAD r30, PPC_CONTEXT_OFFSET_GPR30(r4)
PPC_GPR_LOAD r31, PPC_CONTEXT_OFFSET_GPR31(r4)
lwz r2, PPC_CONTEXT_OFFSET_GPR2(r4)
mtcr r7
mtlr r6
mtmsr r5

View File

@@ -51,6 +51,7 @@ PPC_ASSERT_OFFSET(gpr28, GPR28);
PPC_ASSERT_OFFSET(gpr29, GPR29);
PPC_ASSERT_OFFSET(gpr30, GPR30);
PPC_ASSERT_OFFSET(gpr31, GPR31);
PPC_ASSERT_OFFSET(gpr2, GPR2);
RTEMS_STATIC_ASSERT(
sizeof(Context_Control) % PPC_DEFAULT_CACHE_LINE_SIZE == 0,

View File

@@ -110,7 +110,9 @@ _CPU_Context_validate:
addi r25, r3, 20
addi r26, r3, 21
addi r27, r3, 22
addi r28, r3, 23
/* GPR28 contains the GPR2 pattern */
xor r28, r2, r3
/* GPR29 and CR are equal most of the time */
addi r29, r3, 24
@@ -197,7 +199,7 @@ check:
addi r4, r3, 22
cmpw r4, r27
bne restore
addi r4, r3, 23
xor r4, r2, r3
cmpw r4, r28
bne restore
addi r4, r3, 24
@@ -224,13 +226,6 @@ check:
bne restore
cmpw r31, r1
bne restore
#if 0
/* This is only valid if we use the EABI */
lis r4, _SDA2_BASE_@h
ori r4, r4, _SDA2_BASE_@l
cmpw r4, r2
bne restore
#endif
mtcr r29
addi r5, r3, 1
b check

View File

@@ -25,7 +25,7 @@
*
* Copyright (c) 2001 Surrey Satellite Technology Limited (SSTL).
*
* Copyright (c) 2010-2012 embedded brains GmbH.
* Copyright (c) 2010-2013 embedded brains GmbH.
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
@@ -273,7 +273,11 @@ typedef struct {
/* There is no CPU specific per-CPU state */
} CPU_Per_CPU_control;
/* Non-volatile context according to E500ABIUG and EABI */
/*
* Non-volatile context according to E500ABIUG, EABI and 32-bit TLS (according
* to "Power Architecture 32-bit Application Binary Interface Supplement 1.0 -
* Linux and Embedded")
*/
typedef struct {
uint32_t gpr1;
uint32_t msr;
@@ -297,6 +301,7 @@ typedef struct {
PPC_GPR_TYPE gpr29;
PPC_GPR_TYPE gpr30;
PPC_GPR_TYPE gpr31;
uint32_t gpr2;
#ifdef __ALTIVEC__
/*
* 12 non-volatile vector registers, cache-aligned area for vscr/vrsave
@@ -361,6 +366,7 @@ static inline ppc_context *ppc_get_context( Context_Control *context )
#define PPC_CONTEXT_OFFSET_GPR29 PPC_CONTEXT_GPR_OFFSET( 29 )
#define PPC_CONTEXT_OFFSET_GPR30 PPC_CONTEXT_GPR_OFFSET( 30 )
#define PPC_CONTEXT_OFFSET_GPR31 PPC_CONTEXT_GPR_OFFSET( 31 )
#define PPC_CONTEXT_OFFSET_GPR2 PPC_CONTEXT_GPR_OFFSET( 32 )
#ifndef ASM
typedef struct {