18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * arch/alpha/boot/head.S
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * initial bootloader stuff..
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <asm/pal.h>
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci	.set noreorder
118c2ecf20Sopenharmony_ci	.globl	__start
128c2ecf20Sopenharmony_ci	.ent	__start
138c2ecf20Sopenharmony_ci__start:
148c2ecf20Sopenharmony_ci	br	$29,2f
158c2ecf20Sopenharmony_ci2:	ldgp	$29,0($29)
168c2ecf20Sopenharmony_ci	jsr	$26,start_kernel
178c2ecf20Sopenharmony_ci	call_pal PAL_halt
188c2ecf20Sopenharmony_ci	.end __start
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci	.align 5
218c2ecf20Sopenharmony_ci	.globl	wrent
228c2ecf20Sopenharmony_ci	.ent	wrent
238c2ecf20Sopenharmony_ciwrent:
248c2ecf20Sopenharmony_ci	.prologue 0
258c2ecf20Sopenharmony_ci	call_pal PAL_wrent
268c2ecf20Sopenharmony_ci	ret ($26)
278c2ecf20Sopenharmony_ci	.end wrent
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci	.align 5
308c2ecf20Sopenharmony_ci	.globl	wrkgp
318c2ecf20Sopenharmony_ci	.ent	wrkgp
328c2ecf20Sopenharmony_ciwrkgp:
338c2ecf20Sopenharmony_ci	.prologue 0
348c2ecf20Sopenharmony_ci	call_pal PAL_wrkgp
358c2ecf20Sopenharmony_ci	ret ($26)
368c2ecf20Sopenharmony_ci	.end wrkgp
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	.align 5
398c2ecf20Sopenharmony_ci	.globl	switch_to_osf_pal
408c2ecf20Sopenharmony_ci	.ent	switch_to_osf_pal
418c2ecf20Sopenharmony_ciswitch_to_osf_pal:
428c2ecf20Sopenharmony_ci	subq	$30,128,$30
438c2ecf20Sopenharmony_ci	.frame	$30,128,$26
448c2ecf20Sopenharmony_ci	stq	$26,0($30)
458c2ecf20Sopenharmony_ci	stq	$1,8($30)
468c2ecf20Sopenharmony_ci	stq	$2,16($30)
478c2ecf20Sopenharmony_ci	stq	$3,24($30)
488c2ecf20Sopenharmony_ci	stq	$4,32($30)
498c2ecf20Sopenharmony_ci	stq	$5,40($30)
508c2ecf20Sopenharmony_ci	stq	$6,48($30)
518c2ecf20Sopenharmony_ci	stq	$7,56($30)
528c2ecf20Sopenharmony_ci	stq	$8,64($30)
538c2ecf20Sopenharmony_ci	stq	$9,72($30)
548c2ecf20Sopenharmony_ci	stq	$10,80($30)
558c2ecf20Sopenharmony_ci	stq	$11,88($30)
568c2ecf20Sopenharmony_ci	stq	$12,96($30)
578c2ecf20Sopenharmony_ci	stq	$13,104($30)
588c2ecf20Sopenharmony_ci	stq	$14,112($30)
598c2ecf20Sopenharmony_ci	stq	$15,120($30)
608c2ecf20Sopenharmony_ci	.prologue 0
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	stq	$30,0($17)	/* save KSP in PCB */
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	bis	$30,$30,$20	/* a4 = KSP */
658c2ecf20Sopenharmony_ci	br	$17,1f
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	ldq	$26,0($30)
688c2ecf20Sopenharmony_ci	ldq	$1,8($30)
698c2ecf20Sopenharmony_ci	ldq	$2,16($30)
708c2ecf20Sopenharmony_ci	ldq	$3,24($30)
718c2ecf20Sopenharmony_ci	ldq	$4,32($30)
728c2ecf20Sopenharmony_ci	ldq	$5,40($30)
738c2ecf20Sopenharmony_ci	ldq	$6,48($30)
748c2ecf20Sopenharmony_ci	ldq	$7,56($30)
758c2ecf20Sopenharmony_ci	ldq	$8,64($30)
768c2ecf20Sopenharmony_ci	ldq	$9,72($30)
778c2ecf20Sopenharmony_ci	ldq	$10,80($30)
788c2ecf20Sopenharmony_ci	ldq	$11,88($30)
798c2ecf20Sopenharmony_ci	ldq	$12,96($30)
808c2ecf20Sopenharmony_ci	ldq	$13,104($30)
818c2ecf20Sopenharmony_ci	ldq	$14,112($30)
828c2ecf20Sopenharmony_ci	ldq	$15,120($30)
838c2ecf20Sopenharmony_ci	addq	$30,128,$30
848c2ecf20Sopenharmony_ci	ret ($26)
858c2ecf20Sopenharmony_ci1:	call_pal PAL_swppal
868c2ecf20Sopenharmony_ci	.end	switch_to_osf_pal
878c2ecf20Sopenharmony_ci
888c2ecf20Sopenharmony_ci	.align 3
898c2ecf20Sopenharmony_ci	.globl	tbi
908c2ecf20Sopenharmony_ci	.ent	tbi
918c2ecf20Sopenharmony_citbi:
928c2ecf20Sopenharmony_ci	.prologue 0
938c2ecf20Sopenharmony_ci	call_pal PAL_tbi
948c2ecf20Sopenharmony_ci	ret	($26)
958c2ecf20Sopenharmony_ci	.end tbi
968c2ecf20Sopenharmony_ci
978c2ecf20Sopenharmony_ci	.align 3
988c2ecf20Sopenharmony_ci	.globl	halt
998c2ecf20Sopenharmony_ci	.ent	halt
1008c2ecf20Sopenharmony_cihalt:
1018c2ecf20Sopenharmony_ci	.prologue 0
1028c2ecf20Sopenharmony_ci	call_pal PAL_halt
1038c2ecf20Sopenharmony_ci	.end halt
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci/* $16 - new stack page */
1068c2ecf20Sopenharmony_ci	.align 3
1078c2ecf20Sopenharmony_ci	.globl	move_stack
1088c2ecf20Sopenharmony_ci	.ent	move_stack
1098c2ecf20Sopenharmony_cimove_stack:
1108c2ecf20Sopenharmony_ci	.prologue 0
1118c2ecf20Sopenharmony_ci	lda	$0, 0x1fff($31)
1128c2ecf20Sopenharmony_ci	and	$0, $30, $1			/* Stack offset */
1138c2ecf20Sopenharmony_ci	or	$1, $16, $16			/* New stack pointer */
1148c2ecf20Sopenharmony_ci	mov	$30, $1
1158c2ecf20Sopenharmony_ci	mov	$16, $2
1168c2ecf20Sopenharmony_ci1:	ldq	$3, 0($1)			/* Move the stack */
1178c2ecf20Sopenharmony_ci	addq	$1, 8, $1
1188c2ecf20Sopenharmony_ci	stq	$3, 0($2)
1198c2ecf20Sopenharmony_ci	and	$0, $1, $4
1208c2ecf20Sopenharmony_ci	addq	$2, 8, $2
1218c2ecf20Sopenharmony_ci	bne	$4, 1b
1228c2ecf20Sopenharmony_ci	mov	$16, $30
1238c2ecf20Sopenharmony_ci	ret	($26)
1248c2ecf20Sopenharmony_ci	.end move_stack
125