[PATCH v4 1/6] kexec, x86: clean boot_params area for entry-32bit path
Yinghai Lu
yinghai at kernel.org
Sat Nov 24 15:47:41 EST 2012
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 <yinghai at kernel.org>
---
kexec/arch/i386/kexec-bzImage.c | 15 +++++++++++++++
1 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/kexec/arch/i386/kexec-bzImage.c b/kexec/arch/i386/kexec-bzImage.c
index 6998587..80d09e7 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,8 @@ 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);
if (info->kexec_flags & (KEXEC_ON_CRASH | KEXEC_PRESERVE_CONTEXT)) {
/* If using bzImage for capture kernel, then we will not be
--
1.7.7
More information about the kexec
mailing list