Changeset View
Changeset View
Standalone View
Standalone View
sys/amd64/vmm/vmm_snapshot.c
Show All 35 Lines | |||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include <sys/systm.h> | #include <sys/systm.h> | ||||
#include <machine/vmm_snapshot.h> | #include <machine/vmm_snapshot.h> | ||||
int | |||||
vm_snapshot_save_fieldname(const char *fullname, volatile void *data, | |||||
char *type, size_t data_size, struct vm_snapshot_meta *meta) | |||||
{ | |||||
return vm_snapshot_buf(data, data_size, meta); | |||||
} | |||||
int | |||||
vm_snapshot_save_fieldname_cmp(const char *fullname, volatile void *data, | |||||
char *type, size_t data_size, struct vm_snapshot_meta *meta) | |||||
{ | |||||
return vm_snapshot_buf_cmp(data, data_size, meta); | |||||
} | |||||
void | void | ||||
vm_snapshot_add_intern_list(const char *arr_name, struct vm_snapshot_meta *meta) | |||||
{ | |||||
} | |||||
void | |||||
vm_snapshot_remove_intern_list(struct vm_snapshot_meta *meta) | |||||
{ | |||||
} | |||||
void | |||||
check_and_set_non_array_type(char *type, struct vm_snapshot_meta *meta) | |||||
{ | |||||
} | |||||
void | |||||
vm_snapshot_buf_err(const char *bufname, const enum vm_snapshot_op op) | vm_snapshot_buf_err(const char *bufname, const enum vm_snapshot_op op) | ||||
{ | { | ||||
const char *opstr; | const char *opstr; | ||||
if (op == VM_SNAPSHOT_SAVE) | if (op == VM_SNAPSHOT_SAVE) | ||||
opstr = "save"; | opstr = "save"; | ||||
else if (op == VM_SNAPSHOT_RESTORE) | else if (op == VM_SNAPSHOT_RESTORE) | ||||
opstr = "restore"; | opstr = "restore"; | ||||
else | else | ||||
opstr = "unknown"; | opstr = "unknown"; | ||||
printf("%s: snapshot-%s failed for %s\r\n", __func__, opstr, bufname); | printf("%s: snapshot-%s failed for %s\r\n", __func__, opstr, bufname); | ||||
} | } | ||||
int | int | ||||
vm_snapshot_buf(volatile void *data, size_t data_size, | vm_snapshot_buf(volatile void *data, size_t data_size, | ||||
struct vm_snapshot_meta *meta) | struct vm_snapshot_meta *meta) | ||||
{ | { | ||||
struct vm_snapshot_buffer *buffer; | struct vm_snapshot_buffer *buffer; | ||||
int op; | int op; | ||||
int ds; | |||||
void *nv_data; | void *nv_data; | ||||
nv_data = __DEVOLATILE(void *, data); | nv_data = __DEVOLATILE(void *, data); | ||||
buffer = &meta->buffer; | buffer = &meta->buffer; | ||||
op = meta->op; | op = meta->op; | ||||
if (buffer->buf_rem < data_size) { | if (buffer->buf_rem < data_size + sizeof(int32_t)) { | ||||
printf("%s: buffer too small\r\n", __func__); | printf("%s: buffer too small\r\n", __func__); | ||||
return (E2BIG); | return (E2BIG); | ||||
} | } | ||||
if (op == VM_SNAPSHOT_SAVE) | if (op == VM_SNAPSHOT_SAVE) { | ||||
if (meta->version == JSON_V2) { | |||||
copyout(&data_size, buffer->buf, sizeof(int32_t)); | |||||
buffer->buf += sizeof(int32_t); | |||||
buffer->buf_rem -= sizeof(int32_t); | |||||
} | |||||
copyout(nv_data, buffer->buf, data_size); | copyout(nv_data, buffer->buf, data_size); | ||||
else if (op == VM_SNAPSHOT_RESTORE) | } else if (op == VM_SNAPSHOT_RESTORE) { | ||||
if (meta->version == JSON_V2) { | |||||
ds = -1; | |||||
copyin(buffer->buf, &ds, sizeof(int32_t)); | |||||
if (ds != data_size) { | |||||
printf("%s(line %d): Size mismatch, expected %ld but got %d\r\n", | |||||
__func__, __LINE__, data_size, ds); | |||||
return (-1); | |||||
} | |||||
buffer->buf += sizeof(int32_t); | |||||
buffer->buf_rem -= sizeof(int32_t); | |||||
} | |||||
copyin(buffer->buf, nv_data, data_size); | copyin(buffer->buf, nv_data, data_size); | ||||
else | } else | ||||
return (EINVAL); | return (EINVAL); | ||||
buffer->buf += data_size; | buffer->buf += data_size; | ||||
buffer->buf_rem -= data_size; | buffer->buf_rem -= data_size; | ||||
return (0); | return (0); | ||||
} | } | ||||
Show All 18 Lines | |||||
int | int | ||||
vm_snapshot_buf_cmp(volatile void *data, size_t data_size, | vm_snapshot_buf_cmp(volatile void *data, size_t data_size, | ||||
struct vm_snapshot_meta *meta) | struct vm_snapshot_meta *meta) | ||||
{ | { | ||||
struct vm_snapshot_buffer *buffer; | struct vm_snapshot_buffer *buffer; | ||||
int op; | int op; | ||||
int ret; | int ret; | ||||
int ds; | |||||
void *_data = *(void **)(void *)&data; | void *_data = *(void **)(void *)&data; | ||||
buffer = &meta->buffer; | buffer = &meta->buffer; | ||||
op = meta->op; | op = meta->op; | ||||
if (buffer->buf_rem < data_size) { | if (buffer->buf_rem < data_size + sizeof(int32_t)) { | ||||
printf("%s: buffer too small\r\n", __func__); | printf("%s: buffer too small\r\n", __func__); | ||||
ret = E2BIG; | ret = E2BIG; | ||||
goto done; | goto done; | ||||
} | } | ||||
if (op == VM_SNAPSHOT_SAVE) { | if (op == VM_SNAPSHOT_SAVE) { | ||||
ret = 0; | ret = 0; | ||||
copyout(&data_size, buffer->buf, sizeof(int32_t)); | |||||
buffer->buf += sizeof(int32_t); | |||||
buffer->buf_rem -= sizeof(int32_t); | |||||
copyout(_data, buffer->buf, data_size); | copyout(_data, buffer->buf, data_size); | ||||
} else if (op == VM_SNAPSHOT_RESTORE) { | } else if (op == VM_SNAPSHOT_RESTORE) { | ||||
if (meta->version == JSON_V2) { | |||||
ds = -1; | |||||
copyin(&ds, buffer->buf, sizeof(int32_t)); | |||||
if (ds != data_size) { | |||||
printf("%s(line %d): Size mismatch, expected %ld but got %d\r\n", | |||||
__func__, __LINE__, data_size, ds); | |||||
return (-1); | |||||
} | |||||
buffer->buf += sizeof(int32_t); | |||||
buffer->buf_rem -= sizeof(int32_t); | |||||
} | |||||
ret = memcmp(_data, buffer->buf, data_size); | ret = memcmp(_data, buffer->buf, data_size); | ||||
} else { | } else { | ||||
ret = EINVAL; | ret = EINVAL; | ||||
goto done; | goto done; | ||||
} | } | ||||
buffer->buf += data_size; | buffer->buf += data_size; | ||||
buffer->buf_rem -= data_size; | buffer->buf_rem -= data_size; | ||||
done: | done: | ||||
return (ret); | return (ret); | ||||
} | } |