summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors_init.c
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors_init.c')
-rw-r--r--c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors_init.c28
1 files changed, 24 insertions, 4 deletions
diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors_init.c b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors_init.c
index 83479775fa..c302db298d 100644
--- a/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors_init.c
+++ b/c/src/lib/libcpu/powerpc/new-exceptions/bspsupport/vectors_init.c
@@ -350,14 +350,34 @@ void ppc_exc_initialize(
uint32_t interrupt_stack_end = 0;
uint32_t interrupt_stack_pointer = 0;
uint32_t *p = NULL;
+ uint32_t r13, sda_base;
- /* Ensure proper interrupt stack alignment */
- interrupt_stack_start &= ~(CPU_STACK_ALIGNMENT - 1);
- interrupt_stack_size &= ~(CPU_STACK_ALIGNMENT - 1);
+ /* Assembly code needs SDA_BASE in r13 (SVR4 or EABI). Make sure
+ * early init code put it there.
+ */
+ asm volatile(
+ " lis %0, _SDA_BASE_@h \n"
+ " ori %0, %0, _SDA_BASE_@l \n"
+ " mr %1, 13 \n"
+ :"=r"(sda_base),"=r"(r13)
+ );
+
+ if ( sda_base != r13 ) {
+ printk("ppc_exc_initialize(): INTERNAL ERROR\n");
+ printk(" your BSP seems to not have loaded _SDA_BASE_\n");
+ printk(" into R13 as required by SVR4/EABI. Check early init code...\n");
+ printk(" _SDA_BASE_: 0x%08x, R13: 0x%08x\n", sda_base, r13);
+ while (1)
+ ;
+ }
/* Interrupt stack end and pointer */
interrupt_stack_end = interrupt_stack_start + interrupt_stack_size;
- interrupt_stack_pointer = interrupt_stack_end - PPC_MINIMUM_STACK_FRAME_SIZE;
+
+ interrupt_stack_pointer = interrupt_stack_end - PPC_MINIMUM_STACK_FRAME_SIZE;
+
+ /* Ensure proper interrupt stack alignment */
+ interrupt_stack_pointer &= ~(CPU_STACK_ALIGNMENT - 1);
/* Tag interrupt stack bottom */
p = (uint32_t *) interrupt_stack_pointer;