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 */ 16f40e524eSPaul Mackerras .globl _zimage_start_opd 1766a45dd3SPaul Mackerras_zimage_start_opd: 1866a45dd3SPaul Mackerras .long _zimage_start, 0, 0, 0 1966a45dd3SPaul Mackerras 20cd197ffcSDavid Gibson .weak _zimage_start 2194b212c2SPaul Mackerras .globl _zimage_start 2294b212c2SPaul Mackerras_zimage_start: 23160cc3ecSMilton Miller .globl _zimage_start_lib 24160cc3ecSMilton Miller_zimage_start_lib: 2566a45dd3SPaul Mackerras /* Work out the offset between the address we were linked at 2666a45dd3SPaul Mackerras and the address where we're running. */ 2768643cfbSOlaf Hering bl 1f 2866a45dd3SPaul Mackerras1: mflr r0 2968643cfbSOlaf Hering lis r9,1b@ha 3068643cfbSOlaf Hering addi r9,r9,1b@l 3194b212c2SPaul Mackerras subf. r0,r9,r0 3266a45dd3SPaul Mackerras beq 3f /* if running at same address as linked */ 3394b212c2SPaul Mackerras 3466a45dd3SPaul Mackerras /* The .got2 section contains a list of addresses, so add 3566a45dd3SPaul Mackerras the address offset onto each entry. */ 3694b212c2SPaul Mackerras lis r9,__got2_start@ha 3794b212c2SPaul Mackerras addi r9,r9,__got2_start@l 3894b212c2SPaul Mackerras lis r8,__got2_end@ha 3994b212c2SPaul Mackerras addi r8,r8,__got2_end@l 4094b212c2SPaul Mackerras subf. r8,r9,r8 4168643cfbSOlaf Hering beq 3f 4294b212c2SPaul Mackerras srwi. r8,r8,2 4394b212c2SPaul Mackerras mtctr r8 4494b212c2SPaul Mackerras add r9,r0,r9 4566a45dd3SPaul Mackerras2: lwz r8,0(r9) 4694b212c2SPaul Mackerras add r8,r8,r0 4794b212c2SPaul Mackerras stw r8,0(r9) 4894b212c2SPaul Mackerras addi r9,r9,4 4968643cfbSOlaf Hering bdnz 2b 5094b212c2SPaul Mackerras 51cd197ffcSDavid Gibson /* Do a cache flush for our text, in case the loader didn't */ 52eacb1962SOlaf Hering3: lis r9,_start@ha 53eacb1962SOlaf Hering addi r9,r9,_start@l 5494b212c2SPaul Mackerras add r9,r0,r9 5594b212c2SPaul Mackerras lis r8,_etext@ha 5694b212c2SPaul Mackerras addi r8,r8,_etext@l 5794b212c2SPaul Mackerras add r8,r0,r8 5868643cfbSOlaf Hering4: dcbf r0,r9 5994b212c2SPaul Mackerras icbi r0,r9 6094b212c2SPaul Mackerras addi r9,r9,0x20 61eacb1962SOlaf Hering cmplw cr0,r9,r8 6268643cfbSOlaf Hering blt 4b 6394b212c2SPaul Mackerras sync 6494b212c2SPaul Mackerras isync 6594b212c2SPaul Mackerras 66cd197ffcSDavid Gibson /* Clear the BSS */ 67cd197ffcSDavid Gibson lis r9,__bss_start@ha 68cd197ffcSDavid Gibson addi r9,r9,__bss_start@l 69f4bdbfc4SMilton Miller add r9,r0,r9 70cd197ffcSDavid Gibson lis r8,_end@ha 71cd197ffcSDavid Gibson addi r8,r8,_end@l 72f4bdbfc4SMilton Miller add r8,r0,r8 73f4bdbfc4SMilton Miller li r10,0 74f4bdbfc4SMilton Miller5: stw r10,0(r9) 75cd197ffcSDavid Gibson addi r9,r9,4 76cd197ffcSDavid Gibson cmplw cr0,r9,r8 77cd197ffcSDavid Gibson blt 5b 7894b212c2SPaul Mackerras 79cd197ffcSDavid Gibson /* Possibly set up a custom stack */ 80cd197ffcSDavid Gibson.weak _platform_stack_top 81cd197ffcSDavid Gibson lis r8,_platform_stack_top@ha 82cd197ffcSDavid Gibson addi r8,r8,_platform_stack_top@l 83cd197ffcSDavid Gibson cmpwi r8,0 84cd197ffcSDavid Gibson beq 6f 85f4bdbfc4SMilton Miller add r8,r0,r8 86cd197ffcSDavid Gibson lwz r1,0(r8) 87f4bdbfc4SMilton Miller add r1,r0,r1 88cd197ffcSDavid Gibson li r0,0 89cd197ffcSDavid Gibson stwu r0,-16(r1) /* establish a stack frame */ 90cd197ffcSDavid Gibson6: 91cd197ffcSDavid Gibson 92cd197ffcSDavid Gibson /* Call platform_init() */ 93cd197ffcSDavid Gibson bl platform_init 94cd197ffcSDavid Gibson 95cd197ffcSDavid Gibson /* Call start */ 96cd197ffcSDavid Gibson b start 97