xref: /openbmc/linux/arch/powerpc/boot/crt0.S (revision 160cc3ec)
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	.weak	_zimage_start
20	.globl	_zimage_start
21_zimage_start:
22	.globl	_zimage_start_lib
23_zimage_start_lib:
24	/* Work out the offset between the address we were linked at
25	   and the address where we're running. */
26	bl	1f
271:	mflr	r0
28	lis	r9,1b@ha
29	addi	r9,r9,1b@l
30	subf.	r0,r9,r0
31	beq	3f		/* if running at same address as linked */
32
33	/* The .got2 section contains a list of addresses, so add
34	   the address offset onto each entry. */
35	lis	r9,__got2_start@ha
36	addi	r9,r9,__got2_start@l
37	lis	r8,__got2_end@ha
38	addi	r8,r8,__got2_end@l
39	subf.	r8,r9,r8
40	beq	3f
41	srwi.	r8,r8,2
42	mtctr	r8
43	add	r9,r0,r9
442:	lwz	r8,0(r9)
45	add	r8,r8,r0
46	stw	r8,0(r9)
47	addi	r9,r9,4
48	bdnz	2b
49
50	/* Do a cache flush for our text, in case the loader didn't */
513:	lis	r9,_start@ha
52	addi	r9,r9,_start@l
53	add	r9,r0,r9
54	lis	r8,_etext@ha
55	addi	r8,r8,_etext@l
56	add	r8,r0,r8
574:	dcbf	r0,r9
58	icbi	r0,r9
59	addi	r9,r9,0x20
60	cmplw	cr0,r9,r8
61	blt	4b
62	sync
63	isync
64
65	/* Clear the BSS */
66	lis	r9,__bss_start@ha
67	addi	r9,r9,__bss_start@l
68	lis	r8,_end@ha
69	addi	r8,r8,_end@l
70	li	r0,0
715:	stw	r0,0(r9)
72	addi	r9,r9,4
73	cmplw	cr0,r9,r8
74	blt	5b
75
76	/* Possibly set up a custom stack */
77.weak	_platform_stack_top
78	lis	r8,_platform_stack_top@ha
79	addi	r8,r8,_platform_stack_top@l
80	cmpwi	r8,0
81	beq	6f
82	lwz	r1,0(r8)
83	li	r0,0
84	stwu	r0,-16(r1)	/* establish a stack frame */
856:
86
87	/* Call platform_init() */
88	bl	platform_init
89
90	/* Call start */
91	mr	r3,r1
92	b	start
93