qemu/hw/s390x/sclpcpu.c
Markus Armbruster d5938f29fe Clean up inclusion of sysemu/sysemu.h
In my "build everything" tree, changing sysemu/sysemu.h triggers a
recompile of some 5400 out of 6600 objects (not counting tests and
objects that don't depend on qemu/osdep.h).

Almost a third of its inclusions are actually superfluous.  Delete
them.  Downgrade two more to qapi/qapi-types-run-state.h, and move one
from char/serial.h to char/serial.c.

hw/semihosting/config.c, monitor/monitor.c, qdev-monitor.c, and
stubs/semihost.c define variables declared in sysemu/sysemu.h without
including it.  The compiler is cool with that, but include it anyway.

This doesn't reduce actual use much, as it's still included into
widely included headers.  The next commit will tackle that.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Message-Id: <20190812052359.30071-27-armbru@redhat.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
2019-08-16 13:31:53 +02:00

108 lines
2.6 KiB
C

/*
* SCLP event type
* Signal CPU - Trigger SCLP interrupt for system CPU configure or
* de-configure
*
* Copyright IBM, Corp. 2013
*
* Authors:
* Thang Pham <thang.pham@us.ibm.com>
*
* This work is licensed under the terms of the GNU GPL, version 2 or (at your
* option) any later version. See the COPYING file in the top-level directory.
*
*/
#include "qemu/osdep.h"
#include "hw/s390x/sclp.h"
#include "qemu/module.h"
#include "hw/s390x/event-facility.h"
#include "cpu.h"
#include "sysemu/cpus.h"
typedef struct ConfigMgtData {
EventBufferHeader ebh;
uint8_t reserved;
uint8_t event_qualifier;
} QEMU_PACKED ConfigMgtData;
#define EVENT_QUAL_CPU_CHANGE 1
void raise_irq_cpu_hotplug(void)
{
Object *obj = object_resolve_path_type("", TYPE_SCLP_CPU_HOTPLUG, NULL);
SCLP_EVENT(obj)->event_pending = true;
/* Trigger SCLP read operation */
sclp_service_interrupt(0);
}
static sccb_mask_t send_mask(void)
{
return SCLP_EVENT_MASK_CONFIG_MGT_DATA;
}
static sccb_mask_t receive_mask(void)
{
return 0;
}
static int read_event_data(SCLPEvent *event, EventBufferHeader *evt_buf_hdr,
int *slen)
{
ConfigMgtData *cdata = (ConfigMgtData *) evt_buf_hdr;
if (*slen < sizeof(ConfigMgtData)) {
return 0;
}
/* Event is no longer pending */
if (!event->event_pending) {
return 0;
}
event->event_pending = false;
/* Event header data */
cdata->ebh.length = cpu_to_be16(sizeof(ConfigMgtData));
cdata->ebh.type = SCLP_EVENT_CONFIG_MGT_DATA;
cdata->ebh.flags |= SCLP_EVENT_BUFFER_ACCEPTED;
/* Trigger a rescan of CPUs by setting event qualifier */
cdata->event_qualifier = EVENT_QUAL_CPU_CHANGE;
*slen -= sizeof(ConfigMgtData);
return 1;
}
static void cpu_class_init(ObjectClass *oc, void *data)
{
SCLPEventClass *k = SCLP_EVENT_CLASS(oc);
DeviceClass *dc = DEVICE_CLASS(oc);
k->get_send_mask = send_mask;
k->get_receive_mask = receive_mask;
k->read_event_data = read_event_data;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
/*
* Reason: raise_irq_cpu_hotplug() depends on an unique
* TYPE_SCLP_CPU_HOTPLUG device, which is already created
* by the sclp event facility
*/
dc->user_creatable = false;
}
static const TypeInfo sclp_cpu_info = {
.name = TYPE_SCLP_CPU_HOTPLUG,
.parent = TYPE_SCLP_EVENT,
.instance_size = sizeof(SCLPEvent),
.class_init = cpu_class_init,
.class_size = sizeof(SCLPEventClass),
};
static void sclp_cpu_register_types(void)
{
type_register_static(&sclp_cpu_info);
}
type_init(sclp_cpu_register_types)