xref: /openbmc/linux/arch/powerpc/boot/crt0.S (revision f40e524e)
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