xics: Explicitely call KVM ICS methods from the common code

The pre_save(), post_load() and synchronize_state() methods of the
ICSStateClass 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: <155023081817.1011724.14078777320394028836.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:40:18 +01:00 committed by David Gibson
parent 8c1ced677d
commit d80b2ccfa7
3 changed files with 18 additions and 24 deletions

View file

@ -58,7 +58,6 @@ void icp_pic_print_info(ICPState *icp, Monitor *mon)
void ics_pic_print_info(ICSState *ics, Monitor *mon) void ics_pic_print_info(ICSState *ics, Monitor *mon)
{ {
ICSStateClass *icsc = ICS_BASE_GET_CLASS(ics);
uint32_t i; uint32_t i;
monitor_printf(mon, "ICS %4x..%4x %p\n", monitor_printf(mon, "ICS %4x..%4x %p\n",
@ -68,8 +67,8 @@ void ics_pic_print_info(ICSState *ics, Monitor *mon)
return; return;
} }
if (icsc->synchronize_state) { if (kvm_irqchip_in_kernel()) {
icsc->synchronize_state(ics); ics_synchronize_state(ics);
} }
for (i = 0; i < ics->nr_irqs; i++) { for (i = 0; i < ics->nr_irqs; i++) {
@ -647,25 +646,23 @@ static void ics_base_instance_init(Object *obj)
ics->offset = XICS_IRQ_BASE; ics->offset = XICS_IRQ_BASE;
} }
static int ics_base_dispatch_pre_save(void *opaque) static int ics_base_pre_save(void *opaque)
{ {
ICSState *ics = opaque; ICSState *ics = opaque;
ICSStateClass *info = ICS_BASE_GET_CLASS(ics);
if (info->pre_save) { if (kvm_irqchip_in_kernel()) {
info->pre_save(ics); ics_get_kvm_state(ics);
} }
return 0; return 0;
} }
static int ics_base_dispatch_post_load(void *opaque, int version_id) static int ics_base_post_load(void *opaque, int version_id)
{ {
ICSState *ics = opaque; ICSState *ics = opaque;
ICSStateClass *info = ICS_BASE_GET_CLASS(ics);
if (info->post_load) { if (kvm_irqchip_in_kernel()) {
return info->post_load(ics, version_id); return ics_set_kvm_state(ics);
} }
return 0; return 0;
@ -689,8 +686,8 @@ static const VMStateDescription vmstate_ics_base = {
.name = "ics", .name = "ics",
.version_id = 1, .version_id = 1,
.minimum_version_id = 1, .minimum_version_id = 1,
.pre_save = ics_base_dispatch_pre_save, .pre_save = ics_base_pre_save,
.post_load = ics_base_dispatch_post_load, .post_load = ics_base_post_load,
.fields = (VMStateField[]) { .fields = (VMStateField[]) {
/* Sanity check */ /* Sanity check */
VMSTATE_UINT32_EQUAL(nr_irqs, ICSState, NULL), VMSTATE_UINT32_EQUAL(nr_irqs, ICSState, NULL),

View file

@ -155,7 +155,7 @@ void icp_kvm_realize(DeviceState *dev, Error **errp)
/* /*
* ICS-KVM * ICS-KVM
*/ */
static void ics_get_kvm_state(ICSState *ics) void ics_get_kvm_state(ICSState *ics)
{ {
uint64_t state; uint64_t state;
int i; int i;
@ -208,12 +208,12 @@ static void ics_get_kvm_state(ICSState *ics)
} }
} }
static void ics_synchronize_state(ICSState *ics) void ics_synchronize_state(ICSState *ics)
{ {
ics_get_kvm_state(ics); ics_get_kvm_state(ics);
} }
static int ics_set_kvm_state(ICSState *ics, int version_id) int ics_set_kvm_state(ICSState *ics)
{ {
uint64_t state; uint64_t state;
int i; int i;
@ -286,7 +286,7 @@ static void ics_kvm_reset(DeviceState *dev)
icsc->parent_reset(dev); icsc->parent_reset(dev);
ics_set_kvm_state(ICS_KVM(dev), 1); ics_set_kvm_state(ICS_KVM(dev));
} }
static void ics_kvm_reset_handler(void *dev) static void ics_kvm_reset_handler(void *dev)
@ -318,10 +318,6 @@ static void ics_kvm_class_init(ObjectClass *klass, void *data)
&icsc->parent_realize); &icsc->parent_realize);
device_class_set_parent_reset(dc, ics_kvm_reset, device_class_set_parent_reset(dc, ics_kvm_reset,
&icsc->parent_reset); &icsc->parent_reset);
icsc->pre_save = ics_get_kvm_state;
icsc->post_load = ics_set_kvm_state;
icsc->synchronize_state = ics_synchronize_state;
} }
static const TypeInfo ics_kvm_info = { static const TypeInfo ics_kvm_info = {

View file

@ -109,12 +109,9 @@ struct ICSStateClass {
DeviceRealize parent_realize; DeviceRealize parent_realize;
DeviceReset parent_reset; DeviceReset parent_reset;
void (*pre_save)(ICSState *s);
int (*post_load)(ICSState *s, int version_id);
void (*reject)(ICSState *s, uint32_t irq); void (*reject)(ICSState *s, uint32_t irq);
void (*resend)(ICSState *s); void (*resend)(ICSState *s);
void (*eoi)(ICSState *s, uint32_t irq); void (*eoi)(ICSState *s, uint32_t irq);
void (*synchronize_state)(ICSState *s);
}; };
struct ICSState { struct ICSState {
@ -201,4 +198,8 @@ int icp_set_kvm_state(ICPState *icp);
void icp_synchronize_state(ICPState *icp); void icp_synchronize_state(ICPState *icp);
void icp_kvm_realize(DeviceState *dev, Error **errp); void icp_kvm_realize(DeviceState *dev, Error **errp);
void ics_get_kvm_state(ICSState *ics);
int ics_set_kvm_state(ICSState *ics);
void ics_synchronize_state(ICSState *ics);
#endif /* XICS_H */ #endif /* XICS_H */