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:
Greg Kurz 2019-02-15 12:39:48 +01:00 committed by David Gibson
parent 3a0d802c17
commit 0e5c7fad9c
3 changed files with 20 additions and 25 deletions

View File

@ -37,18 +37,18 @@
#include "qapi/visitor.h" #include "qapi/visitor.h"
#include "monitor/monitor.h" #include "monitor/monitor.h"
#include "hw/intc/intc.h" #include "hw/intc/intc.h"
#include "sysemu/kvm.h"
void icp_pic_print_info(ICPState *icp, Monitor *mon) 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; int cpu_index = icp->cs ? icp->cs->cpu_index : -1;
if (!icp->output) { if (!icp->output) {
return; return;
} }
if (icpc->synchronize_state) { if (kvm_irqchip_in_kernel()) {
icpc->synchronize_state(icp); icp_synchronize_state(icp);
} }
monitor_printf(mon, "CPU %d XIRR=%08x (%p) PP=%02x MFRR=%02x\n", 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; ICPState *icp = opaque;
ICPStateClass *info = ICP_GET_CLASS(icp);
if (info->pre_save) { if (kvm_irqchip_in_kernel()) {
info->pre_save(icp); icp_get_kvm_state(icp);
} }
return 0; 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; ICPState *icp = opaque;
ICPStateClass *info = ICP_GET_CLASS(icp);
if (info->post_load) { if (kvm_irqchip_in_kernel()) {
return info->post_load(icp, version_id); return icp_set_kvm_state(icp);
} }
return 0; return 0;
@ -280,8 +278,8 @@ static const VMStateDescription vmstate_icp_server = {
.name = "icp/server", .name = "icp/server",
.version_id = 1, .version_id = 1,
.minimum_version_id = 1, .minimum_version_id = 1,
.pre_save = icp_dispatch_pre_save, .pre_save = icp_pre_save,
.post_load = icp_dispatch_post_load, .post_load = icp_post_load,
.fields = (VMStateField[]) { .fields = (VMStateField[]) {
/* Sanity check */ /* Sanity check */
VMSTATE_UINT32(xirr, ICPState), VMSTATE_UINT32(xirr, ICPState),

View File

@ -54,7 +54,7 @@ static QLIST_HEAD(, KVMEnabledICP)
/* /*
* ICP-KVM * ICP-KVM
*/ */
static void icp_get_kvm_state(ICPState *icp) void icp_get_kvm_state(ICPState *icp)
{ {
uint64_t state; uint64_t state;
int ret; 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); icp_get_kvm_state(arg.host_ptr);
} }
static void icp_synchronize_state(ICPState *icp) void icp_synchronize_state(ICPState *icp)
{ {
if (icp->cs) { if (icp->cs) {
run_on_cpu(icp->cs, do_icp_synchronize_state, RUN_ON_CPU_HOST_PTR(icp)); 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; uint64_t state;
int ret; int ret;
@ -121,7 +121,7 @@ static void icp_kvm_reset(DeviceState *dev)
icpc->parent_reset(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) 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); &icpc->parent_realize);
device_class_set_parent_reset(dc, icp_kvm_reset, device_class_set_parent_reset(dc, icp_kvm_reset,
&icpc->parent_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 = { static const TypeInfo icp_kvm_info = {

View File

@ -66,10 +66,6 @@ struct ICPStateClass {
DeviceRealize parent_realize; DeviceRealize parent_realize;
DeviceReset parent_reset; DeviceReset parent_reset;
void (*pre_save)(ICPState *icp);
int (*post_load)(ICPState *icp, int version_id);
void (*synchronize_state)(ICPState *icp);
}; };
struct ICPState { struct ICPState {
@ -203,4 +199,9 @@ void icp_resend(ICPState *ss);
Object *icp_create(Object *cpu, const char *type, XICSFabric *xi, Object *icp_create(Object *cpu, const char *type, XICSFabric *xi,
Error **errp); 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 */ #endif /* XICS_H */