@ -21,115 +21,17 @@
# include "qapi/error.h"
# include "qemu/error-report.h"
# include "qemu/qemu-print.h"
# include "migration/vmstate.h"
# ifndef CONFIG_USER_ONLY
# include "hw/core/sysemu-cpu-ops.h"
# endif
# include "system/accel-ops.h"
# include "system/cpus.h"
# include "system/tcg.h"
# include "exec/tswap.h"
# include "exec/replay-core.h"
# include "exec/cpu-common.h"
# include "exec/cputlb.h"
# include "exec/exec-all.h"
# include "exec/tb-flush.h"
# include "exec/log.h"
# include "accel/accel-cpu-target.h"
# include "trace/trace-root.h"
# include "qemu/accel.h"
# include "hw/core/cpu.h"
# ifndef CONFIG_USER_ONLY
static int cpu_common_post_load ( void * opaque , int version_id )
{
if ( tcg_enabled ( ) ) {
CPUState * cpu = opaque ;
/*
* 0x01 was CPU_INTERRUPT_EXIT . This line can be removed when the
* version_id is increased .
*/
cpu - > interrupt_request & = ~ 0x01 ;
tlb_flush ( cpu ) ;
/*
* loadvm has just updated the content of RAM , bypassing the
* usual mechanisms that ensure we flush TBs for writes to
* memory we ' ve translated code from . So we must flush all TBs ,
* which will now be stale .
*/
tb_flush ( cpu ) ;
}
return 0 ;
}
static int cpu_common_pre_load ( void * opaque )
{
CPUState * cpu = opaque ;
cpu - > exception_index = - 1 ;
return 0 ;
}
static bool cpu_common_exception_index_needed ( void * opaque )
{
CPUState * cpu = opaque ;
return tcg_enabled ( ) & & cpu - > exception_index ! = - 1 ;
}
static const VMStateDescription vmstate_cpu_common_exception_index = {
. name = " cpu_common/exception_index " ,
. version_id = 1 ,
. minimum_version_id = 1 ,
. needed = cpu_common_exception_index_needed ,
. fields = ( const VMStateField [ ] ) {
VMSTATE_INT32 ( exception_index , CPUState ) ,
VMSTATE_END_OF_LIST ( )
}
} ;
static bool cpu_common_crash_occurred_needed ( void * opaque )
{
CPUState * cpu = opaque ;
return cpu - > crash_occurred ;
}
static const VMStateDescription vmstate_cpu_common_crash_occurred = {
. name = " cpu_common/crash_occurred " ,
. version_id = 1 ,
. minimum_version_id = 1 ,
. needed = cpu_common_crash_occurred_needed ,
. fields = ( const VMStateField [ ] ) {
VMSTATE_BOOL ( crash_occurred , CPUState ) ,
VMSTATE_END_OF_LIST ( )
}
} ;
const VMStateDescription vmstate_cpu_common = {
. name = " cpu_common " ,
. version_id = 1 ,
. minimum_version_id = 1 ,
. pre_load = cpu_common_pre_load ,
. post_load = cpu_common_post_load ,
. fields = ( const VMStateField [ ] ) {
VMSTATE_UINT32 ( halted , CPUState ) ,
VMSTATE_UINT32 ( interrupt_request , CPUState ) ,
VMSTATE_END_OF_LIST ( )
} ,
. subsections = ( const VMStateDescription * const [ ] ) {
& vmstate_cpu_common_exception_index ,
& vmstate_cpu_common_crash_occurred ,
NULL
}
} ;
# endif
bool cpu_exec_realizefn ( CPUState * cpu , Error * * errp )
{
if ( ! accel_cpu_common_realize ( cpu , errp ) ) {
@ -139,33 +41,14 @@ bool cpu_exec_realizefn(CPUState *cpu, Error **errp)
/* Wait until cpu initialization complete before exposing cpu. */
cpu_list_add ( cpu ) ;
# ifdef CONFIG_USER_ONLY
assert ( qdev_get_vmsd ( DEVICE ( cpu ) ) = = NULL | |
qdev_get_vmsd ( DEVICE ( cpu ) ) - > unmigratable ) ;
# else
if ( qdev_get_vmsd ( DEVICE ( cpu ) ) = = NULL ) {
vmstate_register ( NULL , cpu - > cpu_index , & vmstate_cpu_common , cpu ) ;
}
if ( cpu - > cc - > sysemu_ops - > legacy_vmsd ! = NULL ) {
vmstate_register ( NULL , cpu - > cpu_index , cpu - > cc - > sysemu_ops - > legacy_vmsd , cpu ) ;
}
# endif /* CONFIG_USER_ONLY */
cpu_vmstate_register ( cpu ) ;
return true ;
}
void cpu_exec_unrealizefn ( CPUState * cpu )
{
# ifndef CONFIG_USER_ONLY
CPUClass * cc = CPU_GET_CLASS ( cpu ) ;
if ( cc - > sysemu_ops - > legacy_vmsd ! = NULL ) {
vmstate_unregister ( NULL , cc - > sysemu_ops - > legacy_vmsd , cpu ) ;
}
if ( qdev_get_vmsd ( DEVICE ( cpu ) ) = = NULL ) {
vmstate_unregister ( NULL , & vmstate_cpu_common , cpu ) ;
}
# endif
cpu_vmstate_unregister ( cpu ) ;
cpu_list_remove ( cpu ) ;
/*