1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | * arch/alpha/kernel/head.S |
4 | * |
5 | * initial boot stuff.. At this point, the bootloader has already |
6 | * switched into OSF/1 PAL-code, and loaded us at the correct address |
7 | * (START_ADDR). So there isn't much left for us to do: just set up |
8 | * the kernel global pointer and jump to the kernel entry-point. |
9 | */ |
10 | |
11 | #include <linux/init.h> |
12 | #include <asm/asm-offsets.h> |
13 | #include <asm/pal.h> |
14 | #include <asm/setup.h> |
15 | |
16 | __HEAD |
17 | .globl _stext |
18 | .set noreorder |
19 | .globl __start |
20 | .ent __start |
21 | _stext: |
22 | __start: |
23 | .prologue 0 |
24 | br $27,1f |
25 | 1: ldgp $29,0($27) |
26 | /* We need to get current_task_info loaded up... */ |
27 | lda $8,init_thread_union |
28 | /* ... and find our stack ... */ |
29 | lda $30,0x4000 - SIZEOF_PT_REGS($8) |
30 | /* ... and then we can start the kernel. */ |
31 | jsr $26,start_kernel |
32 | call_pal PAL_halt |
33 | .end __start |
34 | |
35 | #ifdef CONFIG_SMP |
36 | .align 3 |
37 | .globl __smp_callin |
38 | .ent __smp_callin |
39 | /* On entry here from SRM console, the HWPCB of the per-cpu |
40 | slot for this processor has been loaded. We've arranged |
41 | for the UNIQUE value for this process to contain the PCBB |
42 | of the target idle task. */ |
43 | __smp_callin: |
44 | .prologue 1 |
45 | ldgp $29,0($27) # First order of business, load the GP. |
46 | |
47 | call_pal PAL_rduniq # Grab the target PCBB. |
48 | mov $0,$16 # Install it. |
49 | call_pal PAL_swpctx |
50 | |
51 | lda $8,0x3fff # Find "current" . |
52 | bic $30,$8,$8 |
53 | |
54 | jsr $26,smp_callin |
55 | call_pal PAL_halt |
56 | .end __smp_callin |
57 | #endif /* CONFIG_SMP */ |
58 | |
59 | # |
60 | # The following two functions are needed for supporting SRM PALcode |
61 | # on the PC164 (at least), since that PALcode manages the interrupt |
62 | # masking, and we cannot duplicate the effort without causing problems |
63 | # |
64 | |
65 | .align 3 |
66 | .globl cserve_ena |
67 | .ent cserve_ena |
68 | cserve_ena: |
69 | .prologue 0 |
70 | bis $16,$16,$17 |
71 | lda $16,52($31) |
72 | call_pal PAL_cserve |
73 | ret ($26) |
74 | .end cserve_ena |
75 | |
76 | .align 3 |
77 | .globl cserve_dis |
78 | .ent cserve_dis |
79 | cserve_dis: |
80 | .prologue 0 |
81 | bis $16,$16,$17 |
82 | lda $16,53($31) |
83 | call_pal PAL_cserve |
84 | ret ($26) |
85 | .end cserve_dis |
86 | |
87 | # |
88 | # It is handy, on occasion, to make halt actually just loop. |
89 | # Putting it here means we dont have to recompile the whole |
90 | # kernel. |
91 | # |
92 | |
93 | .align 3 |
94 | .globl halt |
95 | .ent halt |
96 | halt: |
97 | .prologue 0 |
98 | call_pal PAL_halt |
99 | .end halt |
100 | |