|  | @@ -155,3 +155,90 @@ pal_init(void)
 | 
	
		
			
				|  |  |  	tbia(); /* do it directly in case we are SMP */
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +/*
 | 
	
		
			
				|  |  | + * Start the kernel.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +static inline void
 | 
	
		
			
				|  |  | +runkernel(void)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	__asm__ __volatile__(
 | 
	
		
			
				|  |  | +		"bis %0,%0,$27\n\t"
 | 
	
		
			
				|  |  | +		"jmp ($27)"
 | 
	
		
			
				|  |  | +		: /* no outputs: it doesn't even return */
 | 
	
		
			
				|  |  | +		: "r" (START_ADDR));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Must record the SP (it is virtual) on entry, so we can make sure
 | 
	
		
			
				|  |  | +   not to overwrite it during movement or decompression. */
 | 
	
		
			
				|  |  | +unsigned long SP_on_entry;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Calculate the kernel image address based on the end of the BOOTP
 | 
	
		
			
				|  |  | +   bootstrapper (ie this program).
 | 
	
		
			
				|  |  | +*/
 | 
	
		
			
				|  |  | +extern char _end;
 | 
	
		
			
				|  |  | +#define KERNEL_ORIGIN \
 | 
	
		
			
				|  |  | +	((((unsigned long)&_end) + 511) & ~511)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Round address to next higher page boundary. */
 | 
	
		
			
				|  |  | +#define NEXT_PAGE(a)	(((a) | (PAGE_SIZE - 1)) + 1)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#ifdef INITRD_IMAGE_SIZE
 | 
	
		
			
				|  |  | +# define REAL_INITRD_SIZE INITRD_IMAGE_SIZE
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +# define REAL_INITRD_SIZE 0
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Defines from include/asm-alpha/system.h
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	BOOT_ADDR	Virtual address at which the consoles loads
 | 
	
		
			
				|  |  | +			the BOOTP image.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	KERNEL_START    KSEG address at which the kernel is built to run,
 | 
	
		
			
				|  |  | +			which includes some initial data pages before the
 | 
	
		
			
				|  |  | +			code.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	START_ADDR	KSEG address of the entry point of kernel code.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	ZERO_PGE	KSEG address of page full of zeroes, but 
 | 
	
		
			
				|  |  | +			upon entry to kerne cvan be expected
 | 
	
		
			
				|  |  | +			to hold the parameter list and possible
 | 
	
		
			
				|  |  | +			INTRD information.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   These are used in the local defines below.
 | 
	
		
			
				|  |  | +*/
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Virtual addresses for the BOOTP image. Note that this includes the
 | 
	
		
			
				|  |  | +   bootstrapper code as well as the compressed kernel image, and
 | 
	
		
			
				|  |  | +   possibly the INITRD image.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   Oh, and do NOT forget the STACK, which appears to be placed virtually
 | 
	
		
			
				|  |  | +   beyond the end of the loaded image.
 | 
	
		
			
				|  |  | +*/
 | 
	
		
			
				|  |  | +#define V_BOOT_IMAGE_START	BOOT_ADDR
 | 
	
		
			
				|  |  | +#define V_BOOT_IMAGE_END	SP_on_entry
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Virtual addresses for just the bootstrapper part of the BOOTP image. */
 | 
	
		
			
				|  |  | +#define V_BOOTSTRAPPER_START	BOOT_ADDR
 | 
	
		
			
				|  |  | +#define V_BOOTSTRAPPER_END	KERNEL_ORIGIN
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Virtual addresses for just the data part of the BOOTP
 | 
	
		
			
				|  |  | +   image. This may also include the INITRD image, but always
 | 
	
		
			
				|  |  | +   includes the STACK.
 | 
	
		
			
				|  |  | +*/
 | 
	
		
			
				|  |  | +#define V_DATA_START		KERNEL_ORIGIN
 | 
	
		
			
				|  |  | +#define V_INITRD_START		(KERNEL_ORIGIN + KERNEL_Z_SIZE)
 | 
	
		
			
				|  |  | +#define V_INTRD_END		(V_INITRD_START + REAL_INITRD_SIZE)
 | 
	
		
			
				|  |  | +#define V_DATA_END	 	V_BOOT_IMAGE_END
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* KSEG addresses for the uncompressed kernel.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +   Note that the end address includes workspace for the decompression.
 | 
	
		
			
				|  |  | +   Note also that the DATA_START address is ZERO_PGE, to which we write
 | 
	
		
			
				|  |  | +   just before jumping to the kernel image at START_ADDR.
 | 
	
		
			
				|  |  | + */
 | 
	
		
			
				|  |  | +#define K_KERNEL_DATA_START	ZERO_PGE
 | 
	
		
			
				|  |  | +#define K_KERNEL_IMAGE_START	START_ADDR
 | 
	
		
			
				|  |  | +#define K_KERNEL_IMAGE_END	(START_ADDR + KERNEL_SIZE)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Define to where we may have to decompress the kernel image, before
 |