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