| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2006-10-03 23:01:26 +02:00
										 |  |  |  * arch/alpha/kernel/head.S | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * initial boot stuff.. At this point, the bootloader has already | 
					
						
							|  |  |  |  * switched into OSF/1 PAL-code, and loaded us at the correct address | 
					
						
							|  |  |  |  * (START_ADDR).  So there isn't much left for us to do: just set up | 
					
						
							|  |  |  |  * the kernel global pointer and jump to the kernel entry-point. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-25 22:10:58 -04:00
										 |  |  | #include <linux/init.h> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <asm/system.h> | 
					
						
							| 
									
										
										
										
											2005-09-09 21:28:48 +02:00
										 |  |  | #include <asm/asm-offsets.h> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-25 22:10:58 -04:00
										 |  |  | __HEAD | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | .globl swapper_pg_dir
 | 
					
						
							|  |  |  | .globl _stext
 | 
					
						
							|  |  |  | swapper_pg_dir=SWAPPER_PGD | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.set noreorder
 | 
					
						
							|  |  |  | 	.globl	__start
 | 
					
						
							|  |  |  | 	.ent	__start
 | 
					
						
							|  |  |  | _stext: | 
					
						
							|  |  |  | __start: | 
					
						
							|  |  |  | 	.prologue 0
 | 
					
						
							|  |  |  | 	br	$27,1f | 
					
						
							|  |  |  | 1:	ldgp	$29,0($27) | 
					
						
							|  |  |  | 	/* We need to get current_task_info loaded up...  */ | 
					
						
							|  |  |  | 	lda	$8,init_thread_union | 
					
						
							|  |  |  | 	/* ... and find our stack ... */ | 
					
						
							|  |  |  | 	lda	$30,0x4000 - SIZEOF_PT_REGS($8) | 
					
						
							|  |  |  | 	/* ... and then we can start the kernel.  */ | 
					
						
							|  |  |  | 	jsr	$26,start_kernel | 
					
						
							|  |  |  | 	call_pal PAL_halt | 
					
						
							|  |  |  | 	.end __start
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_SMP | 
					
						
							|  |  |  | 	.align 3
 | 
					
						
							|  |  |  | 	.globl	__smp_callin
 | 
					
						
							|  |  |  | 	.ent	__smp_callin
 | 
					
						
							|  |  |  | 	/* On entry here from SRM console, the HWPCB of the per-cpu | 
					
						
							|  |  |  | 	   slot for this processor has been loaded.  We've arranged | 
					
						
							|  |  |  | 	   for the UNIQUE value for this process to contain the PCBB | 
					
						
							|  |  |  | 	   of the target idle task.  */ | 
					
						
							|  |  |  | __smp_callin: | 
					
						
							|  |  |  | 	.prologue 1
 | 
					
						
							|  |  |  | 	ldgp	$29,0($27)	# First order of business, load the GP. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	call_pal PAL_rduniq	# Grab the target PCBB. | 
					
						
							|  |  |  | 	mov	$0,$16		# Install it. | 
					
						
							|  |  |  | 	call_pal PAL_swpctx | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	lda	$8,0x3fff	# Find "current". | 
					
						
							|  |  |  | 	bic	$30,$8,$8 | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	jsr	$26,smp_callin | 
					
						
							|  |  |  | 	call_pal PAL_halt | 
					
						
							|  |  |  | 	.end __smp_callin
 | 
					
						
							|  |  |  | #endif /* CONFIG_SMP */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# The following two functions are needed for supporting SRM PALcode | 
					
						
							|  |  |  | 	# on the PC164 (at least), since that PALcode manages the interrupt | 
					
						
							|  |  |  | 	# masking, and we cannot duplicate the effort without causing problems | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.align 3
 | 
					
						
							|  |  |  | 	.globl	cserve_ena
 | 
					
						
							|  |  |  | 	.ent	cserve_ena
 | 
					
						
							|  |  |  | cserve_ena: | 
					
						
							|  |  |  | 	.prologue 0
 | 
					
						
							|  |  |  | 	bis	$16,$16,$17 | 
					
						
							|  |  |  | 	lda	$16,52($31) | 
					
						
							|  |  |  | 	call_pal PAL_cserve | 
					
						
							|  |  |  | 	ret	($26) | 
					
						
							|  |  |  | 	.end	cserve_ena
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.align 3
 | 
					
						
							|  |  |  | 	.globl	cserve_dis
 | 
					
						
							|  |  |  | 	.ent	cserve_dis
 | 
					
						
							|  |  |  | cserve_dis: | 
					
						
							|  |  |  | 	.prologue 0
 | 
					
						
							|  |  |  | 	bis	$16,$16,$17 | 
					
						
							|  |  |  | 	lda	$16,53($31) | 
					
						
							|  |  |  | 	call_pal PAL_cserve | 
					
						
							|  |  |  | 	ret	($26) | 
					
						
							|  |  |  | 	.end	cserve_dis
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 	# It is handy, on occasion, to make halt actually just loop.  | 
					
						
							|  |  |  | 	# Putting it here means we dont have to recompile the whole | 
					
						
							|  |  |  | 	# kernel. | 
					
						
							|  |  |  | 	# | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.align 3
 | 
					
						
							|  |  |  | 	.globl	halt
 | 
					
						
							|  |  |  | 	.ent	halt
 | 
					
						
							|  |  |  | halt: | 
					
						
							|  |  |  | 	.prologue 0
 | 
					
						
							|  |  |  | 	call_pal PAL_halt | 
					
						
							|  |  |  | 	.end	halt
 |