Message ID | 20220426230855.336292-3-atishp@rivosinc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Implement Sstc extension | expand |
On 4/26/22 16:08, Atish Patra wrote: > + .num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\ ... > } else if (field->flags & VMS_VARRAY_UINT32) { > n_elems = *(uint32_t *)(opaque + field->num_offset); > + } else if (field->flags & VMS_VARRAY_UINT64) { > + n_elems = *(uint64_t *)(opaque + field->num_offset); Offset type mismatch. Since num_harts is uint32_t, I don't believe you need this patch at all. r~
On Tue, Apr 26, 2022 at 5:50 PM Richard Henderson <richard.henderson@linaro.org> wrote: > > On 4/26/22 16:08, Atish Patra wrote: > > + .num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\ > ... > > } else if (field->flags & VMS_VARRAY_UINT32) { > > n_elems = *(uint32_t *)(opaque + field->num_offset); > > + } else if (field->flags & VMS_VARRAY_UINT64) { > > + n_elems = *(uint64_t *)(opaque + field->num_offset); > > Offset type mismatch. Since num_harts is uint32_t, I don't believe you need this patch at > all. > Ahh yes. You are right. I read the function description wrong and assumed that VMSTATE_VARRAY_UINT32 creates an variable array of uint32_t elements only. Thanks for the clarification. > > r~
diff --git a/include/migration/vmstate.h b/include/migration/vmstate.h index ad24aa193451..d289caea0143 100644 --- a/include/migration/vmstate.h +++ b/include/migration/vmstate.h @@ -147,6 +147,7 @@ enum VMStateFlags { * VMStateField.struct_version_id to tell which version of the * structure we are referencing to use. */ VMS_VSTRUCT = 0x8000, + VMS_VARRAY_UINT64 = 0x10000, }; typedef enum { @@ -428,6 +429,16 @@ extern const VMStateInfo vmstate_info_qlist; .offset = vmstate_offset_pointer(_state, _field, _type), \ } +#define VMSTATE_VARRAY_UINT64(_field, _state, _field_num, _version, _info, _type) {\ + .name = (stringify(_field)), \ + .version_id = (_version), \ + .num_offset = vmstate_offset_value(_state, _field_num, uint32_t),\ + .info = &(_info), \ + .size = sizeof(_type), \ + .flags = VMS_VARRAY_UINT64 | VMS_POINTER, \ + .offset = vmstate_offset_pointer(_state, _field, _type), \ +} + #define VMSTATE_VARRAY_UINT16_ALLOC(_field, _state, _field_num, _version, _info, _type) {\ .name = (stringify(_field)), \ .version_id = (_version), \ diff --git a/migration/vmstate.c b/migration/vmstate.c index 36ae8b9e1918..3cd5e37ebe2d 100644 --- a/migration/vmstate.c +++ b/migration/vmstate.c @@ -35,6 +35,8 @@ static int vmstate_n_elems(void *opaque, const VMStateField *field) n_elems = *(int32_t *)(opaque + field->num_offset); } else if (field->flags & VMS_VARRAY_UINT32) { n_elems = *(uint32_t *)(opaque + field->num_offset); + } else if (field->flags & VMS_VARRAY_UINT64) { + n_elems = *(uint64_t *)(opaque + field->num_offset); } else if (field->flags & VMS_VARRAY_UINT16) { n_elems = *(uint16_t *)(opaque + field->num_offset); } else if (field->flags & VMS_VARRAY_UINT8) {
unsigned 64bit variable array data type support is missing. Add the required code to support it. Signed-off-by: Atish Patra <atishp@rivosinc.com> --- include/migration/vmstate.h | 11 +++++++++++ migration/vmstate.c | 2 ++ 2 files changed, 13 insertions(+)