Since we introduced CPU hot-unplug in sPAPR, we don't unrealize the vCPU objects explicitly. Instead, we let QOM handle that for us under object_property_del_all() when the CPU core object is finalized. The only thing we do is calling cpu_remove_sync() to tear the vCPU thread down. This happens to work but it is ugly because: - we call qdev_realize() but the corresponding qdev_unrealize() is buried deep in the QOM code - we call cpu_remove_sync() to undo qemu_init_vcpu() called by ppc_cpu_realize() in target/ppc/translate_init.c.inc - the CPU init and teardown paths aren't really symmetrical The latter didn't bite us so far but a future patch that greatly simplifies the CPU core realize path needs it to avoid a crash in QOM. For all these reasons, have ppc_cpu_unrealize() to undo the changes of ppc_cpu_realize() by calling cpu_remove_sync() at the right place, and have the sPAPR CPU core code to call qdev_unrealize(). This requires to add a missing stub because translate_init.c.inc is also compiled for user mode. Signed-off-by: Greg Kurz <groug@kaod.org> Message-Id: <160279671236.1808373.14732005038172874990.stgit@bahia.lan> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
		
			
				
	
	
		
			41 lines
		
	
	
		
			523 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			41 lines
		
	
	
		
			523 B
		
	
	
	
		
			C
		
	
	
	
	
	
#include "qemu/osdep.h"
 | 
						|
#include "hw/core/cpu.h"
 | 
						|
#include "sysemu/replay.h"
 | 
						|
#include "sysemu/sysemu.h"
 | 
						|
 | 
						|
bool enable_cpu_pm = false;
 | 
						|
 | 
						|
void cpu_resume(CPUState *cpu)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void cpu_remove_sync(CPUState *cpu)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
void qemu_init_vcpu(CPUState *cpu)
 | 
						|
{
 | 
						|
}
 | 
						|
 | 
						|
/* User mode emulation does not support record/replay yet.  */
 | 
						|
 | 
						|
bool replay_exception(void)
 | 
						|
{
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
bool replay_has_exception(void)
 | 
						|
{
 | 
						|
    return false;
 | 
						|
}
 | 
						|
 | 
						|
bool replay_interrupt(void)
 | 
						|
{
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
bool replay_has_interrupt(void)
 | 
						|
{
 | 
						|
    return false;
 | 
						|
}
 |