| 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 |