Lines Matching +full:- +full:- +full:-

10  * See the COPYING file in the top-level directory.
24 #include "qapi/qapi-commands-dump.h"
25 #include "qapi/qapi-events-dump.h"
27 #include "qemu/error-report.h"
28 #include "qemu/main-loop.h"
40 #include <snappy-c.h>
57 return s->dump_info.d_class == ELFCLASS64; in dump_is_64bit()
62 return s->filter_area_length > 0; in dump_has_filter()
67 if (s->dump_info.d_endian == ELFDATA2LSB) { in cpu_to_dump16()
78 if (s->dump_info.d_endian == ELFDATA2LSB) { in cpu_to_dump32()
89 if (s->dump_info.d_endian == ELFDATA2LSB) { in cpu_to_dump64()
100 if (s->dump_info.arch_cleanup_fn) { in dump_cleanup()
101 s->dump_info.arch_cleanup_fn(s); in dump_cleanup()
104 guest_phys_blocks_free(&s->guest_phys_blocks); in dump_cleanup()
105 memory_mapping_list_free(&s->list); in dump_cleanup()
106 close(s->fd); in dump_cleanup()
107 g_free(s->guest_note); in dump_cleanup()
108 g_clear_pointer(&s->string_table_buf, g_array_unref); in dump_cleanup()
109 s->guest_note = NULL; in dump_cleanup()
110 if (s->resume) { in dump_cleanup()
111 if (s->detached) { in dump_cleanup()
115 if (s->detached) { in dump_cleanup()
129 written_size = qemu_write_full(s->fd, buf, size); in fd_write_vmcore()
131 return -errno; in fd_write_vmcore()
144 uint16_t phnum = MIN(s->phdr_num, PN_XNUM); in prepare_elf64_header()
148 elf_header->e_ident[EI_CLASS] = ELFCLASS64; in prepare_elf64_header()
149 elf_header->e_ident[EI_DATA] = s->dump_info.d_endian; in prepare_elf64_header()
150 elf_header->e_ident[EI_VERSION] = EV_CURRENT; in prepare_elf64_header()
151 elf_header->e_type = cpu_to_dump16(s, ET_CORE); in prepare_elf64_header()
152 elf_header->e_machine = cpu_to_dump16(s, s->dump_info.d_machine); in prepare_elf64_header()
153 elf_header->e_version = cpu_to_dump32(s, EV_CURRENT); in prepare_elf64_header()
154 elf_header->e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); in prepare_elf64_header()
155 elf_header->e_phoff = cpu_to_dump64(s, s->phdr_offset); in prepare_elf64_header()
156 elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf64_Phdr)); in prepare_elf64_header()
157 elf_header->e_phnum = cpu_to_dump16(s, phnum); in prepare_elf64_header()
158 elf_header->e_shoff = cpu_to_dump64(s, s->shdr_offset); in prepare_elf64_header()
159 elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf64_Shdr)); in prepare_elf64_header()
160 elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num); in prepare_elf64_header()
161 elf_header->e_shstrndx = cpu_to_dump16(s, s->shdr_num - 1); in prepare_elf64_header()
171 uint16_t phnum = MIN(s->phdr_num, PN_XNUM); in prepare_elf32_header()
175 elf_header->e_ident[EI_CLASS] = ELFCLASS32; in prepare_elf32_header()
176 elf_header->e_ident[EI_DATA] = s->dump_info.d_endian; in prepare_elf32_header()
177 elf_header->e_ident[EI_VERSION] = EV_CURRENT; in prepare_elf32_header()
178 elf_header->e_type = cpu_to_dump16(s, ET_CORE); in prepare_elf32_header()
179 elf_header->e_machine = cpu_to_dump16(s, s->dump_info.d_machine); in prepare_elf32_header()
180 elf_header->e_version = cpu_to_dump32(s, EV_CURRENT); in prepare_elf32_header()
181 elf_header->e_ehsize = cpu_to_dump16(s, sizeof(elf_header)); in prepare_elf32_header()
182 elf_header->e_phoff = cpu_to_dump32(s, s->phdr_offset); in prepare_elf32_header()
183 elf_header->e_phentsize = cpu_to_dump16(s, sizeof(Elf32_Phdr)); in prepare_elf32_header()
184 elf_header->e_phnum = cpu_to_dump16(s, phnum); in prepare_elf32_header()
185 elf_header->e_shoff = cpu_to_dump32(s, s->shdr_offset); in prepare_elf32_header()
186 elf_header->e_shentsize = cpu_to_dump16(s, sizeof(Elf32_Shdr)); in prepare_elf32_header()
187 elf_header->e_shnum = cpu_to_dump16(s, s->shdr_num); in prepare_elf32_header()
188 elf_header->e_shstrndx = cpu_to_dump16(s, s->shdr_num - 1); in prepare_elf32_header()
200 assert(s->shdr_num >= 2); in write_elf_header()
213 error_setg_errno(errp, -ret, "dump: failed to write elf header"); in write_elf_header()
227 phdr.p_paddr = cpu_to_dump64(s, memory_mapping->phys_addr); in write_elf64_load()
229 phdr.p_memsz = cpu_to_dump64(s, memory_mapping->length); in write_elf64_load()
230 phdr.p_vaddr = cpu_to_dump64(s, memory_mapping->virt_addr) ?: phdr.p_paddr; in write_elf64_load()
232 assert(memory_mapping->length >= filesz); in write_elf64_load()
236 error_setg_errno(errp, -ret, in write_elf64_load()
251 phdr.p_paddr = cpu_to_dump32(s, memory_mapping->phys_addr); in write_elf32_load()
253 phdr.p_memsz = cpu_to_dump32(s, memory_mapping->length); in write_elf32_load()
255 cpu_to_dump32(s, memory_mapping->virt_addr) ?: phdr.p_paddr; in write_elf32_load()
257 assert(memory_mapping->length >= filesz); in write_elf32_load()
261 error_setg_errno(errp, -ret, in write_elf32_load()
269 phdr->p_type = cpu_to_dump32(s, PT_NOTE); in prepare_elf64_phdr_note()
270 phdr->p_offset = cpu_to_dump64(s, s->note_offset); in prepare_elf64_phdr_note()
271 phdr->p_paddr = 0; in prepare_elf64_phdr_note()
272 phdr->p_filesz = cpu_to_dump64(s, s->note_size); in prepare_elf64_phdr_note()
273 phdr->p_memsz = cpu_to_dump64(s, s->note_size); in prepare_elf64_phdr_note()
274 phdr->p_vaddr = 0; in prepare_elf64_phdr_note()
279 return cpu->cpu_index + 1; in cpu_index()
287 if (s->guest_note) { in write_guest_note()
288 ret = f(s->guest_note, s->guest_note_size, s); in write_guest_note()
325 phdr->p_type = cpu_to_dump32(s, PT_NOTE); in prepare_elf32_phdr_note()
326 phdr->p_offset = cpu_to_dump32(s, s->note_offset); in prepare_elf32_phdr_note()
327 phdr->p_paddr = 0; in prepare_elf32_phdr_note()
328 phdr->p_filesz = cpu_to_dump32(s, s->note_size); in prepare_elf32_phdr_note()
329 phdr->p_memsz = cpu_to_dump32(s, s->note_size); in prepare_elf32_phdr_note()
330 phdr->p_vaddr = 0; in prepare_elf32_phdr_note()
380 error_setg_errno(errp, -ret, in write_elf_phdr_note()
388 Elf64_Shdr *shdr64 = s->elf_section_hdrs; in prepare_elf_section_hdr_zero()
390 shdr64->sh_info = cpu_to_dump32(s, s->phdr_num); in prepare_elf_section_hdr_zero()
392 Elf32_Shdr *shdr32 = s->elf_section_hdrs; in prepare_elf_section_hdr_zero()
394 shdr32->sh_info = cpu_to_dump32(s, s->phdr_num); in prepare_elf_section_hdr_zero()
400 uint64_t index = s->string_table_buf->len; in prepare_elf_section_hdr_string()
407 g_array_append_vals(s->string_table_buf, strtab, sizeof(strtab)); in prepare_elf_section_hdr_string()
411 shdr64.sh_offset = s->section_offset + s->elf_section_data_size; in prepare_elf_section_hdr_string()
413 shdr64.sh_size = s->string_table_buf->len; in prepare_elf_section_hdr_string()
418 shdr32.sh_offset = s->section_offset + s->elf_section_data_size; in prepare_elf_section_hdr_string()
420 shdr32.sh_size = s->string_table_buf->len; in prepare_elf_section_hdr_string()
433 * - HDR zero in prepare_elf_section_hdrs()
434 * - Arch section hdrs in prepare_elf_section_hdrs()
435 * - String table hdr in prepare_elf_section_hdrs()
438 len = sizeof_shdr * s->shdr_num; in prepare_elf_section_hdrs()
439 s->elf_section_hdrs = g_malloc0(len); in prepare_elf_section_hdrs()
440 buff_hdr = s->elf_section_hdrs; in prepare_elf_section_hdrs()
453 if (s->phdr_num >= PN_XNUM) { in prepare_elf_section_hdrs()
459 if (s->dump_info.arch_sections_write_hdr_fn in prepare_elf_section_hdrs()
460 && s->shdr_num > 2) { in prepare_elf_section_hdrs()
461 buff_hdr += s->dump_info.arch_sections_write_hdr_fn(s, buff_hdr); in prepare_elf_section_hdrs()
463 if (s->shdr_num >= SHN_LORESERVE) { in prepare_elf_section_hdrs()
487 ret = fd_write_vmcore(s->elf_section_hdrs, s->shdr_num * sizeof_shdr, s); in write_elf_section_headers()
489 error_setg_errno(errp, -ret, "dump: failed to write section headers"); in write_elf_section_headers()
492 g_free(s->elf_section_hdrs); in write_elf_section_headers()
499 if (s->elf_section_data_size) { in write_elf_sections()
501 ret = fd_write_vmcore(s->elf_section_data, in write_elf_sections()
502 s->elf_section_data_size, s); in write_elf_sections()
504 error_setg_errno(errp, -ret, in write_elf_sections()
511 ret = fd_write_vmcore(s->string_table_buf->data, in write_elf_sections()
512 s->string_table_buf->len, s); in write_elf_sections()
514 error_setg_errno(errp, -ret, "dump: failed to write string table data"); in write_elf_sections()
524 error_setg_errno(errp, -ret, "dump: failed to save memory"); in write_data()
526 s->written_size += length; in write_data()
537 for (i = 0; i < size / s->dump_info.page_size; i++) { in write_memory()
538 write_data(s, block->host_addr + start + i * s->dump_info.page_size, in write_memory()
539 s->dump_info.page_size, errp); in write_memory()
545 if ((size % s->dump_info.page_size) != 0) { in write_memory()
546 write_data(s, block->host_addr + start + i * s->dump_info.page_size, in write_memory()
547 size % s->dump_info.page_size, errp); in write_memory()
562 hwaddr offset = s->memory_offset; in get_offset_range()
565 /* When the memory is not stored into vmcore, offset will be -1 */ in get_offset_range()
566 *p_offset = -1; in get_offset_range()
570 if (phys_addr < s->filter_area_begin || in get_offset_range()
571 phys_addr >= s->filter_area_begin + s->filter_area_length) { in get_offset_range()
576 QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) { in get_offset_range()
578 if (!ranges_overlap(block->target_start, in get_offset_range()
579 block->target_end - block->target_start, in get_offset_range()
580 s->filter_area_begin, in get_offset_range()
581 s->filter_area_length)) { in get_offset_range()
586 if (s->filter_area_begin <= block->target_start) { in get_offset_range()
587 start = block->target_start; in get_offset_range()
589 start = s->filter_area_begin; in get_offset_range()
592 size_in_block = block->target_end - start; in get_offset_range()
593 if (s->filter_area_begin + s->filter_area_length < block->target_end) { in get_offset_range()
594 size_in_block -= block->target_end - (s->filter_area_begin + s->filter_area_length); in get_offset_range()
597 start = block->target_start; in get_offset_range()
598 size_in_block = block->target_end - block->target_start; in get_offset_range()
602 *p_offset = phys_addr - start + offset; in get_offset_range()
606 * zero-filled in memory at load time; see in get_offset_range()
611 size_in_block - (phys_addr - start); in get_offset_range()
626 QTAILQ_FOREACH(memory_mapping, &s->list.head, next) { in write_elf_phdr_loads()
627 get_offset_range(memory_mapping->phys_addr, in write_elf_phdr_loads()
628 memory_mapping->length, in write_elf_phdr_loads()
642 if (phdr_index >= s->phdr_num) { in write_elf_phdr_loads()
664 * -------------- in dump_begin()
666 * -------------- in dump_begin()
668 * -------------- in dump_begin()
670 * -------------- in dump_begin()
672 * -------------- in dump_begin()
674 * -------------- in dump_begin()
676 * -------------- in dump_begin()
678 * -------------- in dump_begin()
680 * -------------- in dump_begin()
722 return block->target_end - block->target_start; in dump_filtered_memblock_size()
726 left = MAX(filter_area_start, block->target_start); in dump_filtered_memblock_size()
727 right = MIN(filter_area_start + filter_area_length, block->target_end); in dump_filtered_memblock_size()
728 size = right - left; in dump_filtered_memblock_size()
739 /* return -1 if the block is not within filter area */ in dump_filtered_memblock_start()
740 if (!ranges_overlap(block->target_start, in dump_filtered_memblock_start()
741 block->target_end - block->target_start, in dump_filtered_memblock_start()
743 return -1; in dump_filtered_memblock_start()
746 if (filter_area_start > block->target_start) { in dump_filtered_memblock_start()
747 return filter_area_start - block->target_start; in dump_filtered_memblock_start()
761 QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) { in dump_iterate()
762 … memblock_start = dump_filtered_memblock_start(block, s->filter_area_begin, s->filter_area_length); in dump_iterate()
763 if (memblock_start == -1) { in dump_iterate()
767 … memblock_size = dump_filtered_memblock_size(block, s->filter_area_begin, s->filter_area_length); in dump_iterate()
781 if (s->elf_section_data_size) { in dump_end()
782 s->elf_section_data = g_malloc0(s->elf_section_data_size); in dump_end()
785 /* Adds the architecture defined section data to s->elf_section_data */ in dump_end()
786 if (s->dump_info.arch_sections_write_fn && in dump_end()
787 s->elf_section_data_size) { in dump_end()
788 rc = s->dump_info.arch_sections_write_fn(s, s->elf_section_data); in dump_end()
792 g_free(s->elf_section_data); in dump_end()
825 if (s->kdump_raw) { in write_start_flat_header()
832 memcpy(mh->signature, MAKEDUMPFILE_SIGNATURE, in write_start_flat_header()
833 MIN(sizeof mh->signature, sizeof MAKEDUMPFILE_SIGNATURE)); in write_start_flat_header()
835 mh->type = cpu_to_be64(TYPE_FLAT_HEADER); in write_start_flat_header()
836 mh->version = cpu_to_be64(VERSION_FLAT_HEADER); in write_start_flat_header()
839 written_size = qemu_write_full(s->fd, mh, MAX_SIZE_MDF_HEADER); in write_start_flat_header()
841 ret = -1; in write_start_flat_header()
852 if (s->kdump_raw) { in write_end_flat_header()
860 written_size = qemu_write_full(s->fd, &mdh, sizeof(mdh)); in write_end_flat_header()
862 return -1; in write_end_flat_header()
874 if (s->kdump_raw) { in write_buffer()
875 seek_loc = lseek(s->fd, offset, SEEK_SET); in write_buffer()
876 if (seek_loc == (off_t) -1) { in write_buffer()
877 return -1; in write_buffer()
883 written_size = qemu_write_full(s->fd, &mdh, sizeof(mdh)); in write_buffer()
885 return -1; in write_buffer()
889 written_size = qemu_write_full(s->fd, buf, size); in write_buffer()
891 return -1; in write_buffer()
902 if (s->note_buf_offset + size > s->note_size) { in buf_write_note()
903 return -1; in buf_write_note()
906 memcpy(s->note_buf + s->note_buf_offset, buf, size); in buf_write_note()
908 s->note_buf_offset += size; in buf_write_note()
931 name_sz = cpu_to_dump64(s, hdr->n_namesz); in get_note_sizes()
932 desc_sz = cpu_to_dump64(s, hdr->n_descsz); in get_note_sizes()
936 name_sz = cpu_to_dump32(s, hdr->n_namesz); in get_note_sizes()
937 desc_sz = cpu_to_dump32(s, hdr->n_descsz); in get_note_sizes()
976 /* write common header, the version of kdump-compressed format is 6th */ in create_header32()
980 memcpy(dh->signature, KDUMP_SIGNATURE, SIG_LEN); in create_header32()
981 dh->header_version = cpu_to_dump32(s, 6); in create_header32()
982 block_size = s->dump_info.page_size; in create_header32()
983 dh->block_size = cpu_to_dump32(s, block_size); in create_header32()
984 sub_hdr_size = sizeof(struct KdumpSubHeader32) + s->note_size; in create_header32()
986 dh->sub_hdr_size = cpu_to_dump32(s, sub_hdr_size); in create_header32()
987 /* dh->max_mapnr may be truncated, full 64bit is in kh.max_mapnr_64 */ in create_header32()
988 dh->max_mapnr = cpu_to_dump32(s, MIN(s->max_mapnr, UINT_MAX)); in create_header32()
989 dh->nr_cpus = cpu_to_dump32(s, s->nr_cpus); in create_header32()
990 bitmap_blocks = DIV_ROUND_UP(s->len_dump_bitmap, block_size) * 2; in create_header32()
991 dh->bitmap_blocks = cpu_to_dump32(s, bitmap_blocks); in create_header32()
992 strncpy(dh->utsname.machine, ELF_MACHINE_UNAME, sizeof(dh->utsname.machine)); in create_header32()
994 if (s->flag_compress & DUMP_DH_COMPRESSED_ZLIB) { in create_header32()
998 if (s->flag_compress & DUMP_DH_COMPRESSED_LZO) { in create_header32()
1003 if (s->flag_compress & DUMP_DH_COMPRESSED_SNAPPY) { in create_header32()
1007 dh->status = cpu_to_dump32(s, status); in create_header32()
1019 kh->max_mapnr_64 = cpu_to_dump64(s, s->max_mapnr); in create_header32()
1020 kh->phys_base = cpu_to_dump32(s, s->dump_info.phys_base); in create_header32()
1021 kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL); in create_header32()
1024 if (s->guest_note && in create_header32()
1025 note_name_equal(s, s->guest_note, "VMCOREINFO")) { in create_header32()
1028 get_note_sizes(s, s->guest_note, in create_header32()
1030 offset_vmcoreinfo = offset_note + s->note_size - s->guest_note_size + in create_header32()
1032 kh->offset_vmcoreinfo = cpu_to_dump64(s, offset_vmcoreinfo); in create_header32()
1033 kh->size_vmcoreinfo = cpu_to_dump32(s, size_vmcoreinfo_desc); in create_header32()
1036 kh->offset_note = cpu_to_dump64(s, offset_note); in create_header32()
1037 kh->note_size = cpu_to_dump32(s, s->note_size); in create_header32()
1046 s->note_buf = g_malloc0(s->note_size); in create_header32()
1047 s->note_buf_offset = 0; in create_header32()
1049 /* use s->note_buf to store notes temporarily */ in create_header32()
1054 if (write_buffer(s, offset_note, s->note_buf, in create_header32()
1055 s->note_size) < 0) { in create_header32()
1061 s->offset_dump_bitmap = (DISKDUMP_HEADER_BLOCKS + sub_hdr_size) * in create_header32()
1065 s->offset_page = (DISKDUMP_HEADER_BLOCKS + sub_hdr_size + bitmap_blocks) * in create_header32()
1071 g_free(s->note_buf); in create_header32()
1087 /* write common header, the version of kdump-compressed format is 6th */ in create_header64()
1091 memcpy(dh->signature, KDUMP_SIGNATURE, SIG_LEN); in create_header64()
1092 dh->header_version = cpu_to_dump32(s, 6); in create_header64()
1093 block_size = s->dump_info.page_size; in create_header64()
1094 dh->block_size = cpu_to_dump32(s, block_size); in create_header64()
1095 sub_hdr_size = sizeof(struct KdumpSubHeader64) + s->note_size; in create_header64()
1097 dh->sub_hdr_size = cpu_to_dump32(s, sub_hdr_size); in create_header64()
1098 /* dh->max_mapnr may be truncated, full 64bit is in kh.max_mapnr_64 */ in create_header64()
1099 dh->max_mapnr = cpu_to_dump32(s, MIN(s->max_mapnr, UINT_MAX)); in create_header64()
1100 dh->nr_cpus = cpu_to_dump32(s, s->nr_cpus); in create_header64()
1101 bitmap_blocks = DIV_ROUND_UP(s->len_dump_bitmap, block_size) * 2; in create_header64()
1102 dh->bitmap_blocks = cpu_to_dump32(s, bitmap_blocks); in create_header64()
1103 strncpy(dh->utsname.machine, ELF_MACHINE_UNAME, sizeof(dh->utsname.machine)); in create_header64()
1105 if (s->flag_compress & DUMP_DH_COMPRESSED_ZLIB) { in create_header64()
1109 if (s->flag_compress & DUMP_DH_COMPRESSED_LZO) { in create_header64()
1114 if (s->flag_compress & DUMP_DH_COMPRESSED_SNAPPY) { in create_header64()
1118 dh->status = cpu_to_dump32(s, status); in create_header64()
1130 kh->max_mapnr_64 = cpu_to_dump64(s, s->max_mapnr); in create_header64()
1131 kh->phys_base = cpu_to_dump64(s, s->dump_info.phys_base); in create_header64()
1132 kh->dump_level = cpu_to_dump32(s, DUMP_LEVEL); in create_header64()
1135 if (s->guest_note && in create_header64()
1136 note_name_equal(s, s->guest_note, "VMCOREINFO")) { in create_header64()
1139 get_note_sizes(s, s->guest_note, in create_header64()
1141 offset_vmcoreinfo = offset_note + s->note_size - s->guest_note_size + in create_header64()
1143 kh->offset_vmcoreinfo = cpu_to_dump64(s, offset_vmcoreinfo); in create_header64()
1144 kh->size_vmcoreinfo = cpu_to_dump64(s, size_vmcoreinfo_desc); in create_header64()
1147 kh->offset_note = cpu_to_dump64(s, offset_note); in create_header64()
1148 kh->note_size = cpu_to_dump64(s, s->note_size); in create_header64()
1157 s->note_buf = g_malloc0(s->note_size); in create_header64()
1158 s->note_buf_offset = 0; in create_header64()
1160 /* use s->note_buf to store notes temporarily */ in create_header64()
1166 if (write_buffer(s, offset_note, s->note_buf, in create_header64()
1167 s->note_size) < 0) { in create_header64()
1173 s->offset_dump_bitmap = (DISKDUMP_HEADER_BLOCKS + sub_hdr_size) * in create_header64()
1177 s->offset_page = (DISKDUMP_HEADER_BLOCKS + sub_hdr_size + bitmap_blocks) * in create_header64()
1183 g_free(s->note_buf); in create_header64()
1197 return s->dump_info.page_size; in dump_bitmap_get_bufsize()
1203 * set_dump_bitmap will always leave the recently set bit un-sync. And setting
1205 * vmcore, ie. synchronizing un-sync bit into vmcore.
1230 offset_bitmap1 = s->offset_dump_bitmap + old_offset; in set_dump_bitmap()
1233 return -1; in set_dump_bitmap()
1237 offset_bitmap2 = s->offset_dump_bitmap + s->len_dump_bitmap + in set_dump_bitmap()
1241 return -1; in set_dump_bitmap()
1262 int target_page_shift = ctz32(s->dump_info.page_size); in dump_paddr_to_pfn()
1264 return (addr >> target_page_shift) - ARCH_PFN_OFFSET; in dump_paddr_to_pfn()
1269 int target_page_shift = ctz32(s->dump_info.page_size); in dump_pfn_to_paddr()
1276 * NULL. If not NULL, *bufptr must contains a target page size of pre-allocated
1283 uint32_t page_size = s->dump_info.page_size; in get_next_page()
1289 block = QTAILQ_FIRST(&s->guest_phys_blocks.head); in get_next_page()
1291 addr = block->target_start; in get_next_page()
1300 if (addr >= block->target_start && addr < block->target_end) { in get_next_page()
1301 size_t n = MIN(block->target_end - addr, page_size - addr % page_size); in get_next_page()
1302 hbuf = block->host_addr + (addr - block->target_start); in get_next_page()
1320 if (addr % page_size == 0 || addr >= block->target_end) { in get_next_page()
1331 addr = block->target_start; in get_next_page()
1384 * set_dump_bitmap will always leave the recently set bit un-sync. Here we in write_dump_bitmap()
1386 * 0. With those set, the un-sync bit will be synchronized into the vmcore. in write_dump_bitmap()
1398 s->num_dumpable = num_dumpable; in write_dump_bitmap()
1407 data_cache->state = s; in prepare_data_cache()
1408 data_cache->data_size = 0; in prepare_data_cache()
1409 data_cache->buf_size = 4 * dump_bitmap_get_bufsize(s); in prepare_data_cache()
1410 data_cache->buf = g_malloc0(data_cache->buf_size); in prepare_data_cache()
1411 data_cache->offset = offset; in prepare_data_cache()
1418 * dc->buf_size should not be less than size, otherwise dc will never be in write_cache()
1421 assert(size <= dc->buf_size); in write_cache()
1424 * if flag_sync is set, synchronize data in dc->buf into vmcore. in write_cache()
1426 * write the data in dc->buf to dc->state->fd and reset dc->buf in write_cache()
1428 if ((!flag_sync && dc->data_size + size > dc->buf_size) || in write_cache()
1429 (flag_sync && dc->data_size > 0)) { in write_cache()
1430 if (write_buffer(dc->state, dc->offset, dc->buf, dc->data_size) < 0) { in write_cache()
1431 return -1; in write_cache()
1434 dc->offset += dc->data_size; in write_cache()
1435 dc->data_size = 0; in write_cache()
1439 memcpy(dc->buf + dc->data_size, buf, size); in write_cache()
1440 dc->data_size += size; in write_cache()
1448 g_free(data_cache->buf); in free_data_cache()
1490 offset_desc = s->offset_page; in write_dump_pages()
1491 offset_data = offset_desc + sizeof(PageDescriptor) * s->num_dumpable; in write_dump_pages()
1497 len_buf_out = get_len_buf_out(s->dump_info.page_size, s->flag_compress); in write_dump_pages()
1510 pd_zero.size = cpu_to_dump32(s, s->dump_info.page_size); in write_dump_pages()
1514 buf = g_malloc0(s->dump_info.page_size); in write_dump_pages()
1515 ret = write_cache(&page_data, buf, s->dump_info.page_size, false); in write_dump_pages()
1522 offset_data += s->dump_info.page_size; in write_dump_pages()
1523 page = g_malloc(s->dump_info.page_size); in write_dump_pages()
1531 if (buffer_is_zero(buf, s->dump_info.page_size)) { in write_dump_pages()
1547 * s->flag_compress is set. But when compression fails to work, in write_dump_pages()
1551 if ((s->flag_compress & DUMP_DH_COMPRESSED_ZLIB) && in write_dump_pages()
1553 s->dump_info.page_size, Z_BEST_SPEED) == Z_OK) && in write_dump_pages()
1554 (size_out < s->dump_info.page_size)) { in write_dump_pages()
1564 } else if ((s->flag_compress & DUMP_DH_COMPRESSED_LZO) && in write_dump_pages()
1565 (lzo1x_1_compress(buf, s->dump_info.page_size, buf_out, in write_dump_pages()
1567 (size_out < s->dump_info.page_size)) { in write_dump_pages()
1578 } else if ((s->flag_compress & DUMP_DH_COMPRESSED_SNAPPY) && in write_dump_pages()
1579 (snappy_compress((char *)buf, s->dump_info.page_size, in write_dump_pages()
1581 (size_out < s->dump_info.page_size)) { in write_dump_pages()
1597 size_out = s->dump_info.page_size; in write_dump_pages()
1601 s->dump_info.page_size, false); in write_dump_pages()
1619 s->written_size += s->dump_info.page_size; in write_dump_pages()
1650 * the kdump-compressed format is: in create_kdump_vmcore()
1652 * +------------------------------------------+ 0x0 in create_kdump_vmcore()
1654 * |------------------------------------------+ block 1 in create_kdump_vmcore()
1656 * |------------------------------------------+ block 2 in create_kdump_vmcore()
1657 * | 1st-dump_bitmap | in create_kdump_vmcore()
1658 * |------------------------------------------+ block 2 + X blocks in create_kdump_vmcore()
1659 * | 2nd-dump_bitmap | (aligned by block) in create_kdump_vmcore()
1660 * |------------------------------------------+ block 2 + 2 * X blocks in create_kdump_vmcore()
1664 * |------------------------------------------| (not aligned by block) in create_kdump_vmcore()
1668 * +------------------------------------------+ in create_kdump_vmcore()
1703 last_block = QTAILQ_LAST(&s->guest_phys_blocks.head); in get_max_mapnr()
1704 s->max_mapnr = dump_paddr_to_pfn(s, last_block->target_end); in get_max_mapnr()
1718 return (qatomic_read(&state->status) == DUMP_STATUS_ACTIVE); in qemu_system_dump_in_progress()
1730 QTAILQ_FOREACH(block, &s->guest_phys_blocks.head, next) { in dump_calculate_size()
1732 s->filter_area_begin, in dump_calculate_size()
1733 s->filter_area_length); in dump_calculate_size()
1746 if (!note_name_equal(s, s->guest_note, "VMCOREINFO")) { in vmcoreinfo_update_phys_base()
1750 get_note_sizes(s, s->guest_note, &note_head_size, &name_size, &size); in vmcoreinfo_update_phys_base()
1753 vmci = s->guest_note + note_head_size + ROUND_UP(name_size, 4); in vmcoreinfo_update_phys_base()
1756 lines = g_strsplit((char *)vmci, "\n", -1); in vmcoreinfo_update_phys_base()
1760 if (s->dump_info.d_machine == EM_X86_64) { in vmcoreinfo_update_phys_base()
1762 } else if (s->dump_info.d_machine == EM_AARCH64) { in vmcoreinfo_update_phys_base()
1771 s->dump_info.phys_base = phys_base; in vmcoreinfo_update_phys_base()
1791 s->has_format = has_format; in dump_init()
1792 s->format = format; in dump_init()
1793 s->written_size = 0; in dump_init()
1794 s->kdump_raw = kdump_raw; in dump_init()
1796 /* kdump-compressed is conflict with paging and filter */ in dump_init()
1803 s->resume = true; in dump_init()
1805 s->resume = false; in dump_init()
1817 s->fd = fd; in dump_init()
1819 error_setg(errp, "parameter 'length' expects a non-zero size"); in dump_init()
1822 s->filter_area_begin = begin; in dump_init()
1823 s->filter_area_length = length; in dump_init()
1826 s->string_table_buf = g_array_new(FALSE, TRUE, 1); in dump_init()
1831 g_array_set_size(s->string_table_buf, 1); in dump_init()
1833 memory_mapping_list_init(&s->list); in dump_init()
1835 guest_phys_blocks_init(&s->guest_phys_blocks); in dump_init()
1836 guest_phys_blocks_append(&s->guest_phys_blocks); in dump_init()
1837 s->total_size = dump_calculate_size(s); in dump_init()
1839 fprintf(stderr, "DUMP: total memory to dump: %lu\n", s->total_size); in dump_init()
1842 /* it does not make sense to dump non-existent memory */ in dump_init()
1843 if (!s->total_size) { in dump_init()
1850 * return -1. in dump_init()
1852 ret = cpu_get_dump_info(&s->dump_info, &s->guest_phys_blocks); in dump_init()
1859 if (!s->dump_info.page_size) { in dump_init()
1860 s->dump_info.page_size = qemu_target_page_size(); in dump_init()
1863 s->note_size = cpu_get_note_size(s->dump_info.d_class, in dump_init()
1864 s->dump_info.d_machine, nr_cpus); in dump_init()
1865 assert(s->note_size >= 0); in dump_init()
1880 guest_format = le16_to_cpu(vmci->vmcoreinfo.guest_format); in dump_init()
1881 size = le32_to_cpu(vmci->vmcoreinfo.size); in dump_init()
1882 addr = le64_to_cpu(vmci->vmcoreinfo.paddr); in dump_init()
1883 if (!vmci->has_vmcoreinfo) { in dump_init()
1890 s->guest_note = g_malloc(size + 1); /* +1 for adding \0 */ in dump_init()
1891 cpu_physical_memory_read(addr, s->guest_note, size); in dump_init()
1893 get_note_sizes(s, s->guest_note, NULL, &name_size, &desc_size); in dump_init()
1894 s->guest_note_size = ELF_NOTE_SIZE(note_head_size, name_size, in dump_init()
1898 s->guest_note_size > size) { in dump_init()
1900 g_free(s->guest_note); in dump_init()
1901 s->guest_note = NULL; in dump_init()
1904 s->note_size += s->guest_note_size; in dump_init()
1911 qemu_get_guest_memory_mapping(&s->list, &s->guest_phys_blocks, errp); in dump_init()
1916 qemu_get_guest_simple_memory_mapping(&s->list, &s->guest_phys_blocks); in dump_init()
1919 s->nr_cpus = nr_cpus; in dump_init()
1924 tmp = DIV_ROUND_UP(DIV_ROUND_UP(s->max_mapnr, CHAR_BIT), in dump_init()
1925 s->dump_info.page_size); in dump_init()
1926 s->len_dump_bitmap = tmp * s->dump_info.page_size; in dump_init()
1928 /* init for kdump-compressed format */ in dump_init()
1932 s->flag_compress = DUMP_DH_COMPRESSED_ZLIB; in dump_init()
1942 s->flag_compress = DUMP_DH_COMPRESSED_LZO; in dump_init()
1946 s->flag_compress = DUMP_DH_COMPRESSED_SNAPPY; in dump_init()
1950 s->flag_compress = 0; in dump_init()
1957 memory_mapping_filter(&s->list, s->filter_area_begin, s->filter_area_length); in dump_init()
1965 s->shdr_num = 2; in dump_init()
1972 if (s->dump_info.arch_sections_add_fn) { in dump_init()
1973 s->dump_info.arch_sections_add_fn(s); in dump_init()
1981 * The absolute maximum amount of phdrs is UINT32_MAX - 1 as in dump_init()
1983 * UINT16_MAX - 1 but that is handled in the ehdr and section in dump_init()
1986 s->phdr_num = 1; /* Reserve PT_NOTE */ in dump_init()
1987 if (s->list.num <= UINT32_MAX - 1) { in dump_init()
1988 s->phdr_num += s->list.num; in dump_init()
1990 s->phdr_num = UINT32_MAX; in dump_init()
1998 s->shdr_offset = sizeof(Elf64_Ehdr); in dump_init()
1999 s->phdr_offset = s->shdr_offset + sizeof(Elf64_Shdr) * s->shdr_num; in dump_init()
2000 s->note_offset = s->phdr_offset + sizeof(Elf64_Phdr) * s->phdr_num; in dump_init()
2002 s->shdr_offset = sizeof(Elf32_Ehdr); in dump_init()
2003 s->phdr_offset = s->shdr_offset + sizeof(Elf32_Shdr) * s->shdr_num; in dump_init()
2004 s->note_offset = s->phdr_offset + sizeof(Elf32_Phdr) * s->phdr_num; in dump_init()
2006 s->memory_offset = s->note_offset + s->note_size; in dump_init()
2007 s->section_offset = s->memory_offset + s->total_size; in dump_init()
2021 if (s->has_format && s->format == DUMP_GUEST_MEMORY_FORMAT_WIN_DMP) { in dump_process()
2023 } else if (s->has_format && s->format != DUMP_GUEST_MEMORY_FORMAT_ELF) { in dump_process()
2031 qatomic_set(&s->status, in dump_process()
2056 result->status = qatomic_read(&state->status); in qmp_query_dump()
2059 result->completed = state->written_size; in qmp_query_dump()
2060 result->total = state->total_size; in qmp_query_dump()
2091 * externally, we represent kdump-raw-* as separate formats, but internally in qmp_dump_guest_memory()
2114 * kdump-compressed format need the whole memory dumped, so paging or in qmp_dump_guest_memory()
2119 error_setg(errp, "kdump-compressed format doesn't support paging or " in qmp_dump_guest_memory()
2138 error_setg(errp, "kdump-lzo is not available now"); in qmp_dump_guest_memory()
2145 error_setg(errp, "kdump-snappy is not available now"); in qmp_dump_guest_memory()
2157 if (fd == -1) { in qmp_dump_guest_memory()
2170 if (kdump_raw && lseek(fd, 0, SEEK_CUR) == (off_t) -1) { in qmp_dump_guest_memory()
2172 error_setg(errp, "kdump-raw formats require a seekable file"); in qmp_dump_guest_memory()
2178 "Live migration disabled: dump-guest-memory in progress"); in qmp_dump_guest_memory()
2182 * Allows even for -only-migratable, but forbid migration during the in qmp_dump_guest_memory()
2197 qatomic_set(&s->status, DUMP_STATUS_FAILED); in qmp_dump_guest_memory()
2203 s->detached = true; in qmp_dump_guest_memory()
2204 qemu_thread_create(&s->dump_thread, "dump_thread", dump_thread, in qmp_dump_guest_memory()
2216 DumpGuestMemoryFormatList **tail = &cap->formats; in qmp_query_dump_guest_memory_capability()
2221 /* kdump-zlib is always available */ in qmp_query_dump_guest_memory_capability()
2225 /* add new item if kdump-lzo is available */ in qmp_query_dump_guest_memory_capability()
2231 /* add new item if kdump-snappy is available */ in qmp_query_dump_guest_memory_capability()