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