@ -10,6 +10,72 @@
# include "migration/cpu.h"
# include "internals.h"
static const VMStateDescription vmstate_fpu_reg = {
. name = " fpu_reg " ,
. version_id = 1 ,
. minimum_version_id = 1 ,
. fields = ( VMStateField [ ] ) {
VMSTATE_UINT64 ( UD ( 0 ) , VReg ) ,
VMSTATE_END_OF_LIST ( )
}
} ;
# define VMSTATE_FPU_REGS(_field, _state, _start) \
VMSTATE_STRUCT_SUB_ARRAY ( _field , _state , _start , 32 , 0 , \
vmstate_fpu_reg , fpr_t )
static bool fpu_needed ( void * opaque )
{
LoongArchCPU * cpu = opaque ;
return FIELD_EX64 ( cpu - > env . cpucfg [ 2 ] , CPUCFG2 , FP ) ;
}
static const VMStateDescription vmstate_fpu = {
. name = " cpu/fpu " ,
. version_id = 1 ,
. minimum_version_id = 1 ,
. needed = fpu_needed ,
. fields = ( VMStateField [ ] ) {
VMSTATE_FPU_REGS ( env . fpr , LoongArchCPU , 0 ) ,
VMSTATE_UINT32 ( env . fcsr0 , LoongArchCPU ) ,
VMSTATE_BOOL_ARRAY ( env . cf , LoongArchCPU , 8 ) ,
VMSTATE_END_OF_LIST ( )
} ,
} ;
static const VMStateDescription vmstate_lsxh_reg = {
. name = " lsxh_reg " ,
. version_id = 1 ,
. minimum_version_id = 1 ,
. fields = ( VMStateField [ ] ) {
VMSTATE_UINT64 ( UD ( 1 ) , VReg ) ,
VMSTATE_END_OF_LIST ( )
}
} ;
# define VMSTATE_LSXH_REGS(_field, _state, _start) \
VMSTATE_STRUCT_SUB_ARRAY ( _field , _state , _start , 32 , 0 , \
vmstate_lsxh_reg , fpr_t )
static bool lsx_needed ( void * opaque )
{
LoongArchCPU * cpu = opaque ;
return FIELD_EX64 ( cpu - > env . cpucfg [ 2 ] , CPUCFG2 , LSX ) ;
}
static const VMStateDescription vmstate_lsx = {
. name = " cpu/lsx " ,
. version_id = 1 ,
. minimum_version_id = 1 ,
. needed = lsx_needed ,
. fields = ( VMStateField [ ] ) {
VMSTATE_LSXH_REGS ( env . fpr , LoongArchCPU , 0 ) ,
VMSTATE_END_OF_LIST ( )
} ,
} ;
/* TLB state */
const VMStateDescription vmstate_tlb = {
. name = " cpu/tlb " ,
@ -24,18 +90,13 @@ const VMStateDescription vmstate_tlb = {
} ;
/* LoongArch CPU state */
const VMStateDescription vmstate_loongarch_cpu = {
. name = " cpu " ,
. version_id = 0 ,
. minimum_version_id = 0 ,
. version_id = 1 ,
. minimum_version_id = 1 ,
. fields = ( VMStateField [ ] ) {
VMSTATE_UINTTL_ARRAY ( env . gpr , LoongArchCPU , 32 ) ,
VMSTATE_UINTTL ( env . pc , LoongArchCPU ) ,
VMSTATE_UINT64_ARRAY ( env . fpr , LoongArchCPU , 32 ) ,
VMSTATE_UINT32 ( env . fcsr0 , LoongArchCPU ) ,
VMSTATE_BOOL_ARRAY ( env . cf , LoongArchCPU , 8 ) ,
/* Remaining CSRs */
VMSTATE_UINT64 ( env . CSR_CRMD , LoongArchCPU ) ,
@ -99,4 +160,8 @@ const VMStateDescription vmstate_loongarch_cpu = {
VMSTATE_END_OF_LIST ( )
} ,
. subsections = ( const VMStateDescription * [ ] ) {
& vmstate_fpu ,
& vmstate_lsx ,
}
} ;