|
@@ -411,3 +411,65 @@ start_kernel(void)
|
|
#ifdef INITRD_IMAGE_SIZE
|
|
#ifdef INITRD_IMAGE_SIZE
|
|
|
|
|
|
/* First, we always move the INITRD image, if present. */
|
|
/* First, we always move the INITRD image, if present. */
|
|
|
|
+#ifdef DEBUG_ADDRESSES
|
|
|
|
+ srm_printk("Moving the INITRD image...\n"
|
|
|
|
+ " from 0x%lx to 0x%lx size 0x%x\n",
|
|
|
|
+ V_INITRD_START,
|
|
|
|
+ initrd_image_start,
|
|
|
|
+ INITRD_IMAGE_SIZE);
|
|
|
|
+#endif
|
|
|
|
+ memcpy((void *)initrd_image_start, (void *)V_INITRD_START,
|
|
|
|
+ INITRD_IMAGE_SIZE);
|
|
|
|
+
|
|
|
|
+#endif /* INITRD_IMAGE_SIZE */
|
|
|
|
+
|
|
|
|
+ /* Next, we may have to move the uncompressed kernel to the
|
|
|
|
+ final destination.
|
|
|
|
+ */
|
|
|
|
+ if (must_move) {
|
|
|
|
+#ifdef DEBUG_ADDRESSES
|
|
|
|
+ srm_printk("Moving the uncompressed kernel...\n"
|
|
|
|
+ "...from 0x%lx to 0x%lx size 0x%x\n",
|
|
|
|
+ uncompressed_image_start,
|
|
|
|
+ K_KERNEL_IMAGE_START,
|
|
|
|
+ (unsigned)KERNEL_SIZE);
|
|
|
|
+#endif
|
|
|
|
+ /*
|
|
|
|
+ * Move the stack to a safe place to ensure it won't be
|
|
|
|
+ * overwritten by kernel image.
|
|
|
|
+ */
|
|
|
|
+ move_stack(initrd_image_start - PAGE_SIZE);
|
|
|
|
+
|
|
|
|
+ memcpy((void *)K_KERNEL_IMAGE_START,
|
|
|
|
+ (void *)uncompressed_image_start, KERNEL_SIZE);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /* Clear the zero page, then move the argument list in. */
|
|
|
|
+#ifdef DEBUG_LAST_STEPS
|
|
|
|
+ srm_printk("Preparing ZERO_PGE...\n");
|
|
|
|
+#endif
|
|
|
|
+ memset((char*)ZERO_PGE, 0, PAGE_SIZE);
|
|
|
|
+ strcpy((char*)ZERO_PGE, envval);
|
|
|
|
+
|
|
|
|
+#ifdef INITRD_IMAGE_SIZE
|
|
|
|
+
|
|
|
|
+#ifdef DEBUG_LAST_STEPS
|
|
|
|
+ srm_printk("Preparing INITRD info...\n");
|
|
|
|
+#endif
|
|
|
|
+ /* Finally, set the INITRD paramenters for the kernel. */
|
|
|
|
+ ((long *)(ZERO_PGE+256))[0] = initrd_image_start;
|
|
|
|
+ ((long *)(ZERO_PGE+256))[1] = INITRD_IMAGE_SIZE;
|
|
|
|
+
|
|
|
|
+#endif /* INITRD_IMAGE_SIZE */
|
|
|
|
+
|
|
|
|
+#ifdef DEBUG_LAST_STEPS
|
|
|
|
+ srm_printk("Doing 'runkernel()'...\n");
|
|
|
|
+#endif
|
|
|
|
+ runkernel();
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ /* dummy function, should never be called. */
|
|
|
|
+void *__kmalloc(size_t size, gfp_t flags)
|
|
|
|
+{
|
|
|
|
+ return (void *)NULL;
|
|
|
|
+}
|