kexec bzImage path setup data is shared with real-mode path, and
setup_header is copied together with setup_code.
Later 32bit just use whole area as boot_params for real_mode_data.
but those area for boot_params around setup_header is
not cleaned that will leave some field in boot_param as
non-zero value.

So clean around setup_header area for non real-mode entry path.

Signed-off-by: Yinghai Lu <[email protected]>
---
 kexec/arch/i386/kexec-bzImage.c |   16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/kexec/arch/i386/kexec-bzImage.c b/kexec/arch/i386/kexec-bzImage.c
index 0605909..4cc394d 100644
--- a/kexec/arch/i386/kexec-bzImage.c
+++ b/kexec/arch/i386/kexec-bzImage.c
@@ -98,6 +98,19 @@ void bzImage_usage(void)
        
 }
 
+static void clean_boot_params(unsigned char *real_mode, unsigned long size)
+{
+       unsigned long end;
+
+       /* clear value before header */
+       memset(real_mode, 0, 0x1f1);
+       /* clear value after setup_header  */
+       end = *(real_mode + 0x201);
+       end += 0x202;
+       if (end < size)
+               memset(real_mode + end, 0, size - end);
+}
+
 int do_bzImage_load(struct kexec_info *info,
        const char *kernel, off_t kernel_len,
        const char *command_line, off_t command_line_len,
@@ -212,6 +225,9 @@ int do_bzImage_load(struct kexec_info *info,
        setup_size = kern16_size + command_line_len + PURGATORY_CMDLINE_SIZE;
        real_mode = xmalloc(setup_size);
        memcpy(real_mode, kernel, kern16_size);
+       if (!real_mode_entry)
+               clean_boot_params((unsigned char *)real_mode, kern16_size);
+       real_mode->xloadflags &= ~(1<<0); /* clear CAN_BE_LOADED_ABOVE_4G */
 
        if (info->kexec_flags & (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT)) {
                /* If using bzImage for capture kernel, then we will not be
-- 
1.7.10.4


_______________________________________________
kexec mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/kexec

Reply via email to