bsps/powerpc: ppc_exc_initialize_interrupt_stack()

This commit is contained in:
Sebastian Huber
2014-12-23 09:53:43 +01:00
parent 7bad67256e
commit 71b611d172
2 changed files with 20 additions and 11 deletions

View File

@@ -156,8 +156,6 @@ void ppc_exc_initialize_with_vector_base(
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
const ppc_exc_categories *const categories = ppc_exc_current_categories();
uintptr_t const interrupt_stack_end = interrupt_stack_begin + interrupt_stack_size;
uintptr_t interrupt_stack_pointer = interrupt_stack_end - PPC_MINIMUM_STACK_FRAME_SIZE;
unsigned vector = 0;
uint32_t sda_base = 0;
uint32_t r13 = 0;
@@ -180,15 +178,7 @@ void ppc_exc_initialize_with_vector_base(
ppc_exc_fatal_error();
}
/* Ensure proper interrupt stack alignment */
interrupt_stack_pointer &= ~((uintptr_t) CPU_STACK_ALIGNMENT - 1);
/* Tag interrupt stack bottom */
*(uint32_t *) interrupt_stack_pointer = 0;
/* Move interrupt stack values to special purpose registers */
PPC_SET_SPECIAL_PURPOSE_REGISTER(SPRG1, interrupt_stack_pointer);
PPC_SET_SPECIAL_PURPOSE_REGISTER(SPRG2, interrupt_stack_begin);
ppc_exc_initialize_interrupt_stack(interrupt_stack_begin, interrupt_stack_size);
#ifndef PPC_EXC_CONFIG_BOOKE_ONLY

View File

@@ -355,6 +355,25 @@ rtems_status_code ppc_exc_make_prologue(
size_t *prologue_size
);
static inline void ppc_exc_initialize_interrupt_stack(
uintptr_t stack_begin,
uintptr_t stack_size
)
{
uintptr_t stack_end = stack_begin + stack_size;
uintptr_t stack_pointer = stack_end - PPC_MINIMUM_STACK_FRAME_SIZE;
/* Ensure proper interrupt stack alignment */
stack_pointer &= ~((uintptr_t) CPU_STACK_ALIGNMENT - 1);
/* Tag interrupt stack bottom */
*(uint32_t *) stack_pointer = 0;
/* Move interrupt stack values to special purpose registers */
PPC_SET_SPECIAL_PURPOSE_REGISTER(SPRG1, stack_pointer);
PPC_SET_SPECIAL_PURPOSE_REGISTER(SPRG2, stack_begin);
}
/**
* @brief Initializes the exception handling.
*