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) |
