x86, boot: Move checking of cmd_line_ptr out of common path
authorYinghai Lu <yinghai@kernel.org>
Thu, 24 Jan 2013 20:19:58 +0000 (12:19 -0800)
committerH. Peter Anvin <hpa@linux.intel.com>
Tue, 29 Jan 2013 23:26:01 +0000 (15:26 -0800)
cmdline.c::__cmdline_find_option... are shared between 16-bit setup code
and 32/64 bit decompressor code.

for 32/64 only path via kexec, we should not check if ptr is less 1M.
as those cmdline could be put above 1M, or even 4G.

Move out accessible checking out of __cmdline_find_option()
So decompressor in misc.c can parse cmdline correctly.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Link: http://lkml.kernel.org/r/1359058816-7615-18-git-send-email-yinghai@kernel.org
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
arch/x86/boot/boot.h
arch/x86/boot/cmdline.c

index 18997e5a1053128369bb22029d762f9dde204874..7fadf806f7ca928998575a142a19c0e2f97b06bd 100644 (file)
@@ -289,12 +289,22 @@ int __cmdline_find_option(u32 cmdline_ptr, const char *option, char *buffer, int
 int __cmdline_find_option_bool(u32 cmdline_ptr, const char *option);
 static inline int cmdline_find_option(const char *option, char *buffer, int bufsize)
 {
-       return __cmdline_find_option(boot_params.hdr.cmd_line_ptr, option, buffer, bufsize);
+       u32 cmd_line_ptr = boot_params.hdr.cmd_line_ptr;
+
+       if (cmd_line_ptr >= 0x100000)
+               return -1;      /* inaccessible */
+
+       return __cmdline_find_option(cmd_line_ptr, option, buffer, bufsize);
 }
 
 static inline int cmdline_find_option_bool(const char *option)
 {
-       return __cmdline_find_option_bool(boot_params.hdr.cmd_line_ptr, option);
+       u32 cmd_line_ptr = boot_params.hdr.cmd_line_ptr;
+
+       if (cmd_line_ptr >= 0x100000)
+               return -1;      /* inaccessible */
+
+       return __cmdline_find_option_bool(cmd_line_ptr, option);
 }
 
 
index 6b3b6f708c04262c02a788f815d1feac7d25786b..768f00f32469665b98b8d9a9c85ba4f3b0869f24 100644 (file)
@@ -41,8 +41,8 @@ int __cmdline_find_option(u32 cmdline_ptr, const char *option, char *buffer, int
                st_bufcpy       /* Copying this to buffer */
        } state = st_wordstart;
 
-       if (!cmdline_ptr || cmdline_ptr >= 0x100000)
-               return -1;      /* No command line, or inaccessible */
+       if (!cmdline_ptr)
+               return -1;      /* No command line */
 
        cptr = cmdline_ptr & 0xf;
        set_fs(cmdline_ptr >> 4);
@@ -111,8 +111,8 @@ int __cmdline_find_option_bool(u32 cmdline_ptr, const char *option)
                st_wordskip,    /* Miscompare, skip */
        } state = st_wordstart;
 
-       if (!cmdline_ptr || cmdline_ptr >= 0x100000)
-               return -1;      /* No command line, or inaccessible */
+       if (!cmdline_ptr)
+               return -1;      /* No command line */
 
        cptr = cmdline_ptr & 0xf;
        set_fs(cmdline_ptr >> 4);