| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* | 
| Uwe Zeisberger | f30c226 | 2006-10-03 23:01:26 +0200 | [diff] [blame] | 2 |  * arch/alpha/kernel/head.S | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 10 | #include <asm/system.h> | 
| Sam Ravnborg | e2d5df9 | 2005-09-09 21:28:48 +0200 | [diff] [blame] | 11 | #include <asm/asm-offsets.h> | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 12 |  | 
| Al Viro | ed5f656 | 2007-07-26 17:34:19 +0100 | [diff] [blame] | 13 | .section .text.head, "ax" | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 14 | .globl swapper_pg_dir | 
 | 15 | .globl _stext | 
 | 16 | swapper_pg_dir=SWAPPER_PGD | 
 | 17 |  | 
 | 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 |