Lines Matching +full:sub +full:- +full:type
4 * Copyright (c) 2009-2017 Red Hat Inc
10 * See the COPYING file in the top-level directory.
18 #include "qobject/json-writer.h"
19 #include "qemu-file.h"
21 #include "qemu/error-report.h"
37 if (field->field_exists) { in vmstate_field_exists()
39 result = field->field_exists(opaque, version_id); in vmstate_field_exists()
40 trace_vmstate_field_exists(vmsd->name, field->name, field->version_id, in vmstate_field_exists()
48 result = field->version_id <= version_id; in vmstate_field_exists()
65 assert(field->flags & VMS_ARRAY_OF_POINTER); in vmsd_create_fake_nullptr_field()
68 fake->name = field->name; in vmsd_create_fake_nullptr_field()
69 fake->version_id = field->version_id; in vmsd_create_fake_nullptr_field()
72 fake->field_exists = NULL; in vmsd_create_fake_nullptr_field()
74 /* See vmstate_info_nullptr - use 1 byte to represent nullptr */ in vmsd_create_fake_nullptr_field()
75 fake->size = 1; in vmsd_create_fake_nullptr_field()
76 fake->info = &vmstate_info_nullptr; in vmsd_create_fake_nullptr_field()
77 fake->flags = VMS_SINGLE; in vmsd_create_fake_nullptr_field()
88 if (field->flags & VMS_ARRAY) { in vmstate_n_elems()
89 n_elems = field->num; in vmstate_n_elems()
90 } else if (field->flags & VMS_VARRAY_INT32) { in vmstate_n_elems()
91 n_elems = *(int32_t *)(opaque + field->num_offset); in vmstate_n_elems()
92 } else if (field->flags & VMS_VARRAY_UINT32) { in vmstate_n_elems()
93 n_elems = *(uint32_t *)(opaque + field->num_offset); in vmstate_n_elems()
94 } else if (field->flags & VMS_VARRAY_UINT16) { in vmstate_n_elems()
95 n_elems = *(uint16_t *)(opaque + field->num_offset); in vmstate_n_elems()
96 } else if (field->flags & VMS_VARRAY_UINT8) { in vmstate_n_elems()
97 n_elems = *(uint8_t *)(opaque + field->num_offset); in vmstate_n_elems()
100 if (field->flags & VMS_MULTIPLY_ELEMENTS) { in vmstate_n_elems()
101 n_elems *= field->num; in vmstate_n_elems()
104 trace_vmstate_n_elems(field->name, n_elems); in vmstate_n_elems()
110 int size = field->size; in vmstate_size()
112 if (field->flags & VMS_VBUFFER) { in vmstate_size()
113 size = *(int32_t *)(opaque + field->size_offset); in vmstate_size()
114 if (field->flags & VMS_MULTIPLY) { in vmstate_size()
115 size *= field->size; in vmstate_size()
125 if (field->flags & VMS_POINTER && field->flags & VMS_ALLOC) { in vmstate_handle_alloc()
137 const VMStateField *field = vmsd->fields; in vmstate_load_state()
140 trace_vmstate_load_state(vmsd->name, version_id); in vmstate_load_state()
141 if (version_id > vmsd->version_id) { in vmstate_load_state()
144 vmsd->name, version_id, vmsd->version_id); in vmstate_load_state()
145 trace_vmstate_load_state_end(vmsd->name, "too new", -EINVAL); in vmstate_load_state()
146 return -EINVAL; in vmstate_load_state()
148 if (version_id < vmsd->minimum_version_id) { in vmstate_load_state()
151 vmsd->name, version_id, vmsd->minimum_version_id); in vmstate_load_state()
152 trace_vmstate_load_state_end(vmsd->name, "too old", -EINVAL); in vmstate_load_state()
153 return -EINVAL; in vmstate_load_state()
155 if (vmsd->pre_load) { in vmstate_load_state()
156 ret = vmsd->pre_load(opaque); in vmstate_load_state()
161 while (field->name) { in vmstate_load_state()
163 trace_vmstate_load_state_field(vmsd->name, field->name, exists); in vmstate_load_state()
165 void *first_elem = opaque + field->offset; in vmstate_load_state()
170 if (field->flags & VMS_POINTER) { in vmstate_load_state()
178 if (field->flags & VMS_ARRAY_OF_POINTER) { in vmstate_load_state()
193 if (inner_field->flags & VMS_STRUCT) { in vmstate_load_state()
194 ret = vmstate_load_state(f, inner_field->vmsd, curr_elem, in vmstate_load_state()
195 inner_field->vmsd->version_id); in vmstate_load_state()
196 } else if (inner_field->flags & VMS_VSTRUCT) { in vmstate_load_state()
197 ret = vmstate_load_state(f, inner_field->vmsd, curr_elem, in vmstate_load_state()
198 inner_field->struct_version_id); in vmstate_load_state()
200 ret = inner_field->info->get(f, curr_elem, size, in vmstate_load_state()
214 error_report("Failed to load %s:%s", vmsd->name, in vmstate_load_state()
215 field->name); in vmstate_load_state()
216 trace_vmstate_load_field_error(field->name, ret); in vmstate_load_state()
220 } else if (field->flags & VMS_MUST_EXIST) { in vmstate_load_state()
222 vmsd->name, field->name); in vmstate_load_state()
223 return -1; in vmstate_load_state()
227 assert(field->flags == VMS_END); in vmstate_load_state()
233 if (vmsd->post_load) { in vmstate_load_state()
234 ret = vmsd->post_load(opaque, version_id); in vmstate_load_state()
236 trace_vmstate_load_state_end(vmsd->name, "end", ret); in vmstate_load_state()
246 for (field = start; field->name; field++) { in vmfield_name_num()
247 if (!strcmp(field->name, search->name)) { in vmfield_name_num()
255 return -1; in vmfield_name_num()
264 for (field = start; field->name; field++) { in vmfield_name_is_unique()
265 if (!strcmp(field->name, search->name)) { in vmfield_name_is_unique()
279 const char *type = "unknown"; in vmfield_get_type_name() local
281 if (field->flags & VMS_STRUCT) { in vmfield_get_type_name()
282 type = "struct"; in vmfield_get_type_name()
283 } else if (field->flags & VMS_VSTRUCT) { in vmfield_get_type_name()
284 type = "vstruct"; in vmfield_get_type_name()
285 } else if (field->info->name) { in vmfield_get_type_name()
286 type = field->info->name; in vmfield_get_type_name()
289 return type; in vmfield_get_type_name()
294 if (field->field_exists) { in vmsd_can_compress()
299 if (field->flags & VMS_STRUCT) { in vmsd_can_compress()
300 const VMStateField *sfield = field->vmsd->fields; in vmsd_can_compress()
301 while (sfield->name) { in vmsd_can_compress()
309 if (field->vmsd->subsections) { in vmsd_can_compress()
330 name = g_strdup(field->name); in vmsd_desc_field_start()
333 if (!vmfield_name_is_unique(vmsd->fields, field)) { in vmsd_desc_field_start()
334 int num = vmfield_name_num(vmsd->fields, field); in vmsd_desc_field_start()
349 json_writer_str(vmdesc, "type", vmfield_get_type_name(field)); in vmsd_desc_field_start()
351 if (field->flags & VMS_STRUCT) { in vmsd_desc_field_start()
366 if (field->flags & VMS_STRUCT) { in vmsd_desc_field_end()
378 if (vmsd->needed && !vmsd->needed(opaque)) { in vmstate_section_needed()
389 return vmstate_save_state_v(f, vmsd, opaque, vmdesc_id, vmsd->version_id, NULL); in vmstate_save_state()
395 return vmstate_save_state_v(f, vmsd, opaque, vmdesc_id, vmsd->version_id, errp); in vmstate_save_state_with_err()
402 const VMStateField *field = vmsd->fields; in vmstate_save_state_v()
404 trace_vmstate_save_state_top(vmsd->name); in vmstate_save_state_v()
406 if (vmsd->pre_save) { in vmstate_save_state_v()
407 ret = vmsd->pre_save(opaque); in vmstate_save_state_v()
408 trace_vmstate_save_state_pre_save_res(vmsd->name, ret); in vmstate_save_state_v()
410 error_setg(errp, "pre-save failed: %s", vmsd->name); in vmstate_save_state_v()
416 json_writer_str(vmdesc, "vmsd_name", vmsd->name); in vmstate_save_state_v()
421 while (field->name) { in vmstate_save_state_v()
423 void *first_elem = opaque + field->offset; in vmstate_save_state_v()
430 trace_vmstate_save_state_loop(vmsd->name, field->name, n_elems); in vmstate_save_state_v()
431 if (field->flags & VMS_POINTER) { in vmstate_save_state_v()
440 int max_elems = n_elems - i; in vmstate_save_state_v()
443 if (field->flags & VMS_ARRAY_OF_POINTER) { in vmstate_save_state_v()
465 * null/non-null data, it doesn't make sense to emit a in vmstate_save_state_v()
468 * vs. nullptr). Search ahead for the next null/non-null element in vmstate_save_state_v()
471 if (vmdesc && (field->flags & VMS_ARRAY_OF_POINTER) && in vmstate_save_state_v()
482 max_elems = j - i; in vmstate_save_state_v()
491 if (inner_field->flags & VMS_STRUCT) { in vmstate_save_state_v()
492 ret = vmstate_save_state(f, inner_field->vmsd, in vmstate_save_state_v()
494 } else if (inner_field->flags & VMS_VSTRUCT) { in vmstate_save_state_v()
495 ret = vmstate_save_state_v(f, inner_field->vmsd, in vmstate_save_state_v()
497 inner_field->struct_version_id, in vmstate_save_state_v()
500 ret = inner_field->info->put(f, curr_elem, size, in vmstate_save_state_v()
504 written_bytes = qemu_file_transferred(f) - old_offset; in vmstate_save_state_v()
515 vmsd->name, field->name); in vmstate_save_state_v()
516 if (vmsd->post_save) { in vmstate_save_state_v()
517 vmsd->post_save(opaque); in vmstate_save_state_v()
528 if (field->flags & VMS_MUST_EXIST) { in vmstate_save_state_v()
530 vmsd->name, field->name); in vmstate_save_state_v()
531 assert(!(field->flags & VMS_MUST_EXIST)); in vmstate_save_state_v()
536 assert(field->flags == VMS_END); in vmstate_save_state_v()
544 if (vmsd->post_save) { in vmstate_save_state_v()
545 int ps_ret = vmsd->post_save(opaque); in vmstate_save_state_v()
548 error_setg(errp, "post-save failed: %s", vmsd->name); in vmstate_save_state_v()
555 vmstate_get_subsection(const VMStateDescription * const *sub, in vmstate_get_subsection() argument
558 if (sub) { in vmstate_get_subsection()
559 for (const VMStateDescription *s = *sub; s ; s = *++sub) { in vmstate_get_subsection()
560 if (strcmp(idstr, s->name) == 0) { in vmstate_get_subsection()
571 trace_vmstate_subsection_load(vmsd->name); in vmstate_subsection_load()
580 if (len < strlen(vmsd->name) + 1) { in vmstate_subsection_load()
582 trace_vmstate_subsection_load_bad(vmsd->name, "(short)", ""); in vmstate_subsection_load()
587 trace_vmstate_subsection_load_bad(vmsd->name, "(peek fail)", ""); in vmstate_subsection_load()
593 if (strncmp(vmsd->name, idstr, strlen(vmsd->name)) != 0) { in vmstate_subsection_load()
594 trace_vmstate_subsection_load_bad(vmsd->name, idstr, "(prefix)"); in vmstate_subsection_load()
598 sub_vmsd = vmstate_get_subsection(vmsd->subsections, idstr); in vmstate_subsection_load()
600 trace_vmstate_subsection_load_bad(vmsd->name, idstr, "(lookup)"); in vmstate_subsection_load()
601 return -ENOENT; in vmstate_subsection_load()
610 trace_vmstate_subsection_load_bad(vmsd->name, idstr, "(child)"); in vmstate_subsection_load()
615 trace_vmstate_subsection_load_good(vmsd->name); in vmstate_subsection_load()
623 const VMStateDescription * const *sub = vmsd->subsections; in vmstate_subsection_save() local
627 trace_vmstate_subsection_save_top(vmsd->name); in vmstate_subsection_save()
628 while (sub && *sub) { in vmstate_subsection_save()
629 if (vmstate_section_needed(*sub, opaque)) { in vmstate_subsection_save()
630 const VMStateDescription *vmsdsub = *sub; in vmstate_subsection_save()
633 trace_vmstate_subsection_save_loop(vmsd->name, vmsdsub->name); in vmstate_subsection_save()
645 len = strlen(vmsdsub->name); in vmstate_subsection_save()
647 qemu_put_buffer(f, (uint8_t *)vmsdsub->name, len); in vmstate_subsection_save()
648 qemu_put_be32(f, vmsdsub->version_id); in vmstate_subsection_save()
658 sub++; in vmstate_subsection_save()