Lines Matching full:image

107 static struct page *kimage_alloc_page(struct kimage *image,
111 int sanity_check_segment_list(struct kimage *image) in sanity_check_segment_list() argument
114 unsigned long nr_segments = image->nr_segments; in sanity_check_segment_list()
121 * the new image into invalid or reserved areas of RAM. This in sanity_check_segment_list()
134 mstart = image->segment[i].mem; in sanity_check_segment_list()
135 mend = mstart + image->segment[i].memsz; in sanity_check_segment_list()
153 mstart = image->segment[i].mem; in sanity_check_segment_list()
154 mend = mstart + image->segment[i].memsz; in sanity_check_segment_list()
158 pstart = image->segment[j].mem; in sanity_check_segment_list()
159 pend = pstart + image->segment[j].memsz; in sanity_check_segment_list()
172 if (image->segment[i].bufsz > image->segment[i].memsz) in sanity_check_segment_list()
182 if (PAGE_COUNT(image->segment[i].memsz) > nr_pages / 2) in sanity_check_segment_list()
185 total_pages += PAGE_COUNT(image->segment[i].memsz); in sanity_check_segment_list()
195 * attempt to load the new image into invalid or reserved in sanity_check_segment_list()
202 if (image->type == KEXEC_TYPE_CRASH) { in sanity_check_segment_list()
206 mstart = image->segment[i].mem; in sanity_check_segment_list()
207 mend = mstart + image->segment[i].memsz - 1; in sanity_check_segment_list()
224 accept_memory(image->segment[i].mem, image->segment[i].memsz); in sanity_check_segment_list()
231 struct kimage *image; in do_kimage_alloc_init() local
234 image = kzalloc_obj(*image); in do_kimage_alloc_init()
235 if (!image) in do_kimage_alloc_init()
238 image->entry = &image->head; in do_kimage_alloc_init()
239 image->last_entry = &image->head; in do_kimage_alloc_init()
240 image->control_page = ~0; /* By default this does not apply */ in do_kimage_alloc_init()
241 image->type = KEXEC_TYPE_DEFAULT; in do_kimage_alloc_init()
244 INIT_LIST_HEAD(&image->control_pages); in do_kimage_alloc_init()
247 INIT_LIST_HEAD(&image->dest_pages); in do_kimage_alloc_init()
250 INIT_LIST_HEAD(&image->unusable_pages); in do_kimage_alloc_init()
253 image->hp_action = KEXEC_CRASH_HP_NONE; in do_kimage_alloc_init()
254 image->elfcorehdr_index = -1; in do_kimage_alloc_init()
255 image->elfcorehdr_updated = false; in do_kimage_alloc_init()
258 return image; in do_kimage_alloc_init()
261 int kimage_is_destination_range(struct kimage *image, in kimage_is_destination_range() argument
267 for (i = 0; i < image->nr_segments; i++) { in kimage_is_destination_range()
270 mstart = image->segment[i].mem; in kimage_is_destination_range()
271 mend = mstart + image->segment[i].memsz - 1; in kimage_is_destination_range()
330 static struct page *kimage_alloc_normal_control_pages(struct kimage *image, in kimage_alloc_normal_control_pages() argument
344 * At worst this runs in O(N) of the image size. in kimage_alloc_normal_control_pages()
367 kimage_is_destination_range(image, addr, eaddr)) { in kimage_alloc_normal_control_pages()
375 list_add(&pages->lru, &image->control_pages); in kimage_alloc_normal_control_pages()
381 * to give it an entry in image->segment[]. in kimage_alloc_normal_control_pages()
387 * page allocations, and add everything to image->dest_pages. in kimage_alloc_normal_control_pages()
397 static struct page *kimage_alloc_crash_control_pages(struct kimage *image, in kimage_alloc_crash_control_pages() argument
426 hole_start = ALIGN(image->control_page, size); in kimage_alloc_crash_control_pages()
436 for (i = 0; i < image->nr_segments; i++) { in kimage_alloc_crash_control_pages()
439 mstart = image->segment[i].mem; in kimage_alloc_crash_control_pages()
440 mend = mstart + image->segment[i].memsz - 1; in kimage_alloc_crash_control_pages()
449 if (i == image->nr_segments) { in kimage_alloc_crash_control_pages()
451 image->control_page = hole_end + 1; in kimage_alloc_crash_control_pages()
465 struct page *kimage_alloc_control_pages(struct kimage *image, in kimage_alloc_control_pages() argument
470 switch (image->type) { in kimage_alloc_control_pages()
472 pages = kimage_alloc_normal_control_pages(image, order); in kimage_alloc_control_pages()
476 pages = kimage_alloc_crash_control_pages(image, order); in kimage_alloc_control_pages()
484 static int kimage_add_entry(struct kimage *image, kimage_entry_t entry) in kimage_add_entry() argument
486 if (*image->entry != 0) in kimage_add_entry()
487 image->entry++; in kimage_add_entry()
489 if (image->entry == image->last_entry) { in kimage_add_entry()
493 page = kimage_alloc_page(image, GFP_KERNEL, KIMAGE_NO_DEST); in kimage_add_entry()
498 *image->entry = virt_to_boot_phys(ind_page) | IND_INDIRECTION; in kimage_add_entry()
499 image->entry = ind_page; in kimage_add_entry()
500 image->last_entry = ind_page + in kimage_add_entry()
503 *image->entry = entry; in kimage_add_entry()
504 image->entry++; in kimage_add_entry()
505 *image->entry = 0; in kimage_add_entry()
510 static int kimage_set_destination(struct kimage *image, in kimage_set_destination() argument
515 return kimage_add_entry(image, destination | IND_DESTINATION); in kimage_set_destination()
519 static int kimage_add_page(struct kimage *image, unsigned long page) in kimage_add_page() argument
523 return kimage_add_entry(image, page | IND_SOURCE); in kimage_add_page()
527 static void kimage_free_extra_pages(struct kimage *image) in kimage_free_extra_pages() argument
530 kimage_free_page_list(&image->dest_pages); in kimage_free_extra_pages()
533 kimage_free_page_list(&image->unusable_pages); in kimage_free_extra_pages()
537 void kimage_terminate(struct kimage *image) in kimage_terminate() argument
539 if (*image->entry != 0) in kimage_terminate()
540 image->entry++; in kimage_terminate()
542 *image->entry = IND_DONE; in kimage_terminate()
545 #define for_each_kimage_entry(image, ptr, entry) \ argument
546 for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
558 static void kimage_free_cma(struct kimage *image) in kimage_free_cma() argument
562 for (i = 0; i < image->nr_segments; i++) { in kimage_free_cma()
563 struct page *cma = image->segment_cma[i]; in kimage_free_cma()
564 u32 nr_pages = image->segment[i].memsz >> PAGE_SHIFT; in kimage_free_cma()
571 image->segment_cma[i] = NULL; in kimage_free_cma()
576 void kimage_free(struct kimage *image) in kimage_free() argument
581 if (!image) in kimage_free()
585 if (image->vmcoreinfo_data_copy) { in kimage_free()
587 vunmap(image->vmcoreinfo_data_copy); in kimage_free()
591 kimage_free_extra_pages(image); in kimage_free()
592 for_each_kimage_entry(image, ptr, entry) { in kimage_free()
609 machine_kexec_cleanup(image); in kimage_free()
612 kimage_free_page_list(&image->control_pages); in kimage_free()
615 kimage_free_cma(image); in kimage_free()
621 if (image->file_mode) in kimage_free()
622 kimage_file_post_load_cleanup(image); in kimage_free()
624 kfree(image); in kimage_free()
627 static kimage_entry_t *kimage_dst_used(struct kimage *image, in kimage_dst_used() argument
633 for_each_kimage_entry(image, ptr, entry) { in kimage_dst_used()
646 static struct page *kimage_alloc_page(struct kimage *image, in kimage_alloc_page() argument
675 list_for_each_entry(page, &image->dest_pages, lru) { in kimage_alloc_page()
693 list_add(&page->lru, &image->unusable_pages); in kimage_alloc_page()
703 if (!kimage_is_destination_range(image, addr, in kimage_alloc_page()
712 old = kimage_dst_used(image, addr); in kimage_alloc_page()
736 list_add(&page->lru, &image->dest_pages); in kimage_alloc_page()
742 static int kimage_load_cma_segment(struct kimage *image, int idx) in kimage_load_cma_segment() argument
744 struct kexec_segment *segment = &image->segment[idx]; in kimage_load_cma_segment()
745 struct page *cma = image->segment_cma[idx]; in kimage_load_cma_segment()
752 if (image->file_mode) in kimage_load_cma_segment()
768 if (image->file_mode) in kimage_load_cma_segment()
773 if (image->file_mode) in kimage_load_cma_segment()
797 static int kimage_load_normal_segment(struct kimage *image, int idx) in kimage_load_normal_segment() argument
799 struct kexec_segment *segment = &image->segment[idx]; in kimage_load_normal_segment()
806 if (image->file_mode) in kimage_load_normal_segment()
814 if (image->segment_cma[idx]) in kimage_load_normal_segment()
815 return kimage_load_cma_segment(image, idx); in kimage_load_normal_segment()
817 result = kimage_set_destination(image, maddr); in kimage_load_normal_segment()
826 page = kimage_alloc_page(image, GFP_HIGHUSER, maddr); in kimage_load_normal_segment()
831 result = kimage_add_page(image, page_to_boot_pfn(page) in kimage_load_normal_segment()
844 if (image->file_mode) in kimage_load_normal_segment()
849 if (image->file_mode) in kimage_load_normal_segment()
869 static int kimage_load_crash_segment(struct kimage *image, int idx) in kimage_load_crash_segment() argument
875 struct kexec_segment *segment = &image->segment[idx]; in kimage_load_crash_segment()
883 if (image->file_mode) in kimage_load_crash_segment()
911 if (image->file_mode) in kimage_load_crash_segment()
916 if (image->file_mode) in kimage_load_crash_segment()
938 int kimage_load_segment(struct kimage *image, int idx) in kimage_load_segment() argument
942 switch (image->type) { in kimage_load_segment()
944 result = kimage_load_normal_segment(image, idx); in kimage_load_segment()
948 result = kimage_load_crash_segment(image, idx); in kimage_load_segment()
956 void *kimage_map_segment(struct kimage *image, int idx) in kimage_map_segment() argument
967 cma = image->segment_cma[idx]; in kimage_map_segment()
971 addr = image->segment[idx].mem; in kimage_map_segment()
972 size = image->segment[idx].memsz; in kimage_map_segment()
985 for_each_kimage_entry(image, ptr, entry) { in kimage_map_segment()
1158 * before creating an image and before jumping from the in kernel_kexec()
1159 * restore kernel to the image one, so it uses the same in kernel_kexec()
1213 * creating an image and after the image kernel has got control in kernel_kexec()