/* $NetBSD: srt0_pwr.s,v 1.1 2007/12/17 19:09:54 garbled Exp $ */
/*
* Copyright (C) 1996-1999 Cort Dougan (cort@fsmlasb.com).
* Copyright (C) 1996-1999 Gary Thomas (gdt@osf.org).
* Copyright (C) 1996-1999 Paul Mackeras (paulus@linuxcare.com).
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by TooLs GmbH.
* 4. The name of TooLs GmbH may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define MSR_DR (1<<4)
#define MSR_IP (1<<6)
#define MSR_AL (1<<7)
#define MSR_ME (1<<12)
#define HID0_DCI (1<<10)
#define HID0_ICFI (1<<11)
#define HID0_DCE (1<<14)
#define HID0_ICE (1<<15)
/* when we start, the IPLCB pointer is in r3, and the extended one is in r4 */
.machine "com"
.text
.globl _start
_start:
bl start
start:
li 2,MSR_ME|MSR_AL /* Establish default MSR value */
mtmsr 2
isync
#if 0
/*
mflr 7
bl flush_icache
mfspr 3,1008
lis 4,~(HID0_ICE|HID0_DCE)@h
ori 4,4,~(HID0_ICE|HID0_DCE)@l
andc 3,3,4
mtspr 1008,3
mtlr 7
*/
/*
* check if we need to relocate ourselves to the link addr or were we
* loaded there to begin with -- Cort
*/
lis 4,_start@h
ori 4,4,_start@l
mflr 3
subi 3,3,4 /* we get the nip, not the ip of the branch */
mr 8,3
cmpw 3,4
bne relocate
b start_ldr
/*
* no matter where we're loaded, move ourselves to -Ttext address
*/
relocate:
lis 4,_start@h
ori 4,4,_start@l
lis 5,end@h
ori 5,5,end@l
addi 5,5,3 /* Round up - just in case */
sub 5,5,4 /* Compute # longwords to move */
srwi 5,5,2
mtctr 5
subi 3,3,4 /* Set up for loop */
subi 4,4,4
2:
lwzu 5,4(3)
stwu 5,4(4)
bdnz 2b
lis 3,start_ldr@h
ori 3,3,start_ldr@l
mtlr 3 /* Easiest way to do an absolute jump */
blr
#endif /* no good */
start_ldr:
mr 9,1 /* Save old stack pointer */
lis 1,.stack@h
ori 1,1,.stack@l
addi 1,1,4096
li 2,0x000F
andc 1,1,2
#if 0
mr 3,11 /* arg1: residual/board data */
mr 4,8 /* arg2: loadaddr */
#endif
bl boot
hang:
b hang
/*
* Execute
* run(startsym, endsym, args, bootinfo, entry)
*/
.globl run
run:
mtctr 7 /* Entry point */
bctr
/*
* Flush instruction cache
*/
.globl flush_icache
flush_icache:
mflr 5
bl flush_dcache
mfspr 4,1008
li 4,0
ori 4,4,HID0_ICE|HID0_ICFI
or 3,3,4
mtspr 1008,3
andc 3,3,4
ori 3,3,HID0_ICE
mtspr 1008,3
mtlr 5
blr
/*
* Flush data cache
*/
.globl flush_dcache
flush_dcache:
lis 3,0x1000@h
ori 3,3,0x1000@l
li 4,1024
mtctr 4
1:
lwz 4,0(3)
addi 3,3,32
bdnz 1b
blr
#if 0
/*
* write LEDS
*/
.globl led
led:
mfmsr 5 /* save MSR to r5 */
lis 7,0xffff
ori 7,7,~(MSR_DR)
and 6,5,7
mtmsr 6
isync
#endif
/*
* local stack
*/
.comm .stack,8192,4