in boot/bootpz.c [164:263]
__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 kernel, it can 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
we move it to the final position, in case of overlap. This will be
above the final position of the kernel.
Regardless of overlap, we move the INITRD image to the end of this
copy area, because there needs to be a buffer area after the kernel
for "bootmem" anyway.
*/
#define K_COPY_IMAGE_START NEXT_PAGE(K_KERNEL_IMAGE_END)
/* Reserve one page below INITRD for the new stack. */
#define K_INITRD_START \
NEXT_PAGE(K_COPY_IMAGE_START + KERNEL_SIZE + PAGE_SIZE)
#define K_COPY_IMAGE_END \
(K_INITRD_START + REAL_INITRD_SIZE + MALLOC_AREA_SIZE)
#define K_COPY_IMAGE_SIZE \
NEXT_PAGE(K_COPY_IMAGE_END - K_COPY_IMAGE_START)
void
start_kernel(void)
{