1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * arch/alpha/boot/head.S
4  *
5  * initial bootloader stuff..
6  */
7 
8 #include <asm/pal.h>
9 
10 	.set noreorder
11 	.globl	__start
12 	.ent	__start
13 __start:
14 	br	$29,2f
15 2:	ldgp	$29,0($29)
16 	jsr	$26,start_kernel
17 	call_pal PAL_halt
18 	.end __start
19 
20 	.align 5
21 	.globl	wrent
22 	.ent	wrent
23 wrent:
24 	.prologue 0
25 	call_pal PAL_wrent
26 	ret ($26)
27 	.end wrent
28 
29 	.align 5
30 	.globl	wrkgp
31 	.ent	wrkgp
32 wrkgp:
33 	.prologue 0
34 	call_pal PAL_wrkgp
35 	ret ($26)
36 	.end wrkgp
37 
38 	.align 5
39 	.globl	switch_to_osf_pal
40 	.ent	switch_to_osf_pal
41 switch_to_osf_pal:
42 	subq	$30,128,$30
43 	.frame	$30,128,$26
44 	stq	$26,0($30)
45 	stq	$1,8($30)
46 	stq	$2,16($30)
47 	stq	$3,24($30)
48 	stq	$4,32($30)
49 	stq	$5,40($30)
50 	stq	$6,48($30)
51 	stq	$7,56($30)
52 	stq	$8,64($30)
53 	stq	$9,72($30)
54 	stq	$10,80($30)
55 	stq	$11,88($30)
56 	stq	$12,96($30)
57 	stq	$13,104($30)
58 	stq	$14,112($30)
59 	stq	$15,120($30)
60 	.prologue 0
61 
62 	stq	$30,0($17)	/* save KSP in PCB */
63 
64 	bis	$30,$30,$20	/* a4 = KSP */
65 	br	$17,1f
66 
67 	ldq	$26,0($30)
68 	ldq	$1,8($30)
69 	ldq	$2,16($30)
70 	ldq	$3,24($30)
71 	ldq	$4,32($30)
72 	ldq	$5,40($30)
73 	ldq	$6,48($30)
74 	ldq	$7,56($30)
75 	ldq	$8,64($30)
76 	ldq	$9,72($30)
77 	ldq	$10,80($30)
78 	ldq	$11,88($30)
79 	ldq	$12,96($30)
80 	ldq	$13,104($30)
81 	ldq	$14,112($30)
82 	ldq	$15,120($30)
83 	addq	$30,128,$30
84 	ret ($26)
85 1:	call_pal PAL_swppal
86 	.end	switch_to_osf_pal
87 
88 	.align 3
89 	.globl	tbi
90 	.ent	tbi
91 tbi:
92 	.prologue 0
93 	call_pal PAL_tbi
94 	ret	($26)
95 	.end tbi
96 
97 	.align 3
98 	.globl	halt
99 	.ent	halt
100 halt:
101 	.prologue 0
102 	call_pal PAL_halt
103 	.end halt
104 
105 /* $16 - new stack page */
106 	.align 3
107 	.globl	move_stack
108 	.ent	move_stack
109 move_stack:
110 	.prologue 0
111 	lda	$0, 0x1fff($31)
112 	and	$0, $30, $1			/* Stack offset */
113 	or	$1, $16, $16			/* New stack pointer */
114 	mov	$30, $1
115 	mov	$16, $2
116 1:	ldq	$3, 0($1)			/* Move the stack */
117 	addq	$1, 8, $1
118 	stq	$3, 0($2)
119 	and	$0, $1, $4
120 	addq	$2, 8, $2
121 	bne	$4, 1b
122 	mov	$16, $30
123 	ret	($26)
124 	.end move_stack
125