forked from Imagelibrary/rtems
bsps: Move start files to bsps
This patch is a part of the BSP source reorganization. Update #3285.
This commit is contained in:
207
bsps/powerpc/shared/start/start.S
Normal file
207
bsps/powerpc/shared/start/start.S
Normal file
@@ -0,0 +1,207 @@
|
||||
/*
|
||||
* start.S : RTEMS entry point
|
||||
*
|
||||
* Copyright (C) 1999 Eric Valette. valette@crf.canon.fr
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*
|
||||
*/
|
||||
|
||||
#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; \
|
||||
isync
|
||||
|
||||
#define KERNELBASE 0x0
|
||||
|
||||
#define MONITOR_ENTER \
|
||||
mfmsr r10 ; \
|
||||
ori r10,r10,MSR_IP ; \
|
||||
mtmsr r10 ; \
|
||||
li r10,0x63 ; \
|
||||
sc
|
||||
|
||||
.text
|
||||
.globl __rtems_entry_point
|
||||
.type __rtems_entry_point,@function
|
||||
__rtems_entry_point:
|
||||
#ifdef DEBUG_EARLY_START
|
||||
MONITOR_ENTER
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PREP
|
||||
* This is jumped to on prep systems right after the kernel is relocated
|
||||
* to its proper place in memory by the boot loader. The expected layout
|
||||
* of the regs is:
|
||||
* r3: ptr to residual data
|
||||
* r4: initrd_start or if no initrd then 0
|
||||
* r5: initrd_end - unused if r4 is 0
|
||||
* r6: Start of command line string
|
||||
* r7: End of command line string
|
||||
*
|
||||
* The Prep boot loader insure that the MMU is currently off...
|
||||
*
|
||||
*/
|
||||
|
||||
mr r31,r3 /* save parameters */
|
||||
mr r30,r4
|
||||
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
|
||||
isync
|
||||
/*
|
||||
* 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
|
||||
*/
|
||||
bl CPU_clear_bats_early
|
||||
bl flush_tlbs
|
||||
/*
|
||||
* Use the first pair of BAT registers to map the 1st 256MB
|
||||
* of RAM to KERNELBASE.
|
||||
*/
|
||||
lis r11,KERNELBASE@h
|
||||
/* 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 */
|
||||
mtspr DBAT0U,r11 /* bit in upper BAT register */
|
||||
mtspr IBAT0L,r8
|
||||
mtspr IBAT0U,r11
|
||||
isync
|
||||
/* Map section where residual is located if outside
|
||||
* the first 256Mb of RAM. This is to support cases
|
||||
* where the available system memory is larger than
|
||||
* 256Mb of RAM.
|
||||
*/
|
||||
mr r9, r1 /* Get where residual was mapped */
|
||||
lis r12,0xf0000000@h
|
||||
and r9,r9,r12
|
||||
cmpi 0,1,r9, 0
|
||||
beq enter_C_code
|
||||
isync
|
||||
ori r11,r9,0x1ffe
|
||||
mtspr DBAT1L,r8 /* N.B. 6xx (not 601) have valid */
|
||||
mtspr DBAT1U,r11 /* bit in upper BAT register */
|
||||
mtspr IBAT1L,r8
|
||||
mtspr IBAT1U,r11
|
||||
isync
|
||||
|
||||
/*
|
||||
* we now have the 1st 256M of ram mapped with the bats. We are still
|
||||
* running on the bootloader stack and cannot switch to an RTEMS allocated
|
||||
* init stack before copying the residual data that may have been set just after
|
||||
* rtems_end address. This bug has been experienced on MVME2304. Thank to
|
||||
* Till Straumann <strauman@SLAC.Stanford.EDU> for hunting it and suggesting
|
||||
* the appropriate code.
|
||||
*/
|
||||
|
||||
enter_C_code:
|
||||
bl MMUon
|
||||
bl __eabi /* setup EABI and SYSV environment */
|
||||
bl zero_bss
|
||||
/*
|
||||
* restore prep boot params
|
||||
*/
|
||||
mr r3,r31
|
||||
mr r4,r30
|
||||
mr r5,r29
|
||||
mr r6,r28
|
||||
mr r7,r27
|
||||
bl save_boot_params
|
||||
/*
|
||||
* stack = &__rtems_end + 4096
|
||||
*/
|
||||
addis r9,r0, __stack-PPC_MINIMUM_STACK_FRAME_SIZE@ha
|
||||
addi r9,r9, __stack-PPC_MINIMUM_STACK_FRAME_SIZE@l
|
||||
/*
|
||||
* 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
|
||||
/*
|
||||
* Tag TOS with a NULL (terminator for stack dump)
|
||||
*/
|
||||
li r0, 0
|
||||
stw r0, 0(r1)
|
||||
|
||||
/*
|
||||
* 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
|
||||
bl _return_to_ppcbug
|
||||
|
||||
.globl MMUon
|
||||
.type MMUon,@function
|
||||
MMUon:
|
||||
mfmsr r0
|
||||
ori r0,r0, MSR_IP | MSR_RI | MSR_IR | MSR_DR | MSR_EE | MSR_FE0 | MSR_FE1 | MSR_FP
|
||||
#if (PPC_HAS_FPU == 0)
|
||||
xori r0, r0, MSR_EE | MSR_IP | MSR_FP
|
||||
#else
|
||||
xori r0, r0, MSR_EE | MSR_IP | MSR_FE0 | MSR_FE1
|
||||
#endif
|
||||
mflr r11
|
||||
mtsrr0 r11
|
||||
mtsrr1 r0
|
||||
SYNC
|
||||
rfi
|
||||
|
||||
.globl MMUoff
|
||||
.type MMUoff,@function
|
||||
MMUoff:
|
||||
mfmsr r0
|
||||
ori r0,r0,MSR_IR| MSR_DR | MSR_IP
|
||||
mflr r11
|
||||
xori r0,r0,MSR_IR|MSR_DR
|
||||
mtsrr0 r11
|
||||
mtsrr1 r0
|
||||
SYNC
|
||||
rfi
|
||||
|
||||
.globl _return_to_ppcbug
|
||||
.type _return_to_ppcbug,@function
|
||||
|
||||
_return_to_ppcbug:
|
||||
mflr r30
|
||||
bl MMUoff
|
||||
MONITOR_ENTER
|
||||
bl MMUon
|
||||
mtctr r30
|
||||
bctr
|
||||
|
||||
flush_tlbs:
|
||||
lis r20, 0x1000
|
||||
1: addic. r20, r20, -0x1000
|
||||
tlbie r20
|
||||
bgt 1b
|
||||
sync
|
||||
blr
|
||||
Reference in New Issue
Block a user