xics: Explicitely call KVM ICP methods from the common code
The pre_save(), post_load() and synchronize_state() methods of the ICPStateClass type are really KVM only things. Make that obvious by dropping the indirections and directly calling the KVM functions instead. Signed-off-by: Greg Kurz <groug@kaod.org> Message-Id: <155023078871.1011724.3083923389814185598.stgit@bahia.lan> Reviewed-by: Cédric Le Goater <clg@kaod.org> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
3a0d802c17
commit
0e5c7fad9c
@ -37,18 +37,18 @@
|
||||
#include "qapi/visitor.h"
|
||||
#include "monitor/monitor.h"
|
||||
#include "hw/intc/intc.h"
|
||||
#include "sysemu/kvm.h"
|
||||
|
||||
void icp_pic_print_info(ICPState *icp, Monitor *mon)
|
||||
{
|
||||
ICPStateClass *icpc = ICP_GET_CLASS(icp);
|
||||
int cpu_index = icp->cs ? icp->cs->cpu_index : -1;
|
||||
|
||||
if (!icp->output) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (icpc->synchronize_state) {
|
||||
icpc->synchronize_state(icp);
|
||||
if (kvm_irqchip_in_kernel()) {
|
||||
icp_synchronize_state(icp);
|
||||
}
|
||||
|
||||
monitor_printf(mon, "CPU %d XIRR=%08x (%p) PP=%02x MFRR=%02x\n",
|
||||
@ -252,25 +252,23 @@ static void icp_irq(ICSState *ics, int server, int nr, uint8_t priority)
|
||||
}
|
||||
}
|
||||
|
||||
static int icp_dispatch_pre_save(void *opaque)
|
||||
static int icp_pre_save(void *opaque)
|
||||
{
|
||||
ICPState *icp = opaque;
|
||||
ICPStateClass *info = ICP_GET_CLASS(icp);
|
||||
|
||||
if (info->pre_save) {
|
||||
info->pre_save(icp);
|
||||
if (kvm_irqchip_in_kernel()) {
|
||||
icp_get_kvm_state(icp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int icp_dispatch_post_load(void *opaque, int version_id)
|
||||
static int icp_post_load(void *opaque, int version_id)
|
||||
{
|
||||
ICPState *icp = opaque;
|
||||
ICPStateClass *info = ICP_GET_CLASS(icp);
|
||||
|
||||
if (info->post_load) {
|
||||
return info->post_load(icp, version_id);
|
||||
if (kvm_irqchip_in_kernel()) {
|
||||
return icp_set_kvm_state(icp);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@ -280,8 +278,8 @@ static const VMStateDescription vmstate_icp_server = {
|
||||
.name = "icp/server",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.pre_save = icp_dispatch_pre_save,
|
||||
.post_load = icp_dispatch_post_load,
|
||||
.pre_save = icp_pre_save,
|
||||
.post_load = icp_post_load,
|
||||
.fields = (VMStateField[]) {
|
||||
/* Sanity check */
|
||||
VMSTATE_UINT32(xirr, ICPState),
|
||||
|
@ -54,7 +54,7 @@ static QLIST_HEAD(, KVMEnabledICP)
|
||||
/*
|
||||
* ICP-KVM
|
||||
*/
|
||||
static void icp_get_kvm_state(ICPState *icp)
|
||||
void icp_get_kvm_state(ICPState *icp)
|
||||
{
|
||||
uint64_t state;
|
||||
int ret;
|
||||
@ -83,14 +83,14 @@ static void do_icp_synchronize_state(CPUState *cpu, run_on_cpu_data arg)
|
||||
icp_get_kvm_state(arg.host_ptr);
|
||||
}
|
||||
|
||||
static void icp_synchronize_state(ICPState *icp)
|
||||
void icp_synchronize_state(ICPState *icp)
|
||||
{
|
||||
if (icp->cs) {
|
||||
run_on_cpu(icp->cs, do_icp_synchronize_state, RUN_ON_CPU_HOST_PTR(icp));
|
||||
}
|
||||
}
|
||||
|
||||
static int icp_set_kvm_state(ICPState *icp, int version_id)
|
||||
int icp_set_kvm_state(ICPState *icp)
|
||||
{
|
||||
uint64_t state;
|
||||
int ret;
|
||||
@ -121,7 +121,7 @@ static void icp_kvm_reset(DeviceState *dev)
|
||||
|
||||
icpc->parent_reset(dev);
|
||||
|
||||
icp_set_kvm_state(ICP(dev), 1);
|
||||
icp_set_kvm_state(ICP(dev));
|
||||
}
|
||||
|
||||
static void icp_kvm_realize(DeviceState *dev, Error **errp)
|
||||
@ -178,10 +178,6 @@ static void icp_kvm_class_init(ObjectClass *klass, void *data)
|
||||
&icpc->parent_realize);
|
||||
device_class_set_parent_reset(dc, icp_kvm_reset,
|
||||
&icpc->parent_reset);
|
||||
|
||||
icpc->pre_save = icp_get_kvm_state;
|
||||
icpc->post_load = icp_set_kvm_state;
|
||||
icpc->synchronize_state = icp_synchronize_state;
|
||||
}
|
||||
|
||||
static const TypeInfo icp_kvm_info = {
|
||||
|
@ -66,10 +66,6 @@ struct ICPStateClass {
|
||||
|
||||
DeviceRealize parent_realize;
|
||||
DeviceReset parent_reset;
|
||||
|
||||
void (*pre_save)(ICPState *icp);
|
||||
int (*post_load)(ICPState *icp, int version_id);
|
||||
void (*synchronize_state)(ICPState *icp);
|
||||
};
|
||||
|
||||
struct ICPState {
|
||||
@ -203,4 +199,9 @@ void icp_resend(ICPState *ss);
|
||||
Object *icp_create(Object *cpu, const char *type, XICSFabric *xi,
|
||||
Error **errp);
|
||||
|
||||
/* KVM */
|
||||
void icp_get_kvm_state(ICPState *icp);
|
||||
int icp_set_kvm_state(ICPState *icp);
|
||||
void icp_synchronize_state(ICPState *icp);
|
||||
|
||||
#endif /* XICS_H */
|
||||
|
Loading…
Reference in New Issue
Block a user