]> git.proxmox.com Git - qemu.git/blame - hw/s390x/sclp.h
build: enable using $(CONFIG_FOO) on the rhs of config files
[qemu.git] / hw / s390x / sclp.h
CommitLineData
f6c98f92
HG
1/*
2 * SCLP Support
3 *
4 * Copyright IBM, Corp. 2012
5 *
6 * Authors:
7 * Christian Borntraeger <borntraeger@de.ibm.com>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2 or (at your
10 * option) any later version. See the COPYING file in the top-level directory.
11 *
12 */
13
14#ifndef HW_S390_SCLP_H
15#define HW_S390_SCLP_H
16
17#include <hw/sysbus.h>
18#include <hw/qdev.h>
19
20/* SCLP command codes */
21#define SCLP_CMDW_READ_SCP_INFO 0x00020001
22#define SCLP_CMDW_READ_SCP_INFO_FORCED 0x00120001
559a17a1
HG
23#define SCLP_CMD_READ_EVENT_DATA 0x00770005
24#define SCLP_CMD_WRITE_EVENT_DATA 0x00760005
25#define SCLP_CMD_READ_EVENT_DATA 0x00770005
26#define SCLP_CMD_WRITE_EVENT_DATA 0x00760005
27#define SCLP_CMD_WRITE_EVENT_MASK 0x00780005
f6c98f92
HG
28
29/* SCLP response codes */
30#define SCLP_RC_NORMAL_READ_COMPLETION 0x0010
559a17a1 31#define SCLP_RC_NORMAL_COMPLETION 0x0020
f6c98f92 32#define SCLP_RC_INVALID_SCLP_COMMAND 0x01f0
559a17a1
HG
33#define SCLP_RC_CONTAINED_EQUIPMENT_CHECK 0x0340
34#define SCLP_RC_INSUFFICIENT_SCCB_LENGTH 0x0300
35#define SCLP_RC_INVALID_FUNCTION 0x40f0
36#define SCLP_RC_NO_EVENT_BUFFERS_STORED 0x60f0
37#define SCLP_RC_INVALID_SELECTION_MASK 0x70f0
38#define SCLP_RC_INCONSISTENT_LENGTHS 0x72f0
39#define SCLP_RC_EVENT_BUFFER_SYNTAX_ERROR 0x73f0
40#define SCLP_RC_INVALID_MASK_LENGTH 0x74f0
41
f6c98f92
HG
42
43/* Service Call Control Block (SCCB) and its elements */
44
45#define SCCB_SIZE 4096
46
559a17a1
HG
47#define SCLP_VARIABLE_LENGTH_RESPONSE 0x80
48#define SCLP_EVENT_BUFFER_ACCEPTED 0x80
49
50#define SCLP_FC_NORMAL_WRITE 0
51
f6c98f92
HG
52/*
53 * Normally packed structures are not the right thing to do, since all code
8367a14f 54 * must take care of endianness. We cannot use ldl_phys and friends for two
f6c98f92
HG
55 * reasons, though:
56 * - some of the embedded structures below the SCCB can appear multiple times
57 * at different locations, so there is no fixed offset
58 * - we work on a private copy of the SCCB, since there are several length
59 * fields, that would cause a security nightmare if we allow the guest to
60 * alter the structure while we parse it. We cannot use ldl_p and friends
61 * either without doing pointer arithmetics
62 * So we have to double check that all users of sclp data structures use the
8367a14f 63 * right endianness wrappers.
f6c98f92
HG
64 */
65typedef struct SCCBHeader {
66 uint16_t length;
67 uint8_t function_code;
68 uint8_t control_mask[3];
69 uint16_t response_code;
70} QEMU_PACKED SCCBHeader;
71
72#define SCCB_DATA_LEN (SCCB_SIZE - sizeof(SCCBHeader))
73
74typedef struct ReadInfo {
75 SCCBHeader h;
76 uint16_t rnmax;
77 uint8_t rnsize;
78} QEMU_PACKED ReadInfo;
79
80typedef struct SCCB {
81 SCCBHeader h;
82 char data[SCCB_DATA_LEN];
83 } QEMU_PACKED SCCB;
84
559a17a1
HG
85static inline int sccb_data_len(SCCB *sccb)
86{
87 return be16_to_cpu(sccb->h.length) - sizeof(sccb->h);
88}
89
90#define TYPE_DEVICE_S390_SCLP "s390-sclp-device"
91#define SCLP_S390_DEVICE(obj) \
92 OBJECT_CHECK(S390SCLPDevice, (obj), TYPE_DEVICE_S390_SCLP)
93#define SCLP_S390_DEVICE_CLASS(klass) \
94 OBJECT_CLASS_CHECK(S390SCLPDeviceClass, (klass), \
95 TYPE_DEVICE_S390_SCLP)
96#define SCLP_S390_DEVICE_GET_CLASS(obj) \
97 OBJECT_GET_CLASS(S390SCLPDeviceClass, (obj), \
98 TYPE_DEVICE_S390_SCLP)
99
100typedef struct SCLPEventFacility SCLPEventFacility;
101
f6c98f92
HG
102typedef struct S390SCLPDevice {
103 SysBusDevice busdev;
559a17a1
HG
104 SCLPEventFacility *ef;
105 void (*sclp_command_handler)(SCLPEventFacility *ef, SCCB *sccb,
106 uint64_t code);
107 bool (*event_pending)(SCLPEventFacility *ef);
f6c98f92
HG
108} S390SCLPDevice;
109
110typedef struct S390SCLPDeviceClass {
111 DeviceClass qdev;
112 int (*init)(S390SCLPDevice *sdev);
113} S390SCLPDeviceClass;
114
559a17a1 115void s390_sclp_init(void);
f6c98f92
HG
116void sclp_service_interrupt(uint32_t sccb);
117
118#endif