Commit ee92d815 authored by Yinghai Lu's avatar Yinghai Lu Committed by H. Peter Anvin

x86, boot: Support loading bzImage, boot_params and ramdisk above 4G

xloadflags bit 1 indicates that we can load the kernel and all data
structures above 4G; it is set if kernel is relocatable and 64bit.

bootloader will check if xloadflags bit 1 is set to decide if
it could load ramdisk and kernel high above 4G.

bootloader will fill value to ext_ramdisk_image/size for high 32bits
when it load ramdisk above 4G.
kernel use get_ramdisk_image/size to use ext_ramdisk_image/size to get
right positon for ramdisk.
Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
Cc: Rob Landley <rob@landley.net>
Cc: Matt Fleming <matt.fleming@intel.com>
Cc: Gokul Caushik <caushik1@gmail.com>
Cc: Josh Triplett <josh@joshtriplett.org>
Cc: Joe Millenbach <jmillenbach@gmail.com>
Link: http://lkml.kernel.org/r/1359058816-7615-26-git-send-email-yinghai@kernel.orgSigned-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
parent 0e691cf8
...@@ -17,6 +17,8 @@ static unsigned long get_cmd_line_ptr(void) ...@@ -17,6 +17,8 @@ static unsigned long get_cmd_line_ptr(void)
{ {
unsigned long cmd_line_ptr = real_mode->hdr.cmd_line_ptr; unsigned long cmd_line_ptr = real_mode->hdr.cmd_line_ptr;
cmd_line_ptr |= (u64)real_mode->ext_cmd_line_ptr << 32;
return cmd_line_ptr; return cmd_line_ptr;
} }
int cmdline_find_option(const char *option, char *buffer, int bufsize) int cmdline_find_option(const char *option, char *buffer, int bufsize)
......
...@@ -374,6 +374,14 @@ xloadflags: ...@@ -374,6 +374,14 @@ xloadflags:
#else #else
# define XLF0 0 # define XLF0 0
#endif #endif
#if defined(CONFIG_RELOCATABLE) && defined(CONFIG_X86_64)
/* kernel/boot_param/ramdisk could be loaded above 4g */
# define XLF1 XLF_CAN_BE_LOADED_ABOVE_4G
#else
# define XLF1 0
#endif
#ifdef CONFIG_EFI_STUB #ifdef CONFIG_EFI_STUB
# ifdef CONFIG_X86_64 # ifdef CONFIG_X86_64
# define XLF23 XLF_EFI_HANDOVER_64 /* 64-bit EFI handover ok */ # define XLF23 XLF_EFI_HANDOVER_64 /* 64-bit EFI handover ok */
...@@ -383,7 +391,7 @@ xloadflags: ...@@ -383,7 +391,7 @@ xloadflags:
#else #else
# define XLF23 0 # define XLF23 0
#endif #endif
.word XLF0 | XLF23 .word XLF0 | XLF1 | XLF23
cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line, cmdline_size: .long COMMAND_LINE_SIZE-1 #length of the command line,
#added with boot protocol #added with boot protocol
......
...@@ -116,6 +116,8 @@ static unsigned long get_cmd_line_ptr(void) ...@@ -116,6 +116,8 @@ static unsigned long get_cmd_line_ptr(void)
{ {
unsigned long cmd_line_ptr = boot_params.hdr.cmd_line_ptr; unsigned long cmd_line_ptr = boot_params.hdr.cmd_line_ptr;
cmd_line_ptr |= (u64)boot_params.ext_cmd_line_ptr << 32;
return cmd_line_ptr; return cmd_line_ptr;
} }
......
...@@ -298,12 +298,16 @@ static u64 __init get_ramdisk_image(void) ...@@ -298,12 +298,16 @@ static u64 __init get_ramdisk_image(void)
{ {
u64 ramdisk_image = boot_params.hdr.ramdisk_image; u64 ramdisk_image = boot_params.hdr.ramdisk_image;
ramdisk_image |= (u64)boot_params.ext_ramdisk_image << 32;
return ramdisk_image; return ramdisk_image;
} }
static u64 __init get_ramdisk_size(void) static u64 __init get_ramdisk_size(void)
{ {
u64 ramdisk_size = boot_params.hdr.ramdisk_size; u64 ramdisk_size = boot_params.hdr.ramdisk_size;
ramdisk_size |= (u64)boot_params.ext_ramdisk_size << 32;
return ramdisk_size; return ramdisk_size;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment