kexec: support for kexec on panic using new system call
This patch adds support for loading a kexec on panic (kdump) kernel usning new system call. It prepares ELF headers for memory areas to be dumped and for saved cpu registers. Also prepares the memory map for second kernel and limits its boot to reserved areas only. Signed-off-by: Vivek Goyal <vgoyal@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Michael Kerrisk <mtk.manpages@gmail.com> Cc: Yinghai Lu <yinghai@kernel.org> Cc: Eric Biederman <ebiederm@xmission.com> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Matthew Garrett <mjg59@srcf.ucam.org> Cc: Greg Kroah-Hartman <greg@kroah.com> Cc: Dave Young <dyoung@redhat.com> Cc: WANG Chao <chaowang@redhat.com> Cc: Baoquan He <bhe@redhat.com> Cc: Andy Lutomirski <luto@amacapital.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:

committed by
Linus Torvalds

parent
27f48d3e63
commit
dd5f726076
@@ -178,6 +178,38 @@ static void load_segments(void)
|
||||
);
|
||||
}
|
||||
|
||||
/* Update purgatory as needed after various image segments have been prepared */
|
||||
static int arch_update_purgatory(struct kimage *image)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
if (!image->file_mode)
|
||||
return 0;
|
||||
|
||||
/* Setup copying of backup region */
|
||||
if (image->type == KEXEC_TYPE_CRASH) {
|
||||
ret = kexec_purgatory_get_set_symbol(image, "backup_dest",
|
||||
&image->arch.backup_load_addr,
|
||||
sizeof(image->arch.backup_load_addr), 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = kexec_purgatory_get_set_symbol(image, "backup_src",
|
||||
&image->arch.backup_src_start,
|
||||
sizeof(image->arch.backup_src_start), 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = kexec_purgatory_get_set_symbol(image, "backup_sz",
|
||||
&image->arch.backup_src_sz,
|
||||
sizeof(image->arch.backup_src_sz), 0);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int machine_kexec_prepare(struct kimage *image)
|
||||
{
|
||||
unsigned long start_pgtable;
|
||||
@@ -191,6 +223,11 @@ int machine_kexec_prepare(struct kimage *image)
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
/* update purgatory as needed */
|
||||
result = arch_update_purgatory(image);
|
||||
if (result)
|
||||
return result;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -315,6 +352,9 @@ int arch_kexec_kernel_image_probe(struct kimage *image, void *buf,
|
||||
|
||||
void *arch_kexec_kernel_image_load(struct kimage *image)
|
||||
{
|
||||
vfree(image->arch.elf_headers);
|
||||
image->arch.elf_headers = NULL;
|
||||
|
||||
if (!image->fops || !image->fops->load)
|
||||
return ERR_PTR(-ENOEXEC);
|
||||
|
||||
|
Reference in New Issue
Block a user