1/* $NetBSD: explora_start.S,v 1.4 2006/06/30 17:54:50 freza Exp $ */ 2 3/*- 4 * Copyright (c) 2003 The NetBSD Foundation, Inc. 5 * All rights reserved. 6 * 7 * This code is derived from software contributed to The NetBSD Foundation 8 * by Juergen Hannken-Illjes. 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 * 3. All advertising materials mentioning features or use of this software 19 * must display the following acknowledgement: 20 * This product includes software developed by the NetBSD 21 * Foundation, Inc. and its contributors. 22 * 4. Neither the name of The NetBSD Foundation nor the names of its 23 * contributors may be used to endorse or promote products derived 24 * from this software without specific prior written permission. 25 * 26 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 27 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 28 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 29 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 30 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 36 * POSSIBILITY OF SUCH DAMAGE. 37 */ 38 39/* 40 * Initial state: 41 * 42 * iccr = 0x00008001 0x80000000-0x87ffffff 0xf80000000-0xffffffff 43 * dccr = 0x00008001 0x80000000-0x87ffffff 0xf80000000-0xffffffff 44 * dcwr = 0x00000000 45 * msr = 0x00001000 ME=machine check enable 46 * 47 */ 48 49#include "assym.h" 50 51#define _NOREGNAMES 52 53#include <machine/param.h> 54#include <machine/psl.h> 55#include <machine/trap.h> 56#include <machine/asm.h> 57 58#include <powerpc/spr.h> 59#include <powerpc/ibm4xx/dcr403cgx.h> 60#include <powerpc/ibm4xx/pmap.h> 61 62#include "opt_ddb.h" 63#include "opt_ppcparam.h" 64 65GLOBAL(proc0paddr) 66 .long 0 /* proc0 p_addr */ 67 68/* 69 * Initially the dram starts at 0x01000000. This is way too high. 70 * We relocate dram to 0x00000000. We use the video ram at 0xf0000000 71 * as a temporary staging area. 72 */ 73 74#define STAGE1_BASE 0xf0000000 75 76 .text 77 .globl __start 78__start: 79 b 1f 80 nop 81 nop 82 .long 0 83 .ascii "XncdPPC\0" 84 .long 0 85 .long 0 86 871: 88 /* Disable exceptions, caches, invalidate all TLB's. */ 89 90 li 0,0 91 mtmsr 0 92 mttcr 0 93 mtdccr 0 94 mticcr 0 95 sync 96 isync 97 98/* Clear caches and invalidate tlbs */ 99 li 7,256 100 mtctr 7 101 li 6,0 1021: 103 dccci 0,6 104 addi 6,6,16 105 bdnz 1b 106 107 li 7,512 108 mtctr 7 109 li 6,0 1101: 111 iccci 0,6 112 addi 6,6,16 113 bdnz 1b 114 115 tlbia 116 sync 117 isync 118 119/* Get current address -- NOT the same as . */ 120 121 bl _next 122_next: 123 mflr 3 124 subi 3,3,_next-__start 125 lis 4,STAGE1_BASE@h 126 ori 4,4,STAGE1_BASE@l 127 li 5,stage1size 128 1291: 130 lbz 1,0(3) 131 mr 0,5 132 cmpwi 0,0 133 stb 1,0(4) 134 addi 3,3,1 135 addi 4,4,1 136 addi 5,5,-1 137 bgt 1b 138 139/* Jump into the staging area so we can remap the dram. */ 140 141 lis 0,stage1reloc@h 142 ori 0,0,stage1reloc@l 143 mtlr 0 144 blr 145 146stage1reloc = .-__start+STAGE1_BASE 147 148/* Remap the dram from 0x01000000 to 0x00000000. */ 149 150#define REMAP(r, tmp1, tmp2) \ 151 mfbr##r tmp1 ; \ 152 lis tmp2,0xff ; \ 153 ori tmp2,tmp2,0xffff ; \ 154 cmplw tmp1,tmp2 ; \ 155 ble 1f ; \ 156 addis tmp1,tmp1,0xf000 ; \ 157 mtbr##r tmp1 ; \ 1581: 159 160 REMAP(4, 1, 2) 161 REMAP(5, 1, 2) 162 REMAP(6, 1, 2) 163 REMAP(7, 1, 2) 164 165#undef REMAP 166 167/* Initial setup. */ 168 169 ba stage2 170 171stage2: 172 173#ifdef PPC_4XX_NOCACHE 174 li 0,0 175#else 176 lis 0,0xfffc 177#endif 178 mtdccr 0 179 mticcr 0 180 sync 181 isync 182 183/* get start of bss */ 184 lis 7,_C_LABEL(edata)-4@h 185 ori 7,7,_C_LABEL(edata)-4@l 186/* get end of kernel */ 187 lis 4,_C_LABEL(end)@h 188 ori 4,4,_C_LABEL(end)@l 189/* clear bss */ 190 li 3,0 1911: 192 stwu 3,4(7) 193 cmpw 7,4 194 bne+ 1b 195 196 INIT_CPUINFO(4,1,9,0) 197 198 lis 3,__start@h 199 ori 3,3,__start@l 200 201/* Run the remaining setup in C. */ 202 bl _C_LABEL(bootstrap) 203 204 bl _C_LABEL(main) 205 206 /* NOTREACHED */ 2072: nop 208 b 2b 209 210stage1size = .-__start 211 212#include <powerpc/ibm4xx/4xx_locore.S> 213