srt0.s revision 1.1
11.1Snonaka/* $NetBSD: srt0.s,v 1.1 2000/02/29 15:21:51 nonaka 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.1Snonaka cmp 0,3,4 721.1Snonaka bne 1f 731.1Snonaka b start_ldr 741.1Snonaka1: 751.1Snonaka/* 761.1Snonaka * no matter where we're loaded, move ourselves to -Ttext address 771.1Snonaka */ 781.1Snonakarelocate: 791.1Snonaka mflr 3 /* Compute code bias */ 801.1Snonaka subi 3,3,4 811.1Snonaka mr 8,3 821.1Snonaka lis 4,_start@h 831.1Snonaka ori 4,4,_start@l 841.1Snonaka lis 5,end@h 851.1Snonaka ori 5,5,end@l 861.1Snonaka addi 5,5,3 /* Round up - just in case */ 871.1Snonaka sub 5,5,4 /* Compute # longwords to move */ 881.1Snonaka srwi 5,5,2 891.1Snonaka mtctr 5 901.1Snonaka subi 3,3,4 /* Set up for loop */ 911.1Snonaka subi 4,4,4 921.1Snonaka2: 931.1Snonaka lwzu 5,4(3) 941.1Snonaka stwu 5,4(4) 951.1Snonaka bdnz 2b 961.1Snonaka lis 3,start_ldr@h 971.1Snonaka ori 3,3,start_ldr@l 981.1Snonaka mtlr 3 /* Easiest way to do an absolute jump */ 991.1Snonaka blr 1001.1Snonakastart_ldr: 1011.1Snonaka/* Clear all of BSS */ 1021.1Snonaka lis 3,edata@h 1031.1Snonaka ori 3,3,edata@l 1041.1Snonaka lis 4,end@h 1051.1Snonaka ori 4,4,end@l 1061.1Snonaka subi 3,3,4 1071.1Snonaka subi 4,4,4 1081.1Snonaka li 0,0 1091.1Snonaka3: 1101.1Snonaka stwu 0,4(3) 1111.1Snonaka cmp 0,3,4 1121.1Snonaka bne 3b 1131.1Snonaka mr 9,1 /* Save old stack pointer */ 1141.1Snonaka lis 1,.stack@h 1151.1Snonaka ori 1,1,.stack@l 1161.1Snonaka addi 1,1,4096 1171.1Snonaka li 2,0x000F 1181.1Snonaka andc 1,1,2 1191.1Snonaka mr 3,11 /* arg1: residual/board data */ 1201.1Snonaka mr 4,8 /* arg2: loadaddr */ 1211.1Snonaka bl boot 1221.1Snonakahang: 1231.1Snonaka b hang 1241.1Snonaka 1251.1Snonaka/* 1261.1Snonaka * Execute 1271.1Snonaka * run(startsym, endsym, args, bootinfo, entry) 1281.1Snonaka */ 1291.1Snonaka .globl run 1301.1Snonakarun: 1311.1Snonaka mtctr 7 /* Entry point */ 1321.1Snonaka bctr 1331.1Snonaka 1341.1Snonaka/* 1351.1Snonaka * Flush instruction cache 1361.1Snonaka */ 1371.1Snonaka .globl flush_icache 1381.1Snonakaflush_icache: 1391.1Snonaka mflr 5 1401.1Snonaka bl flush_dcache 1411.1Snonaka mfspr 4,1008 1421.1Snonaka li 4,0 1431.1Snonaka ori 4,4,HID0_ICE|HID0_ICFI 1441.1Snonaka or 3,3,4 1451.1Snonaka mtspr 1008,3 1461.1Snonaka andc 3,3,4 1471.1Snonaka ori 3,3,HID0_ICE 1481.1Snonaka mtspr 1008,3 1491.1Snonaka mtlr 5 1501.1Snonaka blr 1511.1Snonaka 1521.1Snonaka/* 1531.1Snonaka * Flush data cache 1541.1Snonaka */ 1551.1Snonaka .globl flush_dcache 1561.1Snonakaflush_dcache: 1571.1Snonaka lis 3,0x1000@h 1581.1Snonaka ori 3,3,0x1000@l 1591.1Snonaka li 4,1024 1601.1Snonaka mtctr 4 1611.1Snonaka1: 1621.1Snonaka lwz 4,0(3) 1631.1Snonaka addi 3,3,32 1641.1Snonaka bdnz 1b 1651.1Snonaka blr 1661.1Snonaka 1671.1Snonaka/* 1681.1Snonaka * local stack 1691.1Snonaka */ 1701.1Snonaka .comm .stack,8192,4 171