11.3Schristos/* $NetBSD: srt0.s,v 1.3 2005/12/11 12:18:48 christos Exp $ */ 21.1Snonaka 31.1Snonaka/* 41.1Snonaka * Copyright (C) 1996-1999 Cort Dougan (cort@fsmlasb.com). 51.1Snonaka * Copyright (C) 1996-1999 Gary Thomas (gdt@osf.org). 61.1Snonaka * Copyright (C) 1996-1999 Paul Mackeras (paulus@linuxcare.com). 71.1Snonaka * All rights reserved. 81.1Snonaka * 91.1Snonaka * Redistribution and use in source and binary forms, with or without 101.1Snonaka * modification, are permitted provided that the following conditions 111.1Snonaka * are met: 121.1Snonaka * 1. Redistributions of source code must retain the above copyright 131.1Snonaka * notice, this list of conditions and the following disclaimer. 141.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright 151.1Snonaka * notice, this list of conditions and the following disclaimer in the 161.1Snonaka * documentation and/or other materials provided with the distribution. 171.1Snonaka * 3. All advertising materials mentioning features or use of this software 181.1Snonaka * must display the following acknowledgement: 191.1Snonaka * This product includes software developed by TooLs GmbH. 201.1Snonaka * 4. The name of TooLs GmbH may not be used to endorse or promote products 211.1Snonaka * derived from this software without specific prior written permission. 221.1Snonaka * 231.1Snonaka * THIS SOFTWARE IS PROVIDED BY TOOLS GMBH ``AS IS'' AND ANY EXPRESS OR 241.1Snonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 251.1Snonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 261.1Snonaka * IN NO EVENT SHALL TOOLS GMBH BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 271.1Snonaka * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 281.1Snonaka * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 291.1Snonaka * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 301.1Snonaka * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 311.1Snonaka * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 321.1Snonaka * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 331.1Snonaka */ 341.1Snonaka 351.1Snonaka#define MSR_IP (1<<6) 361.1Snonaka 371.1Snonaka#define HID0_DCI (1<<10) 381.1Snonaka#define HID0_ICFI (1<<11) 391.1Snonaka#define HID0_DCE (1<<14) 401.1Snonaka#define HID0_ICE (1<<15) 411.1Snonaka 421.1Snonaka .text 431.1Snonaka 441.1Snonaka .globl _start 451.1Snonaka_start: 461.1Snonaka bl start 471.1Snonakastart: 481.1Snonaka mr 11,3 /* Save pointer to residual/board data */ 491.1Snonaka li 3,MSR_IP /* Establish default MSR value */ 501.1Snonaka mtmsr 3 511.1Snonaka isync 521.1Snonaka 531.1Snonaka mflr 7 541.1Snonaka bl flush_icache 551.1Snonaka mfspr 3,1008 561.1Snonaka lis 4,~(HID0_ICE|HID0_DCE)@h 571.1Snonaka ori 4,4,~(HID0_ICE|HID0_DCE)@l 581.1Snonaka andc 3,3,4 591.1Snonaka mtspr 1008,3 601.1Snonaka mtlr 7 611.1Snonaka 621.1Snonaka/* 631.1Snonaka * check if we need to relocate ourselves to the link addr or were we 641.1Snonaka * loaded there to begin with -- Cort 651.1Snonaka */ 661.1Snonaka lis 4,_start@h 671.1Snonaka ori 4,4,_start@l 681.1Snonaka mflr 3 691.1Snonaka subi 3,3,4 /* we get the nip, not the ip of the branch */ 701.1Snonaka mr 8,3 711.2Snonaka cmpw 3,4 721.2Snonaka bne relocate 731.1Snonaka b start_ldr 741.2Snonaka 751.1Snonaka/* 761.1Snonaka * no matter where we're loaded, move ourselves to -Ttext address 771.1Snonaka */ 781.1Snonakarelocate: 791.1Snonaka lis 4,_start@h 801.1Snonaka ori 4,4,_start@l 811.1Snonaka lis 5,end@h 821.1Snonaka ori 5,5,end@l 831.1Snonaka addi 5,5,3 /* Round up - just in case */ 841.1Snonaka sub 5,5,4 /* Compute # longwords to move */ 851.1Snonaka srwi 5,5,2 861.1Snonaka mtctr 5 871.1Snonaka subi 3,3,4 /* Set up for loop */ 881.1Snonaka subi 4,4,4 891.1Snonaka2: 901.1Snonaka lwzu 5,4(3) 911.1Snonaka stwu 5,4(4) 921.1Snonaka bdnz 2b 931.1Snonaka lis 3,start_ldr@h 941.1Snonaka ori 3,3,start_ldr@l 951.1Snonaka mtlr 3 /* Easiest way to do an absolute jump */ 961.1Snonaka blr 971.1Snonakastart_ldr: 981.1Snonaka mr 9,1 /* Save old stack pointer */ 991.1Snonaka lis 1,.stack@h 1001.1Snonaka ori 1,1,.stack@l 1011.1Snonaka addi 1,1,4096 1021.1Snonaka li 2,0x000F 1031.1Snonaka andc 1,1,2 1041.1Snonaka mr 3,11 /* arg1: residual/board data */ 1051.1Snonaka mr 4,8 /* arg2: loadaddr */ 1061.1Snonaka bl boot 1071.1Snonakahang: 1081.1Snonaka b hang 1091.1Snonaka 1101.1Snonaka/* 1111.1Snonaka * Execute 1121.1Snonaka * run(startsym, endsym, args, bootinfo, entry) 1131.1Snonaka */ 1141.1Snonaka .globl run 1151.1Snonakarun: 1161.1Snonaka mtctr 7 /* Entry point */ 1171.1Snonaka bctr 1181.1Snonaka 1191.1Snonaka/* 1201.1Snonaka * Flush instruction cache 1211.1Snonaka */ 1221.1Snonaka .globl flush_icache 1231.1Snonakaflush_icache: 1241.1Snonaka mflr 5 1251.1Snonaka bl flush_dcache 1261.1Snonaka mfspr 4,1008 1271.1Snonaka li 4,0 1281.1Snonaka ori 4,4,HID0_ICE|HID0_ICFI 1291.1Snonaka or 3,3,4 1301.1Snonaka mtspr 1008,3 1311.1Snonaka andc 3,3,4 1321.1Snonaka ori 3,3,HID0_ICE 1331.1Snonaka mtspr 1008,3 1341.1Snonaka mtlr 5 1351.1Snonaka blr 1361.1Snonaka 1371.1Snonaka/* 1381.1Snonaka * Flush data cache 1391.1Snonaka */ 1401.1Snonaka .globl flush_dcache 1411.1Snonakaflush_dcache: 1421.1Snonaka lis 3,0x1000@h 1431.1Snonaka ori 3,3,0x1000@l 1441.1Snonaka li 4,1024 1451.1Snonaka mtctr 4 1461.1Snonaka1: 1471.1Snonaka lwz 4,0(3) 1481.1Snonaka addi 3,3,32 1491.1Snonaka bdnz 1b 1501.1Snonaka blr 1511.1Snonaka 1521.1Snonaka/* 1531.1Snonaka * local stack 1541.1Snonaka */ 1551.1Snonaka .comm .stack,8192,4 156