blob: 7eaa2ae7aff58921607883cb7e6765a22185852a [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001/* SPDX-License-Identifier: GPL-2.0 */
Richard Purdiec587e4a2007-02-06 21:29:00 +01002/*
3 * relocate_kernel.S - put the kernel image in place to boot
4 */
5
Dave Martine2ccba42013-11-25 14:54:47 +01006#include <linux/linkage.h>
Russell King6ebbf2c2014-06-30 16:29:12 +01007#include <asm/assembler.h>
Richard Purdiec587e4a2007-02-06 21:29:00 +01008#include <asm/kexec.h>
9
Dave Martine2ccba42013-11-25 14:54:47 +010010 .align 3 /* not needed for this code, but keeps fncpy() happy */
11
12ENTRY(relocate_new_kernel)
Richard Purdiec587e4a2007-02-06 21:29:00 +010013
14 ldr r0,kexec_indirection_page
15 ldr r1,kexec_start_address
16
Mika Westerberg8594a0c2010-05-10 09:24:53 +010017 /*
18 * If there is no indirection page (we are doing crashdumps)
19 * skip any relocation.
20 */
21 cmp r0, #0
22 beq 2f
Richard Purdiec587e4a2007-02-06 21:29:00 +010023
240: /* top, read another word for the indirection page */
25 ldr r3, [r0],#4
26
27 /* Is it a destination page. Put destination address to r4 */
28 tst r3,#1,0
29 beq 1f
30 bic r4,r3,#1
31 b 0b
321:
33 /* Is it an indirection page */
34 tst r3,#2,0
35 beq 1f
36 bic r0,r3,#2
37 b 0b
381:
39
40 /* are we done ? */
41 tst r3,#4,0
42 beq 1f
43 b 2f
44
451:
46 /* is it source ? */
47 tst r3,#8,0
48 beq 0b
49 bic r3,r3,#8
50 mov r6,#1024
519:
52 ldr r5,[r3],#4
53 str r5,[r4],#4
54 subs r6,r6,#1
55 bne 9b
56 b 0b
57
582:
59 /* Jump to relocated kernel */
60 mov lr,r1
61 mov r0,#0
62 ldr r1,kexec_mach_type
Richard Purdie4cd9d6f2008-01-02 00:56:46 +010063 ldr r2,kexec_boot_atags
Russell King6ebbf2c2014-06-30 16:29:12 +010064 ARM( ret lr )
Will Deacon552e0c82011-08-26 16:32:57 +010065 THUMB( bx lr )
Richard Purdiec587e4a2007-02-06 21:29:00 +010066
Dave Martinbc8b57f2010-11-29 19:43:21 +010067 .align
68
Richard Purdiec587e4a2007-02-06 21:29:00 +010069 .globl kexec_start_address
70kexec_start_address:
71 .long 0x0
72
73 .globl kexec_indirection_page
74kexec_indirection_page:
75 .long 0x0
76
77 .globl kexec_mach_type
78kexec_mach_type:
79 .long 0x0
80
Richard Purdie4cd9d6f2008-01-02 00:56:46 +010081 /* phy addr of the atags for the new kernel */
82 .globl kexec_boot_atags
83kexec_boot_atags:
Mike Westerhof033b8ff2007-10-11 03:18:14 +010084 .long 0x0
85
Dave Martine2ccba42013-11-25 14:54:47 +010086ENDPROC(relocate_new_kernel)
87
Richard Purdiec587e4a2007-02-06 21:29:00 +010088relocate_new_kernel_end:
89
90 .globl relocate_new_kernel_size
91relocate_new_kernel_size:
92 .long relocate_new_kernel_end - relocate_new_kernel
93
94