xref: /linux/arch/alpha/boot/compressed/trampoline.S (revision 742f62b63904cdc20a364a49d2861e32464a0af7)
1*c437950dSMatt Turner/* SPDX-License-Identifier: GPL-2.0 */
2*c437950dSMatt Turner/*
3*c437950dSMatt Turner * Copy the decompressed kernel onto START_ADDR, clear its bss and jump to
4*c437950dSMatt Turner * its entry point. See relocate_and_jump() in misc.c for why this cannot
5*c437950dSMatt Turner * run from the stub itself. It is position independent (no data or
6*c437950dSMatt Turner * rodata references, no gp) and clobbers only its argument registers and
7*c437950dSMatt Turner * $1, so misc.c can copy it anywhere and call it there.
8*c437950dSMatt Turner */
9*c437950dSMatt Turner
10*c437950dSMatt Turner	.set noreorder
11*c437950dSMatt Turner
12*c437950dSMatt Turner	.globl	trampoline_start
13*c437950dSMatt Turner	.globl	trampoline_end
14*c437950dSMatt Turner	.ent	trampoline_start
15*c437950dSMatt Turnertrampoline_start:
16*c437950dSMatt Turner	/* $16 = dest, $17 = src, $18 = p_filesz, $19 = p_memsz, $20 = entry */
17*c437950dSMatt Turner
18*c437950dSMatt Turner	/*
19*c437950dSMatt Turner	 * dest and src are both page aligned, and everything above
20*c437950dSMatt Turner	 * p_filesz is bss, so round both lengths up and work in quadwords
21*c437950dSMatt Turner	 * only, using instructions every Alpha implements.
22*c437950dSMatt Turner	 */
23*c437950dSMatt Turner	addq	$18,7,$18
24*c437950dSMatt Turner	bic	$18,7,$18
25*c437950dSMatt Turner	addq	$19,7,$19
26*c437950dSMatt Turner	bic	$19,7,$19
27*c437950dSMatt Turner	subq	$19,$18,$19		/* bytes to zero after the copy */
28*c437950dSMatt Turner
29*c437950dSMatt Turner1:	beq	$18,2f
30*c437950dSMatt Turner	ldq	$1,0($17)
31*c437950dSMatt Turner	stq	$1,0($16)
32*c437950dSMatt Turner	addq	$17,8,$17
33*c437950dSMatt Turner	addq	$16,8,$16
34*c437950dSMatt Turner	subq	$18,8,$18
35*c437950dSMatt Turner	br	$31,1b
36*c437950dSMatt Turner
37*c437950dSMatt Turner2:	beq	$19,3f
38*c437950dSMatt Turner	stq	$31,0($16)
39*c437950dSMatt Turner	addq	$16,8,$16
40*c437950dSMatt Turner	subq	$19,8,$19
41*c437950dSMatt Turner	br	$31,2b
42*c437950dSMatt Turner
43*c437950dSMatt Turner3:	imb
44*c437950dSMatt Turner	jmp	$31,($20)
45*c437950dSMatt Turner	.end trampoline_start
46*c437950dSMatt Turnertrampoline_end:
47