target/ppc/spapr_caps: Add macro to generate spapr_caps migration vmstate
The vmstate description and the contained needed function for migration of spapr_caps is the same for each cap, with the name of the cap substituted. As such introduce a macro to allow for easier generation of these. Convert the three existing spapr_caps (htm, vsx, and dfp) to use this macro. Signed-off-by: Suraj Jitindar Singh <sjitindarsingh@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
		
							parent
							
								
									7af1e7b022
								
							
						
					
					
						commit
						1f63ebaa91
					
				@ -228,62 +228,32 @@ int spapr_caps_post_migration(sPAPRMachineState *spapr)
 | 
				
			|||||||
    return ok ? 0 : -EINVAL;
 | 
					    return ok ? 0 : -EINVAL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool spapr_cap_htm_needed(void *opaque)
 | 
					/* Used to generate the migration field and needed function for a spapr cap */
 | 
				
			||||||
{
 | 
					#define SPAPR_CAP_MIG_STATE(cap, ccap)                  \
 | 
				
			||||||
    sPAPRMachineState *spapr = opaque;
 | 
					static bool spapr_cap_##cap##_needed(void *opaque)      \
 | 
				
			||||||
 | 
					{                                                       \
 | 
				
			||||||
    return spapr->cmd_line_caps[SPAPR_CAP_HTM] &&
 | 
					    sPAPRMachineState *spapr = opaque;                  \
 | 
				
			||||||
           (spapr->eff.caps[SPAPR_CAP_HTM] != spapr->def.caps[SPAPR_CAP_HTM]);
 | 
					                                                        \
 | 
				
			||||||
 | 
					    return spapr->cmd_line_caps[SPAPR_CAP_##ccap] &&    \
 | 
				
			||||||
 | 
					           (spapr->eff.caps[SPAPR_CAP_##ccap] !=        \
 | 
				
			||||||
 | 
					            spapr->def.caps[SPAPR_CAP_##ccap]);         \
 | 
				
			||||||
 | 
					}                                                       \
 | 
				
			||||||
 | 
					                                                        \
 | 
				
			||||||
 | 
					const VMStateDescription vmstate_spapr_cap_##cap = {    \
 | 
				
			||||||
 | 
					    .name = "spapr/cap/" #cap,                          \
 | 
				
			||||||
 | 
					    .version_id = 1,                                    \
 | 
				
			||||||
 | 
					    .minimum_version_id = 1,                            \
 | 
				
			||||||
 | 
					    .needed = spapr_cap_##cap##_needed,                 \
 | 
				
			||||||
 | 
					    .fields = (VMStateField[]) {                        \
 | 
				
			||||||
 | 
					        VMSTATE_UINT8(mig.caps[SPAPR_CAP_##ccap],       \
 | 
				
			||||||
 | 
					                      sPAPRMachineState),               \
 | 
				
			||||||
 | 
					        VMSTATE_END_OF_LIST()                           \
 | 
				
			||||||
 | 
					    },                                                  \
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const VMStateDescription vmstate_spapr_cap_htm = {
 | 
					SPAPR_CAP_MIG_STATE(htm, HTM);
 | 
				
			||||||
    .name = "spapr/cap/htm",
 | 
					SPAPR_CAP_MIG_STATE(vsx, VSX);
 | 
				
			||||||
    .version_id = 1,
 | 
					SPAPR_CAP_MIG_STATE(dfp, DFP);
 | 
				
			||||||
    .minimum_version_id = 1,
 | 
					 | 
				
			||||||
    .needed = spapr_cap_htm_needed,
 | 
					 | 
				
			||||||
    .fields = (VMStateField[]) {
 | 
					 | 
				
			||||||
        VMSTATE_UINT8(mig.caps[SPAPR_CAP_HTM], sPAPRMachineState),
 | 
					 | 
				
			||||||
        VMSTATE_END_OF_LIST()
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool spapr_cap_vsx_needed(void *opaque)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    sPAPRMachineState *spapr = opaque;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return spapr->cmd_line_caps[SPAPR_CAP_VSX] &&
 | 
					 | 
				
			||||||
           (spapr->eff.caps[SPAPR_CAP_VSX] != spapr->def.caps[SPAPR_CAP_VSX]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const VMStateDescription vmstate_spapr_cap_vsx = {
 | 
					 | 
				
			||||||
    .name = "spapr/cap/vsx",
 | 
					 | 
				
			||||||
    .version_id = 1,
 | 
					 | 
				
			||||||
    .minimum_version_id = 1,
 | 
					 | 
				
			||||||
    .needed = spapr_cap_vsx_needed,
 | 
					 | 
				
			||||||
    .fields = (VMStateField[]) {
 | 
					 | 
				
			||||||
        VMSTATE_UINT8(mig.caps[SPAPR_CAP_VSX], sPAPRMachineState),
 | 
					 | 
				
			||||||
        VMSTATE_END_OF_LIST()
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static bool spapr_cap_dfp_needed(void *opaque)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    sPAPRMachineState *spapr = opaque;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return spapr->cmd_line_caps[SPAPR_CAP_DFP] &&
 | 
					 | 
				
			||||||
           (spapr->eff.caps[SPAPR_CAP_DFP] != spapr->def.caps[SPAPR_CAP_DFP]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
const VMStateDescription vmstate_spapr_cap_dfp = {
 | 
					 | 
				
			||||||
    .name = "spapr/cap/dfp",
 | 
					 | 
				
			||||||
    .version_id = 1,
 | 
					 | 
				
			||||||
    .minimum_version_id = 1,
 | 
					 | 
				
			||||||
    .needed = spapr_cap_dfp_needed,
 | 
					 | 
				
			||||||
    .fields = (VMStateField[]) {
 | 
					 | 
				
			||||||
        VMSTATE_UINT8(mig.caps[SPAPR_CAP_DFP], sPAPRMachineState),
 | 
					 | 
				
			||||||
        VMSTATE_END_OF_LIST()
 | 
					 | 
				
			||||||
    },
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
void spapr_caps_reset(sPAPRMachineState *spapr)
 | 
					void spapr_caps_reset(sPAPRMachineState *spapr)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user