1/*
2 * arch/alpha/kernel/head.S
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
10#include <linux/init.h>
11#include <asm/asm-offsets.h>
12#include <asm/pal.h>
13#include <asm/setup.h>
14
15__HEAD
16.globl _stext
17	.set noreorder
18	.globl	__start
19	.ent	__start
20_stext:
21__start:
22	.prologue 0
23	br	$27,1f
241:	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
67cserve_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
78cserve_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
95halt:
96	.prologue 0
97	call_pal PAL_halt
98	.end	halt
99