diff --git a/stage2/boot.c b/stage2/boot.c index bf442e1..a6872e0 100644 --- a/stage2/boot.c +++ b/stage2/boot.c @@ -241,6 +241,7 @@ load_image (char *kernel, char *arg, kernel_t suggested_type, } if (lh->version >= 0x0202) + /* version 0x0202 and higher can handle 4096 */ lh->cmd_line_ptr = linux_data_real_addr + LINUX_CL_OFFSET; else { @@ -403,8 +404,10 @@ load_image (char *kernel, char *arg, kernel_t suggested_type, { char *src = skip_to (0, arg); char *dest = linux_data_tmp_addr + LINUX_CL_OFFSET; - - while (dest < linux_data_tmp_addr + LINUX_CL_END_OFFSET && *src) + unsigned long cl_end_offset = lh->version < 0x0202 ? + LINUX_CL_END_OFFSET : LINUX_CL_END_OFFSET_202; + + while (dest < linux_data_tmp_addr + cl_end_offset && *src) *(dest++) = *(src++); /* Old Linux kernels have problems determining the amount of diff --git a/stage2/shared.h b/stage2/shared.h index d05644b..c052480 100644 --- a/stage2/shared.h +++ b/stage2/shared.h @@ -160,10 +160,13 @@ extern void *grub_scratch_mem; #define LINUX_VID_MODE_ASK 0xFFFD #define LINUX_CL_OFFSET 0x9000 -#define LINUX_CL_END_OFFSET 0x90FF -#define LINUX_SETUP_MOVE_SIZE 0x9100 #define LINUX_CL_MAGIC 0xA33F +#define LINUX_CL_END_OFFSET 0x90FF +#define LINUX_CL_END_OFFSET_202 0x9FFF /* version 0x0202 or higher */ +#define LINUX_SETUP_MOVE_SIZE 0xA000 /* where am I putting it? */ + + /* * General disk stuff */