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