Lines Matching full:image

144 static struct page *kimage_alloc_page(struct kimage *image,
148 int sanity_check_segment_list(struct kimage *image) in sanity_check_segment_list() argument
151 unsigned long nr_segments = image->nr_segments; in sanity_check_segment_list()
158 * the new image into invalid or reserved areas of RAM. This in sanity_check_segment_list()
171 mstart = image->segment[i].mem; in sanity_check_segment_list()
172 mend = mstart + image->segment[i].memsz; in sanity_check_segment_list()
190 mstart = image->segment[i].mem; in sanity_check_segment_list()
191 mend = mstart + image->segment[i].memsz; in sanity_check_segment_list()
195 pstart = image->segment[j].mem; in sanity_check_segment_list()
196 pend = pstart + image->segment[j].memsz; in sanity_check_segment_list()
209 if (image->segment[i].bufsz > image->segment[i].memsz) in sanity_check_segment_list()
219 if (PAGE_COUNT(image->segment[i].memsz) > nr_pages / 2) in sanity_check_segment_list()
222 total_pages += PAGE_COUNT(image->segment[i].memsz); in sanity_check_segment_list()
231 * attempt to load the new image into invalid or reserved in sanity_check_segment_list()
238 if (image->type == KEXEC_TYPE_CRASH) { in sanity_check_segment_list()
242 mstart = image->segment[i].mem; in sanity_check_segment_list()
243 mend = mstart + image->segment[i].memsz - 1; in sanity_check_segment_list()
256 struct kimage *image; in do_kimage_alloc_init() local
259 image = kzalloc(sizeof(*image), GFP_KERNEL); in do_kimage_alloc_init()
260 if (!image) in do_kimage_alloc_init()
263 image->head = 0; in do_kimage_alloc_init()
264 image->entry = &image->head; in do_kimage_alloc_init()
265 image->last_entry = &image->head; in do_kimage_alloc_init()
266 image->control_page = ~0; /* By default this does not apply */ in do_kimage_alloc_init()
267 image->type = KEXEC_TYPE_DEFAULT; in do_kimage_alloc_init()
270 INIT_LIST_HEAD(&image->control_pages); in do_kimage_alloc_init()
273 INIT_LIST_HEAD(&image->dest_pages); in do_kimage_alloc_init()
276 INIT_LIST_HEAD(&image->unusable_pages); in do_kimage_alloc_init()
278 return image; in do_kimage_alloc_init()
281 int kimage_is_destination_range(struct kimage *image, in kimage_is_destination_range() argument
287 for (i = 0; i < image->nr_segments; i++) { in kimage_is_destination_range()
290 mstart = image->segment[i].mem; in kimage_is_destination_range()
291 mend = mstart + image->segment[i].memsz; in kimage_is_destination_range()
350 static struct page *kimage_alloc_normal_control_pages(struct kimage *image, in kimage_alloc_normal_control_pages() argument
364 * At worst this runs in O(N) of the image size. in kimage_alloc_normal_control_pages()
387 kimage_is_destination_range(image, addr, eaddr)) { in kimage_alloc_normal_control_pages()
395 list_add(&pages->lru, &image->control_pages); in kimage_alloc_normal_control_pages()
401 * to give it an entry in image->segment[]. in kimage_alloc_normal_control_pages()
407 * page allocations, and add everything to image->dest_pages. in kimage_alloc_normal_control_pages()
416 static struct page *kimage_alloc_crash_control_pages(struct kimage *image, in kimage_alloc_crash_control_pages() argument
445 hole_start = (image->control_page + (size - 1)) & ~(size - 1); in kimage_alloc_crash_control_pages()
455 for (i = 0; i < image->nr_segments; i++) { in kimage_alloc_crash_control_pages()
458 mstart = image->segment[i].mem; in kimage_alloc_crash_control_pages()
459 mend = mstart + image->segment[i].memsz - 1; in kimage_alloc_crash_control_pages()
468 if (i == image->nr_segments) { in kimage_alloc_crash_control_pages()
470 image->control_page = hole_end; in kimage_alloc_crash_control_pages()
483 struct page *kimage_alloc_control_pages(struct kimage *image, in kimage_alloc_control_pages() argument
488 switch (image->type) { in kimage_alloc_control_pages()
490 pages = kimage_alloc_normal_control_pages(image, order); in kimage_alloc_control_pages()
493 pages = kimage_alloc_crash_control_pages(image, order); in kimage_alloc_control_pages()
500 int kimage_crash_copy_vmcoreinfo(struct kimage *image) in kimage_crash_copy_vmcoreinfo() argument
505 if (image->type != KEXEC_TYPE_CRASH) in kimage_crash_copy_vmcoreinfo()
517 vmcoreinfo_page = kimage_alloc_control_pages(image, 0); in kimage_crash_copy_vmcoreinfo()
528 image->vmcoreinfo_data_copy = safecopy; in kimage_crash_copy_vmcoreinfo()
534 static int kimage_add_entry(struct kimage *image, kimage_entry_t entry) in kimage_add_entry() argument
536 if (*image->entry != 0) in kimage_add_entry()
537 image->entry++; in kimage_add_entry()
539 if (image->entry == image->last_entry) { in kimage_add_entry()
543 page = kimage_alloc_page(image, GFP_KERNEL, KIMAGE_NO_DEST); in kimage_add_entry()
548 *image->entry = virt_to_boot_phys(ind_page) | IND_INDIRECTION; in kimage_add_entry()
549 image->entry = ind_page; in kimage_add_entry()
550 image->last_entry = ind_page + in kimage_add_entry()
553 *image->entry = entry; in kimage_add_entry()
554 image->entry++; in kimage_add_entry()
555 *image->entry = 0; in kimage_add_entry()
560 static int kimage_set_destination(struct kimage *image, in kimage_set_destination() argument
566 result = kimage_add_entry(image, destination | IND_DESTINATION); in kimage_set_destination()
572 static int kimage_add_page(struct kimage *image, unsigned long page) in kimage_add_page() argument
577 result = kimage_add_entry(image, page | IND_SOURCE); in kimage_add_page()
583 static void kimage_free_extra_pages(struct kimage *image) in kimage_free_extra_pages() argument
586 kimage_free_page_list(&image->dest_pages); in kimage_free_extra_pages()
589 kimage_free_page_list(&image->unusable_pages); in kimage_free_extra_pages()
593 int __weak machine_kexec_post_load(struct kimage *image) in machine_kexec_post_load() argument
598 void kimage_terminate(struct kimage *image) in kimage_terminate() argument
600 if (*image->entry != 0) in kimage_terminate()
601 image->entry++; in kimage_terminate()
603 *image->entry = IND_DONE; in kimage_terminate()
606 #define for_each_kimage_entry(image, ptr, entry) \ argument
607 for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
619 void kimage_free(struct kimage *image) in kimage_free() argument
624 if (!image) in kimage_free()
627 if (image->vmcoreinfo_data_copy) { in kimage_free()
629 vunmap(image->vmcoreinfo_data_copy); in kimage_free()
632 kimage_free_extra_pages(image); in kimage_free()
633 for_each_kimage_entry(image, ptr, entry) { in kimage_free()
650 machine_kexec_cleanup(image); in kimage_free()
653 kimage_free_page_list(&image->control_pages); in kimage_free()
659 if (image->file_mode) in kimage_free()
660 kimage_file_post_load_cleanup(image); in kimage_free()
662 kfree(image); in kimage_free()
665 static kimage_entry_t *kimage_dst_used(struct kimage *image, in kimage_dst_used() argument
671 for_each_kimage_entry(image, ptr, entry) { in kimage_dst_used()
684 static struct page *kimage_alloc_page(struct kimage *image, in kimage_alloc_page() argument
713 list_for_each_entry(page, &image->dest_pages, lru) { in kimage_alloc_page()
731 list_add(&page->lru, &image->unusable_pages); in kimage_alloc_page()
741 if (!kimage_is_destination_range(image, addr, in kimage_alloc_page()
750 old = kimage_dst_used(image, addr); in kimage_alloc_page()
775 list_add(&page->lru, &image->dest_pages); in kimage_alloc_page()
781 static int kimage_load_normal_segment(struct kimage *image, in kimage_load_normal_segment() argument
791 if (image->file_mode) in kimage_load_normal_segment()
799 result = kimage_set_destination(image, maddr); in kimage_load_normal_segment()
808 page = kimage_alloc_page(image, GFP_HIGHUSER, maddr); in kimage_load_normal_segment()
813 result = kimage_add_page(image, page_to_boot_pfn(page) in kimage_load_normal_segment()
827 if (image->file_mode) in kimage_load_normal_segment()
838 if (image->file_mode) in kimage_load_normal_segment()
850 static int kimage_load_crash_segment(struct kimage *image, in kimage_load_crash_segment() argument
864 if (image->file_mode) in kimage_load_crash_segment()
893 if (image->file_mode) in kimage_load_crash_segment()
906 if (image->file_mode) in kimage_load_crash_segment()
918 int kimage_load_segment(struct kimage *image, in kimage_load_segment() argument
923 switch (image->type) { in kimage_load_segment()
925 result = kimage_load_normal_segment(image, segment); in kimage_load_segment()
928 result = kimage_load_crash_segment(image, segment); in kimage_load_segment()