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