1/* $NetBSD: srt0.S,v 1.4 2011/01/19 09:03:15 he Exp $ */ 2 3/*- 4 * Copyright (c) 2002 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Steve C. Woodford. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 * POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32#include <machine/asm.h> 33#include <machine/psl.h> 34#include <powerpc/spr.h> 35#include <powerpc/oea/spr.h> 36 37#define STACK_SIZE 8192 38 39/* 40 * The main entry point when loaded by PPC-Bug. 41 * 42 * There are two possible entry conditions here: 43 * 44 * 1) We were booted in `PReP' mode, either from disk or the network. 45 * In this case, we have no control over the load address so we 46 * have to relocate ourselves to the appropriate place. 47 * The firmware passes us the following registers: 48 * 49 * %r1 -> Temporary stack 50 * %r3 -> Residual Data 51 * %r4 -> The address we were loaded to 52 * %r5 -> Zero 53 * 54 * 2) We were booted over the network in Non-PReP mode. In this case, 55 * the load address is usually set using PPC-Bug's "niot" command, 56 * but we won't depend on it so relocation may be required. The 57 * firmware passes us the following registers: 58 * 59 * %r1 -> Temporary stack 60 * %r3 -> CLUN of the network device we booted from 61 * %r4 -> DLUN of the network device we booted from 62 * %r5 -> Non-zero 63 * %r6 -> Base address of network device 64 * %r7 -> Execution address of loaded program 65 * %r8 -> Address of IP-address data structure 66 * %r9 -> Pointer to start of filename string 67 * %r10 -> Pointer to end+1 of filename string 68 * %r11 -> Pointer to start of argument string 69 * %r12 -> Pointer to end+1 of argument string 70 * 71 * The obvious way to distinguish between the two boot modes is by 72 * checking the value of %r5. 73 */ 74ENTRY(_start) 75 bl 1f 761: xor %r0,%r0,%r0 77 78 /* First, switch off Instruction and Data caches. */ 79 mfspr %r13,SPR_HID0 80 LDCONST(%r14, HID0_DCE|HID0_ICE) 81 andc %r13,%r13,%r14 82 sync 83 mtspr SPR_HID0,%r13 84 85 86 /* 87 * All registers now available. Let's see if we need to relocate 88 */ 89 LDCONST(%r13,_C_LABEL(_start)) /* Where we'd like to be */ 90 LDCONST(%r14,_C_LABEL(edata)) /* End of data section */ 91 LDCONST(%r15,0x3) 92 add %r14,%r14,%r15 93 andc %r14,%r14,%r15 /* Rounded up to the nearest 32-bits */ 94 sub %r15,%r14,%r13 /* Our size, in bytes */ 95 mflr %r16 /* Get address we were loaded to */ 96 subi %r16,%r16,0x4 /* Correct for branch */ 97 cmpw %r13,%r16 /* Do we need to relocate? */ 98 beq _ASM_LABEL(clrbss) /* No relocation necessary */ 99 li %r17,0x4 100 bgt 1f /* Relocate using forward copy? */ 101 102 /* Nope. Need to copy in reverse in case of overlap */ 103 mr %r13,%r14 /* dest -> end */ 104 add %r16,%r16,%r15 /* src + size */ 105 subi %r17,%r17,0x8 /* Increment is -4 */ 106 107 /* 108 * Do the relocation 109 * %r13 -> dest 110 * %r15 -> number of bytes 111 * %r16 -> src 112 * %r17 -> Increment (+4 or -4) 113 */ 1141: srwi %r15,%r15,0x2 /* Convert length to 32-bit words */ 115 mtctr %r15 /* Save in counter register */ 116 1172: lwz %r15,0(%r16) 118 stw %r15,0(%r13) 119 add %r16,%r16,%r17 120 add %r13,%r13,%r17 121 bdnz 2b 122 123 /* Now do an absolute jump to the relocated code */ 124 LDCONST(%r13,_ASM_LABEL(clrbss)) 125 mtlr %r13 126 blr 127 128ASENTRY(clrbss) 129 LDCONST(%r13,_C_LABEL(edata)) /* End of the data section */ 130 LDCONST(%r14,_C_LABEL(end)) /* End of BSS */ 131 LDCONST(%r15,0x3) 132 add %r14,%r14,%r15 133 andc %r14,%r14,%r15 /* Round-up end of BSS to 32-bits */ 134 sub %r15,%r14,%r13 /* r15 == length of BSS */ 135 srwi %r15,%r15,0x2 136 mtctr %r15 /* CTR == # of 32-bit words in BSS */ 1371: stw %r0,0(%r13) /* Clear BSS */ 138 addi %r13,%r13,4 139 bdnz 1b 140 141 /* Fix up our own stack */ 142 LDCONST(%r1,stack) 143 addi %r1,%r1,STACK_SIZE-0x10 144 LDCONST(%r13,0x0f) 145 andc %r1,%r1,%r13 146 147 /* 148 * Copy the arguments passed in from Bug into bug_bootinfo 149 * 150 * See bugsyscalls.h for details. 151 */ 152 LDCONST(%r13,_C_LABEL(bug_bootinfo)) 153 stw %r5,0x00(%r13) 154 stw %r3,0x04(%r13) 155 stw %r4,0x08(%r13) 156 stw %r6,0x0c(%r13) 157 stw %r7,0x10(%r13) 158 stw %r8,0x14(%r13) 159 stw %r9,0x18(%r13) 160 stw %r10,0x1c(%r13) 161 stw %r11,0x20(%r13) 162 stw %r12,0x24(%r13) 163 164 mr %r3,%r13 165 bl _C_LABEL(main) /* void main(void) */ 166 /* FALLTHROUGH */ 167 168/* 169 * Return to the debugger, either because main() returned or via panic(). 170 */ 171ENTRY(_rtt) 172 addi %r10,0,0x0063 173 sc 1741: nop 175 b 1b 176 177 /* 178 * C code runs on this stack. 179 */ 180 .comm stack,STACK_SIZE,4 181 .comm errno,4,4 182 .comm debug,4,4 183