162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * arch/alpha/boot/head.S
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * initial bootloader stuff..
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <asm/pal.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci	.set noreorder
1162306a36Sopenharmony_ci	.globl	__start
1262306a36Sopenharmony_ci	.ent	__start
1362306a36Sopenharmony_ci__start:
1462306a36Sopenharmony_ci	br	$29,2f
1562306a36Sopenharmony_ci2:	ldgp	$29,0($29)
1662306a36Sopenharmony_ci	jsr	$26,start_kernel
1762306a36Sopenharmony_ci	call_pal PAL_halt
1862306a36Sopenharmony_ci	.end __start
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	.align 5
2162306a36Sopenharmony_ci	.globl	wrent
2262306a36Sopenharmony_ci	.ent	wrent
2362306a36Sopenharmony_ciwrent:
2462306a36Sopenharmony_ci	.prologue 0
2562306a36Sopenharmony_ci	call_pal PAL_wrent
2662306a36Sopenharmony_ci	ret ($26)
2762306a36Sopenharmony_ci	.end wrent
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	.align 5
3062306a36Sopenharmony_ci	.globl	wrkgp
3162306a36Sopenharmony_ci	.ent	wrkgp
3262306a36Sopenharmony_ciwrkgp:
3362306a36Sopenharmony_ci	.prologue 0
3462306a36Sopenharmony_ci	call_pal PAL_wrkgp
3562306a36Sopenharmony_ci	ret ($26)
3662306a36Sopenharmony_ci	.end wrkgp
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	.align 5
3962306a36Sopenharmony_ci	.globl	switch_to_osf_pal
4062306a36Sopenharmony_ci	.ent	switch_to_osf_pal
4162306a36Sopenharmony_ciswitch_to_osf_pal:
4262306a36Sopenharmony_ci	subq	$30,128,$30
4362306a36Sopenharmony_ci	.frame	$30,128,$26
4462306a36Sopenharmony_ci	stq	$26,0($30)
4562306a36Sopenharmony_ci	stq	$1,8($30)
4662306a36Sopenharmony_ci	stq	$2,16($30)
4762306a36Sopenharmony_ci	stq	$3,24($30)
4862306a36Sopenharmony_ci	stq	$4,32($30)
4962306a36Sopenharmony_ci	stq	$5,40($30)
5062306a36Sopenharmony_ci	stq	$6,48($30)
5162306a36Sopenharmony_ci	stq	$7,56($30)
5262306a36Sopenharmony_ci	stq	$8,64($30)
5362306a36Sopenharmony_ci	stq	$9,72($30)
5462306a36Sopenharmony_ci	stq	$10,80($30)
5562306a36Sopenharmony_ci	stq	$11,88($30)
5662306a36Sopenharmony_ci	stq	$12,96($30)
5762306a36Sopenharmony_ci	stq	$13,104($30)
5862306a36Sopenharmony_ci	stq	$14,112($30)
5962306a36Sopenharmony_ci	stq	$15,120($30)
6062306a36Sopenharmony_ci	.prologue 0
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	stq	$30,0($17)	/* save KSP in PCB */
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	bis	$30,$30,$20	/* a4 = KSP */
6562306a36Sopenharmony_ci	br	$17,1f
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	ldq	$26,0($30)
6862306a36Sopenharmony_ci	ldq	$1,8($30)
6962306a36Sopenharmony_ci	ldq	$2,16($30)
7062306a36Sopenharmony_ci	ldq	$3,24($30)
7162306a36Sopenharmony_ci	ldq	$4,32($30)
7262306a36Sopenharmony_ci	ldq	$5,40($30)
7362306a36Sopenharmony_ci	ldq	$6,48($30)
7462306a36Sopenharmony_ci	ldq	$7,56($30)
7562306a36Sopenharmony_ci	ldq	$8,64($30)
7662306a36Sopenharmony_ci	ldq	$9,72($30)
7762306a36Sopenharmony_ci	ldq	$10,80($30)
7862306a36Sopenharmony_ci	ldq	$11,88($30)
7962306a36Sopenharmony_ci	ldq	$12,96($30)
8062306a36Sopenharmony_ci	ldq	$13,104($30)
8162306a36Sopenharmony_ci	ldq	$14,112($30)
8262306a36Sopenharmony_ci	ldq	$15,120($30)
8362306a36Sopenharmony_ci	addq	$30,128,$30
8462306a36Sopenharmony_ci	ret ($26)
8562306a36Sopenharmony_ci1:	call_pal PAL_swppal
8662306a36Sopenharmony_ci	.end	switch_to_osf_pal
8762306a36Sopenharmony_ci
8862306a36Sopenharmony_ci	.align 3
8962306a36Sopenharmony_ci	.globl	tbi
9062306a36Sopenharmony_ci	.ent	tbi
9162306a36Sopenharmony_citbi:
9262306a36Sopenharmony_ci	.prologue 0
9362306a36Sopenharmony_ci	call_pal PAL_tbi
9462306a36Sopenharmony_ci	ret	($26)
9562306a36Sopenharmony_ci	.end tbi
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	.align 3
9862306a36Sopenharmony_ci	.globl	halt
9962306a36Sopenharmony_ci	.ent	halt
10062306a36Sopenharmony_cihalt:
10162306a36Sopenharmony_ci	.prologue 0
10262306a36Sopenharmony_ci	call_pal PAL_halt
10362306a36Sopenharmony_ci	.end halt
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci/* $16 - new stack page */
10662306a36Sopenharmony_ci	.align 3
10762306a36Sopenharmony_ci	.globl	move_stack
10862306a36Sopenharmony_ci	.ent	move_stack
10962306a36Sopenharmony_cimove_stack:
11062306a36Sopenharmony_ci	.prologue 0
11162306a36Sopenharmony_ci	lda	$0, 0x1fff($31)
11262306a36Sopenharmony_ci	and	$0, $30, $1			/* Stack offset */
11362306a36Sopenharmony_ci	or	$1, $16, $16			/* New stack pointer */
11462306a36Sopenharmony_ci	mov	$30, $1
11562306a36Sopenharmony_ci	mov	$16, $2
11662306a36Sopenharmony_ci1:	ldq	$3, 0($1)			/* Move the stack */
11762306a36Sopenharmony_ci	addq	$1, 8, $1
11862306a36Sopenharmony_ci	stq	$3, 0($2)
11962306a36Sopenharmony_ci	and	$0, $1, $4
12062306a36Sopenharmony_ci	addq	$2, 8, $2
12162306a36Sopenharmony_ci	bne	$4, 1b
12262306a36Sopenharmony_ci	mov	$16, $30
12362306a36Sopenharmony_ci	ret	($26)
12462306a36Sopenharmony_ci	.end move_stack
125