1/* 2 * Copyright (C) Paul Mackerras 1997. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 * 9 * NOTE: this code runs in 32 bit mode and is packaged as ELF32. 10 */ 11 12#include "ppc_asm.h" 13 14 .text 15 /* a procedure descriptor used when booting this as a COFF file */ 16_zimage_start_opd: 17 .long _zimage_start, 0, 0, 0 18 19 .globl _zimage_start 20_zimage_start: 21 /* Work out the offset between the address we were linked at 22 and the address where we're running. */ 23 bl 1f 241: mflr r0 25 lis r9,1b@ha 26 addi r9,r9,1b@l 27 subf. r0,r9,r0 28 beq 3f /* if running at same address as linked */ 29 30 /* The .got2 section contains a list of addresses, so add 31 the address offset onto each entry. */ 32 lis r9,__got2_start@ha 33 addi r9,r9,__got2_start@l 34 lis r8,__got2_end@ha 35 addi r8,r8,__got2_end@l 36 subf. r8,r9,r8 37 beq 3f 38 srwi. r8,r8,2 39 mtctr r8 40 add r9,r0,r9 412: lwz r8,0(r9) 42 add r8,r8,r0 43 stw r8,0(r9) 44 addi r9,r9,4 45 bdnz 2b 46 47 /* Do a cache flush for our text, in case OF didn't */ 483: lis r9,_start@ha 49 addi r9,r9,_start@l 50 add r9,r0,r9 51 lis r8,_etext@ha 52 addi r8,r8,_etext@l 53 add r8,r0,r8 544: dcbf r0,r9 55 icbi r0,r9 56 addi r9,r9,0x20 57 cmplw cr0,r9,r8 58 blt 4b 59 sync 60 isync 61 62 mr r6,r1 63 b start 64 65