mirror of https://github.com/xqemu/xqemu.git
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 "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),
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue