diff options
Diffstat (limited to 'kernel/kexec.c')
-rw-r--r-- | kernel/kexec.c | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/kernel/kexec.c b/kernel/kexec.c index 9a8a01abbaed..38c25b1f2fd5 100644 --- a/kernel/kexec.c +++ b/kernel/kexec.c | |||
@@ -444,7 +444,7 @@ arch_kexec_apply_relocations(const Elf_Ehdr *ehdr, Elf_Shdr *sechdrs, | |||
444 | } | 444 | } |
445 | 445 | ||
446 | /* | 446 | /* |
447 | * Free up memory used by kernel, initrd, and comand line. This is temporary | 447 | * Free up memory used by kernel, initrd, and command line. This is temporary |
448 | * memory allocation which is not needed any more after these buffers have | 448 | * memory allocation which is not needed any more after these buffers have |
449 | * been loaded into separate segments and have been copied elsewhere. | 449 | * been loaded into separate segments and have been copied elsewhere. |
450 | */ | 450 | */ |
@@ -856,8 +856,6 @@ static int kimage_set_destination(struct kimage *image, | |||
856 | 856 | ||
857 | destination &= PAGE_MASK; | 857 | destination &= PAGE_MASK; |
858 | result = kimage_add_entry(image, destination | IND_DESTINATION); | 858 | result = kimage_add_entry(image, destination | IND_DESTINATION); |
859 | if (result == 0) | ||
860 | image->destination = destination; | ||
861 | 859 | ||
862 | return result; | 860 | return result; |
863 | } | 861 | } |
@@ -869,8 +867,6 @@ static int kimage_add_page(struct kimage *image, unsigned long page) | |||
869 | 867 | ||
870 | page &= PAGE_MASK; | 868 | page &= PAGE_MASK; |
871 | result = kimage_add_entry(image, page | IND_SOURCE); | 869 | result = kimage_add_entry(image, page | IND_SOURCE); |
872 | if (result == 0) | ||
873 | image->destination += PAGE_SIZE; | ||
874 | 870 | ||
875 | return result; | 871 | return result; |
876 | } | 872 | } |
@@ -1288,19 +1284,22 @@ SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments, | |||
1288 | if (nr_segments > 0) { | 1284 | if (nr_segments > 0) { |
1289 | unsigned long i; | 1285 | unsigned long i; |
1290 | 1286 | ||
1291 | /* Loading another kernel to reboot into */ | 1287 | if (flags & KEXEC_ON_CRASH) { |
1292 | if ((flags & KEXEC_ON_CRASH) == 0) | 1288 | /* |
1293 | result = kimage_alloc_init(&image, entry, nr_segments, | 1289 | * Loading another kernel to switch to if this one |
1294 | segments, flags); | 1290 | * crashes. Free any current crash dump kernel before |
1295 | /* Loading another kernel to switch to if this one crashes */ | ||
1296 | else if (flags & KEXEC_ON_CRASH) { | ||
1297 | /* Free any current crash dump kernel before | ||
1298 | * we corrupt it. | 1291 | * we corrupt it. |
1299 | */ | 1292 | */ |
1293 | |||
1300 | kimage_free(xchg(&kexec_crash_image, NULL)); | 1294 | kimage_free(xchg(&kexec_crash_image, NULL)); |
1301 | result = kimage_alloc_init(&image, entry, nr_segments, | 1295 | result = kimage_alloc_init(&image, entry, nr_segments, |
1302 | segments, flags); | 1296 | segments, flags); |
1303 | crash_map_reserved_pages(); | 1297 | crash_map_reserved_pages(); |
1298 | } else { | ||
1299 | /* Loading another kernel to reboot into. */ | ||
1300 | |||
1301 | result = kimage_alloc_init(&image, entry, nr_segments, | ||
1302 | segments, flags); | ||
1304 | } | 1303 | } |
1305 | if (result) | 1304 | if (result) |
1306 | goto out; | 1305 | goto out; |
@@ -2512,7 +2511,7 @@ static int kexec_apply_relocations(struct kimage *image) | |||
2512 | continue; | 2511 | continue; |
2513 | 2512 | ||
2514 | /* | 2513 | /* |
2515 | * Respective archicture needs to provide support for applying | 2514 | * Respective architecture needs to provide support for applying |
2516 | * relocations of type SHT_RELA/SHT_REL. | 2515 | * relocations of type SHT_RELA/SHT_REL. |
2517 | */ | 2516 | */ |
2518 | if (sechdrs[i].sh_type == SHT_RELA) | 2517 | if (sechdrs[i].sh_type == SHT_RELA) |