summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/powerpc/mvme5500/start/start.S
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/powerpc/mvme5500/start/start.S')
-rw-r--r--c/src/lib/libbsp/powerpc/mvme5500/start/start.S50
1 files changed, 39 insertions, 11 deletions
diff --git a/c/src/lib/libbsp/powerpc/mvme5500/start/start.S b/c/src/lib/libbsp/powerpc/mvme5500/start/start.S
index 720811c364..2d79e0699d 100644
--- a/c/src/lib/libbsp/powerpc/mvme5500/start/start.S
+++ b/c/src/lib/libbsp/powerpc/mvme5500/start/start.S
@@ -4,20 +4,27 @@
* Copyright (C) 1999 Eric Valette. valette@crf.canon.fr
*
* S. Kate Feng <feng1@bnl.gov>, April 2004
- * Mapped the 2nd 256MB of RAM to support the MVME5500 boards.
- *
+ * Mapped the 2nd 256MB of RAM to support the MVME5500/MVME6100 boards
+ *
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.com/license/LICENSE.
*
+<<<<<<< start.S
+ * $Id$
+=======
+ * $Id$
+>>>>>>> 1.25
*
*/
#include <rtems/asm.h>
#include <rtems/score/cpu.h>
#include <rtems/powerpc/powerpc.h>
+
#include <libcpu/io.h>
#include <libcpu/bat.h>
+#include <bspopts.h>
#define SYNC \
sync; \
@@ -33,7 +40,6 @@
li r10,0x63 ; \
sc
-
.text
.globl __rtems_entry_point
.type __rtems_entry_point,@function
@@ -62,6 +68,21 @@ __rtems_entry_point:
mr r29,r5
mr r28,r6
mr r27,r7
+
+#ifdef __ALTIVEC__
+ /* enable altivec; gcc may use it! */
+ mfmsr r0
+ oris r0, r0, (1<<(31-16-6))
+ mtmsr r0
+ /*
+ * set vscr and vrsave to known values
+ */
+ li r0, 0
+ mtvrsave r0
+ vxor 0,0,0
+ mtvscr 0
+#endif
+
/*
* Make sure we have nothing in BATS and TLB
*/
@@ -72,7 +93,8 @@ __rtems_entry_point:
* of RAM to KERNELBASE.
*/
lis r11,KERNELBASE@h
- ori r11,r11,0x1ffe /* set up BAT0 registers for 604+ */
+/* set up BAT registers for 604 */
+ ori r11,r11,0x1ffe
li r8,2 /* R/W access */
isync
mtspr DBAT0L,r8 /* N.B. 6xx (not 601) have valid */
@@ -81,8 +103,8 @@ __rtems_entry_point:
mtspr IBAT0U,r11
isync
/*
- * Use the 2nd pair of BAT registers to map the 2nd 256MB
- * of RAM to 0x10000000. <SKF>
+ * <skf> Use the 2nd pair of BAT registers to map the 2nd 256MB
+ * of RAM to 0x10000000.
*/
lis r11,MEM256MB@h
ori r11,r11,0x1ffe /* set up BAT1 registers for 604+ */
@@ -106,7 +128,7 @@ __rtems_entry_point:
enter_C_code:
bl MMUon
- bl __eabi /* setup EABI and SYSV environment */
+ bl __eabi /* setup EABI and SYSV environment */
bl zero_bss
/*
* restore prep boot params
@@ -121,10 +143,17 @@ enter_C_code:
* stack = &__rtems_end + 4096
*/
addis r9,r0, __stack-PPC_MINIMUM_STACK_FRAME_SIZE@ha
- addi r9,r9, __stack-PPC_MINIMUM_STACK_FRAME_SIZE@l
- mr r1, r9
+ addi r9,r9, __stack-PPC_MINIMUM_STACK_FRAME_SIZE@l
/*
- * We are know in a environment that is totally independent from bootloader setup.
+ * align initial stack
+ * (we hope that the bootloader stack was 16-byte aligned
+ * or we haven't used altivec yet...)
+ */
+ li r0, (CPU_STACK_ALIGNMENT-1)
+ andc r1, r9, r0
+ /*
+ * We are now in a environment that is totally independent from
+ * bootloader setup.
*/
/* pass result of 'save_boot_params' to 'boot_card' in R3 */
bl boot_card
@@ -161,7 +190,6 @@ MMUoff:
.globl _return_to_ppcbug
.type _return_to_ppcbug,@function
-
_return_to_ppcbug:
mflr r30
bl MMUoff