194b212c2SPaul Mackerras/* 294b212c2SPaul Mackerras * Copyright (C) Paul Mackerras 1997. 394b212c2SPaul Mackerras * 494b212c2SPaul Mackerras * This program is free software; you can redistribute it and/or 594b212c2SPaul Mackerras * modify it under the terms of the GNU General Public License 694b212c2SPaul Mackerras * as published by the Free Software Foundation; either version 794b212c2SPaul Mackerras * 2 of the License, or (at your option) any later version. 894b212c2SPaul Mackerras * 994b212c2SPaul Mackerras * NOTE: this code runs in 32 bit mode and is packaged as ELF32. 1094b212c2SPaul Mackerras */ 1194b212c2SPaul Mackerras 1294b212c2SPaul Mackerras#include "ppc_asm.h" 1394b212c2SPaul Mackerras 1494b212c2SPaul Mackerras .text 1566a45dd3SPaul Mackerras /* a procedure descriptor used when booting this as a COFF file */ 1666a45dd3SPaul Mackerras_zimage_start_opd: 1766a45dd3SPaul Mackerras .long _zimage_start, 0, 0, 0 1866a45dd3SPaul Mackerras 19cd197ffcSDavid Gibson .weak _zimage_start 2094b212c2SPaul Mackerras .globl _zimage_start 2194b212c2SPaul Mackerras_zimage_start: 22160cc3ecSMilton Miller .globl _zimage_start_lib 23160cc3ecSMilton Miller_zimage_start_lib: 2466a45dd3SPaul Mackerras /* Work out the offset between the address we were linked at 2566a45dd3SPaul Mackerras and the address where we're running. */ 2668643cfbSOlaf Hering bl 1f 2766a45dd3SPaul Mackerras1: mflr r0 2868643cfbSOlaf Hering lis r9,1b@ha 2968643cfbSOlaf Hering addi r9,r9,1b@l 3094b212c2SPaul Mackerras subf. r0,r9,r0 3166a45dd3SPaul Mackerras beq 3f /* if running at same address as linked */ 3294b212c2SPaul Mackerras 3366a45dd3SPaul Mackerras /* The .got2 section contains a list of addresses, so add 3466a45dd3SPaul Mackerras the address offset onto each entry. */ 3594b212c2SPaul Mackerras lis r9,__got2_start@ha 3694b212c2SPaul Mackerras addi r9,r9,__got2_start@l 3794b212c2SPaul Mackerras lis r8,__got2_end@ha 3894b212c2SPaul Mackerras addi r8,r8,__got2_end@l 3994b212c2SPaul Mackerras subf. r8,r9,r8 4068643cfbSOlaf Hering beq 3f 4194b212c2SPaul Mackerras srwi. r8,r8,2 4294b212c2SPaul Mackerras mtctr r8 4394b212c2SPaul Mackerras add r9,r0,r9 4466a45dd3SPaul Mackerras2: lwz r8,0(r9) 4594b212c2SPaul Mackerras add r8,r8,r0 4694b212c2SPaul Mackerras stw r8,0(r9) 4794b212c2SPaul Mackerras addi r9,r9,4 4868643cfbSOlaf Hering bdnz 2b 4994b212c2SPaul Mackerras 50cd197ffcSDavid Gibson /* Do a cache flush for our text, in case the loader didn't */ 51eacb1962SOlaf Hering3: lis r9,_start@ha 52eacb1962SOlaf Hering addi r9,r9,_start@l 5394b212c2SPaul Mackerras add r9,r0,r9 5494b212c2SPaul Mackerras lis r8,_etext@ha 5594b212c2SPaul Mackerras addi r8,r8,_etext@l 5694b212c2SPaul Mackerras add r8,r0,r8 5768643cfbSOlaf Hering4: dcbf r0,r9 5894b212c2SPaul Mackerras icbi r0,r9 5994b212c2SPaul Mackerras addi r9,r9,0x20 60eacb1962SOlaf Hering cmplw cr0,r9,r8 6168643cfbSOlaf Hering blt 4b 6294b212c2SPaul Mackerras sync 6394b212c2SPaul Mackerras isync 6494b212c2SPaul Mackerras 65cd197ffcSDavid Gibson /* Clear the BSS */ 66cd197ffcSDavid Gibson lis r9,__bss_start@ha 67cd197ffcSDavid Gibson addi r9,r9,__bss_start@l 68cd197ffcSDavid Gibson lis r8,_end@ha 69cd197ffcSDavid Gibson addi r8,r8,_end@l 70cd197ffcSDavid Gibson li r0,0 71cd197ffcSDavid Gibson5: stw r0,0(r9) 72cd197ffcSDavid Gibson addi r9,r9,4 73cd197ffcSDavid Gibson cmplw cr0,r9,r8 74cd197ffcSDavid Gibson blt 5b 7594b212c2SPaul Mackerras 76cd197ffcSDavid Gibson /* Possibly set up a custom stack */ 77cd197ffcSDavid Gibson.weak _platform_stack_top 78cd197ffcSDavid Gibson lis r8,_platform_stack_top@ha 79cd197ffcSDavid Gibson addi r8,r8,_platform_stack_top@l 80cd197ffcSDavid Gibson cmpwi r8,0 81cd197ffcSDavid Gibson beq 6f 82cd197ffcSDavid Gibson lwz r1,0(r8) 83cd197ffcSDavid Gibson li r0,0 84cd197ffcSDavid Gibson stwu r0,-16(r1) /* establish a stack frame */ 85cd197ffcSDavid Gibson6: 86cd197ffcSDavid Gibson 87cd197ffcSDavid Gibson /* Call platform_init() */ 88cd197ffcSDavid Gibson bl platform_init 89cd197ffcSDavid Gibson 90cd197ffcSDavid Gibson /* Call start */ 91cd197ffcSDavid Gibson mr r3,r1 92cd197ffcSDavid Gibson b start 93