mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
s390x/flic: make floating interrupts on TCG actually floating
Move floating interrupt handling into the flic. Floating interrupts will now be considered by all CPUs, not just CPU #0. While at it, convert I/O interrupts to use a list and make sure we properly consider I/O sub-classes in s390_cpu_has_io_int(). Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20180129125623.21729-9-david@redhat.com> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
This commit is contained in:
parent
6ca62eb598
commit
b194e44785
6 changed files with 212 additions and 152 deletions
|
@ -16,6 +16,7 @@
|
|||
#include "hw/sysbus.h"
|
||||
#include "hw/s390x/adapter.h"
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "qemu/queue.h"
|
||||
|
||||
/*
|
||||
* Reserve enough gsis to accommodate all virtio devices.
|
||||
|
@ -85,12 +86,52 @@ typedef struct S390FLICStateClass {
|
|||
#define SIC_IRQ_MODE_SINGLE 1
|
||||
#define AIS_MODE_MASK(isc) (0x80 >> isc)
|
||||
|
||||
#define ISC_TO_PENDING_IO(_isc) (0x80 >> (_isc))
|
||||
#define CR6_TO_PENDING_IO(_cr6) (((_cr6) >> 24) & 0xff)
|
||||
|
||||
/* organize the ISC bits so that the macros above work */
|
||||
#define FLIC_PENDING_IO_ISC7 (1 << 0)
|
||||
#define FLIC_PENDING_IO_ISC6 (1 << 1)
|
||||
#define FLIC_PENDING_IO_ISC5 (1 << 2)
|
||||
#define FLIC_PENDING_IO_ISC4 (1 << 3)
|
||||
#define FLIC_PENDING_IO_ISC3 (1 << 4)
|
||||
#define FLIC_PENDING_IO_ISC2 (1 << 5)
|
||||
#define FLIC_PENDING_IO_ISC1 (1 << 6)
|
||||
#define FLIC_PENDING_IO_ISC0 (1 << 7)
|
||||
#define FLIC_PENDING_SERVICE (1 << 8)
|
||||
#define FLIC_PENDING_MCHK_CR (1 << 9)
|
||||
|
||||
#define FLIC_PENDING_IO (FLIC_PENDING_IO_ISC0 | FLIC_PENDING_IO_ISC1 | \
|
||||
FLIC_PENDING_IO_ISC2 | FLIC_PENDING_IO_ISC3 | \
|
||||
FLIC_PENDING_IO_ISC4 | FLIC_PENDING_IO_ISC5 | \
|
||||
FLIC_PENDING_IO_ISC6 | FLIC_PENDING_IO_ISC7)
|
||||
|
||||
typedef struct QEMUS390FlicIO {
|
||||
uint16_t id;
|
||||
uint16_t nr;
|
||||
uint32_t parm;
|
||||
uint32_t word;
|
||||
QLIST_ENTRY(QEMUS390FlicIO) next;
|
||||
} QEMUS390FlicIO;
|
||||
|
||||
typedef struct QEMUS390FLICState {
|
||||
S390FLICState parent_obj;
|
||||
uint32_t pending;
|
||||
uint32_t service_param;
|
||||
uint8_t simm;
|
||||
uint8_t nimm;
|
||||
QLIST_HEAD(, QEMUS390FlicIO) io[8];
|
||||
} QEMUS390FLICState;
|
||||
|
||||
uint32_t qemu_s390_flic_dequeue_service(QEMUS390FLICState *flic);
|
||||
QEMUS390FlicIO *qemu_s390_flic_dequeue_io(QEMUS390FLICState *flic,
|
||||
uint64_t cr6);
|
||||
void qemu_s390_flic_dequeue_crw_mchk(QEMUS390FLICState *flic);
|
||||
bool qemu_s390_flic_has_service(QEMUS390FLICState *flic);
|
||||
bool qemu_s390_flic_has_io(QEMUS390FLICState *fs, uint64_t cr6);
|
||||
bool qemu_s390_flic_has_crw_mchk(QEMUS390FLICState *flic);
|
||||
bool qemu_s390_flic_has_any(QEMUS390FLICState *flic);
|
||||
|
||||
void s390_flic_init(void);
|
||||
|
||||
S390FLICState *s390_get_flic(void);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue