xref: /openbmc/qemu/target/s390x/cpu.h (revision fcf5ef2ab52c621a4617ebbef36bf43b4003f4c0)
1*fcf5ef2aSThomas Huth /*
2*fcf5ef2aSThomas Huth  * S/390 virtual CPU header
3*fcf5ef2aSThomas Huth  *
4*fcf5ef2aSThomas Huth  *  Copyright (c) 2009 Ulrich Hecht
5*fcf5ef2aSThomas Huth  *
6*fcf5ef2aSThomas Huth  * This library is free software; you can redistribute it and/or
7*fcf5ef2aSThomas Huth  * modify it under the terms of the GNU Lesser General Public
8*fcf5ef2aSThomas Huth  * License as published by the Free Software Foundation; either
9*fcf5ef2aSThomas Huth  * version 2 of the License, or (at your option) any later version.
10*fcf5ef2aSThomas Huth  *
11*fcf5ef2aSThomas Huth  * This library is distributed in the hope that it will be useful,
12*fcf5ef2aSThomas Huth  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*fcf5ef2aSThomas Huth  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14*fcf5ef2aSThomas Huth  * Lesser General Public License for more details.
15*fcf5ef2aSThomas Huth  *
16*fcf5ef2aSThomas Huth  * Contributions after 2012-10-29 are licensed under the terms of the
17*fcf5ef2aSThomas Huth  * GNU GPL, version 2 or (at your option) any later version.
18*fcf5ef2aSThomas Huth  *
19*fcf5ef2aSThomas Huth  * You should have received a copy of the GNU (Lesser) General Public
20*fcf5ef2aSThomas Huth  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
21*fcf5ef2aSThomas Huth  */
22*fcf5ef2aSThomas Huth 
23*fcf5ef2aSThomas Huth #ifndef S390X_CPU_H
24*fcf5ef2aSThomas Huth #define S390X_CPU_H
25*fcf5ef2aSThomas Huth 
26*fcf5ef2aSThomas Huth #include "qemu-common.h"
27*fcf5ef2aSThomas Huth #include "cpu-qom.h"
28*fcf5ef2aSThomas Huth 
29*fcf5ef2aSThomas Huth #define TARGET_LONG_BITS 64
30*fcf5ef2aSThomas Huth 
31*fcf5ef2aSThomas Huth #define ELF_MACHINE_UNAME "S390X"
32*fcf5ef2aSThomas Huth 
33*fcf5ef2aSThomas Huth #define CPUArchState struct CPUS390XState
34*fcf5ef2aSThomas Huth 
35*fcf5ef2aSThomas Huth #include "exec/cpu-defs.h"
36*fcf5ef2aSThomas Huth #define TARGET_PAGE_BITS 12
37*fcf5ef2aSThomas Huth 
38*fcf5ef2aSThomas Huth #define TARGET_PHYS_ADDR_SPACE_BITS 64
39*fcf5ef2aSThomas Huth #define TARGET_VIRT_ADDR_SPACE_BITS 64
40*fcf5ef2aSThomas Huth 
41*fcf5ef2aSThomas Huth #include "exec/cpu-all.h"
42*fcf5ef2aSThomas Huth 
43*fcf5ef2aSThomas Huth #include "fpu/softfloat.h"
44*fcf5ef2aSThomas Huth 
45*fcf5ef2aSThomas Huth #define NB_MMU_MODES 3
46*fcf5ef2aSThomas Huth #define TARGET_INSN_START_EXTRA_WORDS 1
47*fcf5ef2aSThomas Huth 
48*fcf5ef2aSThomas Huth #define MMU_MODE0_SUFFIX _primary
49*fcf5ef2aSThomas Huth #define MMU_MODE1_SUFFIX _secondary
50*fcf5ef2aSThomas Huth #define MMU_MODE2_SUFFIX _home
51*fcf5ef2aSThomas Huth 
52*fcf5ef2aSThomas Huth #define MMU_USER_IDX 0
53*fcf5ef2aSThomas Huth 
54*fcf5ef2aSThomas Huth #define MAX_EXT_QUEUE 16
55*fcf5ef2aSThomas Huth #define MAX_IO_QUEUE 16
56*fcf5ef2aSThomas Huth #define MAX_MCHK_QUEUE 16
57*fcf5ef2aSThomas Huth 
58*fcf5ef2aSThomas Huth #define PSW_MCHK_MASK 0x0004000000000000
59*fcf5ef2aSThomas Huth #define PSW_IO_MASK 0x0200000000000000
60*fcf5ef2aSThomas Huth 
61*fcf5ef2aSThomas Huth typedef struct PSW {
62*fcf5ef2aSThomas Huth     uint64_t mask;
63*fcf5ef2aSThomas Huth     uint64_t addr;
64*fcf5ef2aSThomas Huth } PSW;
65*fcf5ef2aSThomas Huth 
66*fcf5ef2aSThomas Huth typedef struct ExtQueue {
67*fcf5ef2aSThomas Huth     uint32_t code;
68*fcf5ef2aSThomas Huth     uint32_t param;
69*fcf5ef2aSThomas Huth     uint32_t param64;
70*fcf5ef2aSThomas Huth } ExtQueue;
71*fcf5ef2aSThomas Huth 
72*fcf5ef2aSThomas Huth typedef struct IOIntQueue {
73*fcf5ef2aSThomas Huth     uint16_t id;
74*fcf5ef2aSThomas Huth     uint16_t nr;
75*fcf5ef2aSThomas Huth     uint32_t parm;
76*fcf5ef2aSThomas Huth     uint32_t word;
77*fcf5ef2aSThomas Huth } IOIntQueue;
78*fcf5ef2aSThomas Huth 
79*fcf5ef2aSThomas Huth typedef struct MchkQueue {
80*fcf5ef2aSThomas Huth     uint16_t type;
81*fcf5ef2aSThomas Huth } MchkQueue;
82*fcf5ef2aSThomas Huth 
83*fcf5ef2aSThomas Huth typedef struct CPUS390XState {
84*fcf5ef2aSThomas Huth     uint64_t regs[16];     /* GP registers */
85*fcf5ef2aSThomas Huth     /*
86*fcf5ef2aSThomas Huth      * The floating point registers are part of the vector registers.
87*fcf5ef2aSThomas Huth      * vregs[0][0] -> vregs[15][0] are 16 floating point registers
88*fcf5ef2aSThomas Huth      */
89*fcf5ef2aSThomas Huth     CPU_DoubleU vregs[32][2];  /* vector registers */
90*fcf5ef2aSThomas Huth     uint32_t aregs[16];    /* access registers */
91*fcf5ef2aSThomas Huth 
92*fcf5ef2aSThomas Huth     uint32_t fpc;          /* floating-point control register */
93*fcf5ef2aSThomas Huth     uint32_t cc_op;
94*fcf5ef2aSThomas Huth 
95*fcf5ef2aSThomas Huth     float_status fpu_status; /* passed to softfloat lib */
96*fcf5ef2aSThomas Huth 
97*fcf5ef2aSThomas Huth     /* The low part of a 128-bit return, or remainder of a divide.  */
98*fcf5ef2aSThomas Huth     uint64_t retxl;
99*fcf5ef2aSThomas Huth 
100*fcf5ef2aSThomas Huth     PSW psw;
101*fcf5ef2aSThomas Huth 
102*fcf5ef2aSThomas Huth     uint64_t cc_src;
103*fcf5ef2aSThomas Huth     uint64_t cc_dst;
104*fcf5ef2aSThomas Huth     uint64_t cc_vr;
105*fcf5ef2aSThomas Huth 
106*fcf5ef2aSThomas Huth     uint64_t __excp_addr;
107*fcf5ef2aSThomas Huth     uint64_t psa;
108*fcf5ef2aSThomas Huth 
109*fcf5ef2aSThomas Huth     uint32_t int_pgm_code;
110*fcf5ef2aSThomas Huth     uint32_t int_pgm_ilen;
111*fcf5ef2aSThomas Huth 
112*fcf5ef2aSThomas Huth     uint32_t int_svc_code;
113*fcf5ef2aSThomas Huth     uint32_t int_svc_ilen;
114*fcf5ef2aSThomas Huth 
115*fcf5ef2aSThomas Huth     uint64_t per_address;
116*fcf5ef2aSThomas Huth     uint16_t per_perc_atmid;
117*fcf5ef2aSThomas Huth 
118*fcf5ef2aSThomas Huth     uint64_t cregs[16]; /* control registers */
119*fcf5ef2aSThomas Huth 
120*fcf5ef2aSThomas Huth     ExtQueue ext_queue[MAX_EXT_QUEUE];
121*fcf5ef2aSThomas Huth     IOIntQueue io_queue[MAX_IO_QUEUE][8];
122*fcf5ef2aSThomas Huth     MchkQueue mchk_queue[MAX_MCHK_QUEUE];
123*fcf5ef2aSThomas Huth 
124*fcf5ef2aSThomas Huth     int pending_int;
125*fcf5ef2aSThomas Huth     int ext_index;
126*fcf5ef2aSThomas Huth     int io_index[8];
127*fcf5ef2aSThomas Huth     int mchk_index;
128*fcf5ef2aSThomas Huth 
129*fcf5ef2aSThomas Huth     uint64_t ckc;
130*fcf5ef2aSThomas Huth     uint64_t cputm;
131*fcf5ef2aSThomas Huth     uint32_t todpr;
132*fcf5ef2aSThomas Huth 
133*fcf5ef2aSThomas Huth     uint64_t pfault_token;
134*fcf5ef2aSThomas Huth     uint64_t pfault_compare;
135*fcf5ef2aSThomas Huth     uint64_t pfault_select;
136*fcf5ef2aSThomas Huth 
137*fcf5ef2aSThomas Huth     uint64_t gbea;
138*fcf5ef2aSThomas Huth     uint64_t pp;
139*fcf5ef2aSThomas Huth 
140*fcf5ef2aSThomas Huth     uint8_t riccb[64];
141*fcf5ef2aSThomas Huth 
142*fcf5ef2aSThomas Huth     CPU_COMMON
143*fcf5ef2aSThomas Huth 
144*fcf5ef2aSThomas Huth     /* reset does memset(0) up to here */
145*fcf5ef2aSThomas Huth 
146*fcf5ef2aSThomas Huth     uint32_t cpu_num;
147*fcf5ef2aSThomas Huth     uint32_t machine_type;
148*fcf5ef2aSThomas Huth 
149*fcf5ef2aSThomas Huth     uint64_t tod_offset;
150*fcf5ef2aSThomas Huth     uint64_t tod_basetime;
151*fcf5ef2aSThomas Huth     QEMUTimer *tod_timer;
152*fcf5ef2aSThomas Huth 
153*fcf5ef2aSThomas Huth     QEMUTimer *cpu_timer;
154*fcf5ef2aSThomas Huth 
155*fcf5ef2aSThomas Huth     /*
156*fcf5ef2aSThomas Huth      * The cpu state represents the logical state of a cpu. In contrast to other
157*fcf5ef2aSThomas Huth      * architectures, there is a difference between a halt and a stop on s390.
158*fcf5ef2aSThomas Huth      * If all cpus are either stopped (including check stop) or in the disabled
159*fcf5ef2aSThomas Huth      * wait state, the vm can be shut down.
160*fcf5ef2aSThomas Huth      */
161*fcf5ef2aSThomas Huth #define CPU_STATE_UNINITIALIZED        0x00
162*fcf5ef2aSThomas Huth #define CPU_STATE_STOPPED              0x01
163*fcf5ef2aSThomas Huth #define CPU_STATE_CHECK_STOP           0x02
164*fcf5ef2aSThomas Huth #define CPU_STATE_OPERATING            0x03
165*fcf5ef2aSThomas Huth #define CPU_STATE_LOAD                 0x04
166*fcf5ef2aSThomas Huth     uint8_t cpu_state;
167*fcf5ef2aSThomas Huth 
168*fcf5ef2aSThomas Huth     /* currently processed sigp order */
169*fcf5ef2aSThomas Huth     uint8_t sigp_order;
170*fcf5ef2aSThomas Huth 
171*fcf5ef2aSThomas Huth } CPUS390XState;
172*fcf5ef2aSThomas Huth 
173*fcf5ef2aSThomas Huth static inline CPU_DoubleU *get_freg(CPUS390XState *cs, int nr)
174*fcf5ef2aSThomas Huth {
175*fcf5ef2aSThomas Huth     return &cs->vregs[nr][0];
176*fcf5ef2aSThomas Huth }
177*fcf5ef2aSThomas Huth 
178*fcf5ef2aSThomas Huth /**
179*fcf5ef2aSThomas Huth  * S390CPU:
180*fcf5ef2aSThomas Huth  * @env: #CPUS390XState.
181*fcf5ef2aSThomas Huth  *
182*fcf5ef2aSThomas Huth  * An S/390 CPU.
183*fcf5ef2aSThomas Huth  */
184*fcf5ef2aSThomas Huth struct S390CPU {
185*fcf5ef2aSThomas Huth     /*< private >*/
186*fcf5ef2aSThomas Huth     CPUState parent_obj;
187*fcf5ef2aSThomas Huth     /*< public >*/
188*fcf5ef2aSThomas Huth 
189*fcf5ef2aSThomas Huth     CPUS390XState env;
190*fcf5ef2aSThomas Huth     int64_t id;
191*fcf5ef2aSThomas Huth     S390CPUModel *model;
192*fcf5ef2aSThomas Huth     /* needed for live migration */
193*fcf5ef2aSThomas Huth     void *irqstate;
194*fcf5ef2aSThomas Huth     uint32_t irqstate_saved_size;
195*fcf5ef2aSThomas Huth };
196*fcf5ef2aSThomas Huth 
197*fcf5ef2aSThomas Huth static inline S390CPU *s390_env_get_cpu(CPUS390XState *env)
198*fcf5ef2aSThomas Huth {
199*fcf5ef2aSThomas Huth     return container_of(env, S390CPU, env);
200*fcf5ef2aSThomas Huth }
201*fcf5ef2aSThomas Huth 
202*fcf5ef2aSThomas Huth #define ENV_GET_CPU(e) CPU(s390_env_get_cpu(e))
203*fcf5ef2aSThomas Huth 
204*fcf5ef2aSThomas Huth #define ENV_OFFSET offsetof(S390CPU, env)
205*fcf5ef2aSThomas Huth 
206*fcf5ef2aSThomas Huth #ifndef CONFIG_USER_ONLY
207*fcf5ef2aSThomas Huth extern const struct VMStateDescription vmstate_s390_cpu;
208*fcf5ef2aSThomas Huth #endif
209*fcf5ef2aSThomas Huth 
210*fcf5ef2aSThomas Huth void s390_cpu_do_interrupt(CPUState *cpu);
211*fcf5ef2aSThomas Huth bool s390_cpu_exec_interrupt(CPUState *cpu, int int_req);
212*fcf5ef2aSThomas Huth void s390_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
213*fcf5ef2aSThomas Huth                          int flags);
214*fcf5ef2aSThomas Huth int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
215*fcf5ef2aSThomas Huth                               int cpuid, void *opaque);
216*fcf5ef2aSThomas Huth 
217*fcf5ef2aSThomas Huth hwaddr s390_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
218*fcf5ef2aSThomas Huth hwaddr s390_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
219*fcf5ef2aSThomas Huth int s390_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
220*fcf5ef2aSThomas Huth int s390_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
221*fcf5ef2aSThomas Huth void s390_cpu_gdb_init(CPUState *cs);
222*fcf5ef2aSThomas Huth void s390x_cpu_debug_excp_handler(CPUState *cs);
223*fcf5ef2aSThomas Huth 
224*fcf5ef2aSThomas Huth #include "sysemu/kvm.h"
225*fcf5ef2aSThomas Huth 
226*fcf5ef2aSThomas Huth /* distinguish between 24 bit and 31 bit addressing */
227*fcf5ef2aSThomas Huth #define HIGH_ORDER_BIT 0x80000000
228*fcf5ef2aSThomas Huth 
229*fcf5ef2aSThomas Huth /* Interrupt Codes */
230*fcf5ef2aSThomas Huth /* Program Interrupts */
231*fcf5ef2aSThomas Huth #define PGM_OPERATION                   0x0001
232*fcf5ef2aSThomas Huth #define PGM_PRIVILEGED                  0x0002
233*fcf5ef2aSThomas Huth #define PGM_EXECUTE                     0x0003
234*fcf5ef2aSThomas Huth #define PGM_PROTECTION                  0x0004
235*fcf5ef2aSThomas Huth #define PGM_ADDRESSING                  0x0005
236*fcf5ef2aSThomas Huth #define PGM_SPECIFICATION               0x0006
237*fcf5ef2aSThomas Huth #define PGM_DATA                        0x0007
238*fcf5ef2aSThomas Huth #define PGM_FIXPT_OVERFLOW              0x0008
239*fcf5ef2aSThomas Huth #define PGM_FIXPT_DIVIDE                0x0009
240*fcf5ef2aSThomas Huth #define PGM_DEC_OVERFLOW                0x000a
241*fcf5ef2aSThomas Huth #define PGM_DEC_DIVIDE                  0x000b
242*fcf5ef2aSThomas Huth #define PGM_HFP_EXP_OVERFLOW            0x000c
243*fcf5ef2aSThomas Huth #define PGM_HFP_EXP_UNDERFLOW           0x000d
244*fcf5ef2aSThomas Huth #define PGM_HFP_SIGNIFICANCE            0x000e
245*fcf5ef2aSThomas Huth #define PGM_HFP_DIVIDE                  0x000f
246*fcf5ef2aSThomas Huth #define PGM_SEGMENT_TRANS               0x0010
247*fcf5ef2aSThomas Huth #define PGM_PAGE_TRANS                  0x0011
248*fcf5ef2aSThomas Huth #define PGM_TRANS_SPEC                  0x0012
249*fcf5ef2aSThomas Huth #define PGM_SPECIAL_OP                  0x0013
250*fcf5ef2aSThomas Huth #define PGM_OPERAND                     0x0015
251*fcf5ef2aSThomas Huth #define PGM_TRACE_TABLE                 0x0016
252*fcf5ef2aSThomas Huth #define PGM_SPACE_SWITCH                0x001c
253*fcf5ef2aSThomas Huth #define PGM_HFP_SQRT                    0x001d
254*fcf5ef2aSThomas Huth #define PGM_PC_TRANS_SPEC               0x001f
255*fcf5ef2aSThomas Huth #define PGM_AFX_TRANS                   0x0020
256*fcf5ef2aSThomas Huth #define PGM_ASX_TRANS                   0x0021
257*fcf5ef2aSThomas Huth #define PGM_LX_TRANS                    0x0022
258*fcf5ef2aSThomas Huth #define PGM_EX_TRANS                    0x0023
259*fcf5ef2aSThomas Huth #define PGM_PRIM_AUTH                   0x0024
260*fcf5ef2aSThomas Huth #define PGM_SEC_AUTH                    0x0025
261*fcf5ef2aSThomas Huth #define PGM_ALET_SPEC                   0x0028
262*fcf5ef2aSThomas Huth #define PGM_ALEN_SPEC                   0x0029
263*fcf5ef2aSThomas Huth #define PGM_ALE_SEQ                     0x002a
264*fcf5ef2aSThomas Huth #define PGM_ASTE_VALID                  0x002b
265*fcf5ef2aSThomas Huth #define PGM_ASTE_SEQ                    0x002c
266*fcf5ef2aSThomas Huth #define PGM_EXT_AUTH                    0x002d
267*fcf5ef2aSThomas Huth #define PGM_STACK_FULL                  0x0030
268*fcf5ef2aSThomas Huth #define PGM_STACK_EMPTY                 0x0031
269*fcf5ef2aSThomas Huth #define PGM_STACK_SPEC                  0x0032
270*fcf5ef2aSThomas Huth #define PGM_STACK_TYPE                  0x0033
271*fcf5ef2aSThomas Huth #define PGM_STACK_OP                    0x0034
272*fcf5ef2aSThomas Huth #define PGM_ASCE_TYPE                   0x0038
273*fcf5ef2aSThomas Huth #define PGM_REG_FIRST_TRANS             0x0039
274*fcf5ef2aSThomas Huth #define PGM_REG_SEC_TRANS               0x003a
275*fcf5ef2aSThomas Huth #define PGM_REG_THIRD_TRANS             0x003b
276*fcf5ef2aSThomas Huth #define PGM_MONITOR                     0x0040
277*fcf5ef2aSThomas Huth #define PGM_PER                         0x0080
278*fcf5ef2aSThomas Huth #define PGM_CRYPTO                      0x0119
279*fcf5ef2aSThomas Huth 
280*fcf5ef2aSThomas Huth /* External Interrupts */
281*fcf5ef2aSThomas Huth #define EXT_INTERRUPT_KEY               0x0040
282*fcf5ef2aSThomas Huth #define EXT_CLOCK_COMP                  0x1004
283*fcf5ef2aSThomas Huth #define EXT_CPU_TIMER                   0x1005
284*fcf5ef2aSThomas Huth #define EXT_MALFUNCTION                 0x1200
285*fcf5ef2aSThomas Huth #define EXT_EMERGENCY                   0x1201
286*fcf5ef2aSThomas Huth #define EXT_EXTERNAL_CALL               0x1202
287*fcf5ef2aSThomas Huth #define EXT_ETR                         0x1406
288*fcf5ef2aSThomas Huth #define EXT_SERVICE                     0x2401
289*fcf5ef2aSThomas Huth #define EXT_VIRTIO                      0x2603
290*fcf5ef2aSThomas Huth 
291*fcf5ef2aSThomas Huth /* PSW defines */
292*fcf5ef2aSThomas Huth #undef PSW_MASK_PER
293*fcf5ef2aSThomas Huth #undef PSW_MASK_DAT
294*fcf5ef2aSThomas Huth #undef PSW_MASK_IO
295*fcf5ef2aSThomas Huth #undef PSW_MASK_EXT
296*fcf5ef2aSThomas Huth #undef PSW_MASK_KEY
297*fcf5ef2aSThomas Huth #undef PSW_SHIFT_KEY
298*fcf5ef2aSThomas Huth #undef PSW_MASK_MCHECK
299*fcf5ef2aSThomas Huth #undef PSW_MASK_WAIT
300*fcf5ef2aSThomas Huth #undef PSW_MASK_PSTATE
301*fcf5ef2aSThomas Huth #undef PSW_MASK_ASC
302*fcf5ef2aSThomas Huth #undef PSW_MASK_CC
303*fcf5ef2aSThomas Huth #undef PSW_MASK_PM
304*fcf5ef2aSThomas Huth #undef PSW_MASK_64
305*fcf5ef2aSThomas Huth #undef PSW_MASK_32
306*fcf5ef2aSThomas Huth #undef PSW_MASK_ESA_ADDR
307*fcf5ef2aSThomas Huth 
308*fcf5ef2aSThomas Huth #define PSW_MASK_PER            0x4000000000000000ULL
309*fcf5ef2aSThomas Huth #define PSW_MASK_DAT            0x0400000000000000ULL
310*fcf5ef2aSThomas Huth #define PSW_MASK_IO             0x0200000000000000ULL
311*fcf5ef2aSThomas Huth #define PSW_MASK_EXT            0x0100000000000000ULL
312*fcf5ef2aSThomas Huth #define PSW_MASK_KEY            0x00F0000000000000ULL
313*fcf5ef2aSThomas Huth #define PSW_SHIFT_KEY           56
314*fcf5ef2aSThomas Huth #define PSW_MASK_MCHECK         0x0004000000000000ULL
315*fcf5ef2aSThomas Huth #define PSW_MASK_WAIT           0x0002000000000000ULL
316*fcf5ef2aSThomas Huth #define PSW_MASK_PSTATE         0x0001000000000000ULL
317*fcf5ef2aSThomas Huth #define PSW_MASK_ASC            0x0000C00000000000ULL
318*fcf5ef2aSThomas Huth #define PSW_MASK_CC             0x0000300000000000ULL
319*fcf5ef2aSThomas Huth #define PSW_MASK_PM             0x00000F0000000000ULL
320*fcf5ef2aSThomas Huth #define PSW_MASK_64             0x0000000100000000ULL
321*fcf5ef2aSThomas Huth #define PSW_MASK_32             0x0000000080000000ULL
322*fcf5ef2aSThomas Huth #define PSW_MASK_ESA_ADDR       0x000000007fffffffULL
323*fcf5ef2aSThomas Huth 
324*fcf5ef2aSThomas Huth #undef PSW_ASC_PRIMARY
325*fcf5ef2aSThomas Huth #undef PSW_ASC_ACCREG
326*fcf5ef2aSThomas Huth #undef PSW_ASC_SECONDARY
327*fcf5ef2aSThomas Huth #undef PSW_ASC_HOME
328*fcf5ef2aSThomas Huth 
329*fcf5ef2aSThomas Huth #define PSW_ASC_PRIMARY         0x0000000000000000ULL
330*fcf5ef2aSThomas Huth #define PSW_ASC_ACCREG          0x0000400000000000ULL
331*fcf5ef2aSThomas Huth #define PSW_ASC_SECONDARY       0x0000800000000000ULL
332*fcf5ef2aSThomas Huth #define PSW_ASC_HOME            0x0000C00000000000ULL
333*fcf5ef2aSThomas Huth 
334*fcf5ef2aSThomas Huth /* tb flags */
335*fcf5ef2aSThomas Huth 
336*fcf5ef2aSThomas Huth #define FLAG_MASK_PER           (PSW_MASK_PER    >> 32)
337*fcf5ef2aSThomas Huth #define FLAG_MASK_DAT           (PSW_MASK_DAT    >> 32)
338*fcf5ef2aSThomas Huth #define FLAG_MASK_IO            (PSW_MASK_IO     >> 32)
339*fcf5ef2aSThomas Huth #define FLAG_MASK_EXT           (PSW_MASK_EXT    >> 32)
340*fcf5ef2aSThomas Huth #define FLAG_MASK_KEY           (PSW_MASK_KEY    >> 32)
341*fcf5ef2aSThomas Huth #define FLAG_MASK_MCHECK        (PSW_MASK_MCHECK >> 32)
342*fcf5ef2aSThomas Huth #define FLAG_MASK_WAIT          (PSW_MASK_WAIT   >> 32)
343*fcf5ef2aSThomas Huth #define FLAG_MASK_PSTATE        (PSW_MASK_PSTATE >> 32)
344*fcf5ef2aSThomas Huth #define FLAG_MASK_ASC           (PSW_MASK_ASC    >> 32)
345*fcf5ef2aSThomas Huth #define FLAG_MASK_CC            (PSW_MASK_CC     >> 32)
346*fcf5ef2aSThomas Huth #define FLAG_MASK_PM            (PSW_MASK_PM     >> 32)
347*fcf5ef2aSThomas Huth #define FLAG_MASK_64            (PSW_MASK_64     >> 32)
348*fcf5ef2aSThomas Huth #define FLAG_MASK_32            0x00001000
349*fcf5ef2aSThomas Huth 
350*fcf5ef2aSThomas Huth /* Control register 0 bits */
351*fcf5ef2aSThomas Huth #define CR0_LOWPROT             0x0000000010000000ULL
352*fcf5ef2aSThomas Huth #define CR0_EDAT                0x0000000000800000ULL
353*fcf5ef2aSThomas Huth 
354*fcf5ef2aSThomas Huth /* MMU */
355*fcf5ef2aSThomas Huth #define MMU_PRIMARY_IDX         0
356*fcf5ef2aSThomas Huth #define MMU_SECONDARY_IDX       1
357*fcf5ef2aSThomas Huth #define MMU_HOME_IDX            2
358*fcf5ef2aSThomas Huth 
359*fcf5ef2aSThomas Huth static inline int cpu_mmu_index (CPUS390XState *env, bool ifetch)
360*fcf5ef2aSThomas Huth {
361*fcf5ef2aSThomas Huth     switch (env->psw.mask & PSW_MASK_ASC) {
362*fcf5ef2aSThomas Huth     case PSW_ASC_PRIMARY:
363*fcf5ef2aSThomas Huth         return MMU_PRIMARY_IDX;
364*fcf5ef2aSThomas Huth     case PSW_ASC_SECONDARY:
365*fcf5ef2aSThomas Huth         return MMU_SECONDARY_IDX;
366*fcf5ef2aSThomas Huth     case PSW_ASC_HOME:
367*fcf5ef2aSThomas Huth         return MMU_HOME_IDX;
368*fcf5ef2aSThomas Huth     case PSW_ASC_ACCREG:
369*fcf5ef2aSThomas Huth         /* Fallthrough: access register mode is not yet supported */
370*fcf5ef2aSThomas Huth     default:
371*fcf5ef2aSThomas Huth         abort();
372*fcf5ef2aSThomas Huth     }
373*fcf5ef2aSThomas Huth }
374*fcf5ef2aSThomas Huth 
375*fcf5ef2aSThomas Huth static inline uint64_t cpu_mmu_idx_to_asc(int mmu_idx)
376*fcf5ef2aSThomas Huth {
377*fcf5ef2aSThomas Huth     switch (mmu_idx) {
378*fcf5ef2aSThomas Huth     case MMU_PRIMARY_IDX:
379*fcf5ef2aSThomas Huth         return PSW_ASC_PRIMARY;
380*fcf5ef2aSThomas Huth     case MMU_SECONDARY_IDX:
381*fcf5ef2aSThomas Huth         return PSW_ASC_SECONDARY;
382*fcf5ef2aSThomas Huth     case MMU_HOME_IDX:
383*fcf5ef2aSThomas Huth         return PSW_ASC_HOME;
384*fcf5ef2aSThomas Huth     default:
385*fcf5ef2aSThomas Huth         abort();
386*fcf5ef2aSThomas Huth     }
387*fcf5ef2aSThomas Huth }
388*fcf5ef2aSThomas Huth 
389*fcf5ef2aSThomas Huth static inline void cpu_get_tb_cpu_state(CPUS390XState* env, target_ulong *pc,
390*fcf5ef2aSThomas Huth                                         target_ulong *cs_base, uint32_t *flags)
391*fcf5ef2aSThomas Huth {
392*fcf5ef2aSThomas Huth     *pc = env->psw.addr;
393*fcf5ef2aSThomas Huth     *cs_base = 0;
394*fcf5ef2aSThomas Huth     *flags = ((env->psw.mask >> 32) & ~FLAG_MASK_CC) |
395*fcf5ef2aSThomas Huth              ((env->psw.mask & PSW_MASK_32) ? FLAG_MASK_32 : 0);
396*fcf5ef2aSThomas Huth }
397*fcf5ef2aSThomas Huth 
398*fcf5ef2aSThomas Huth #define MAX_ILEN 6
399*fcf5ef2aSThomas Huth 
400*fcf5ef2aSThomas Huth /* While the PoO talks about ILC (a number between 1-3) what is actually
401*fcf5ef2aSThomas Huth    stored in LowCore is shifted left one bit (an even between 2-6).  As
402*fcf5ef2aSThomas Huth    this is the actual length of the insn and therefore more useful, that
403*fcf5ef2aSThomas Huth    is what we want to pass around and manipulate.  To make sure that we
404*fcf5ef2aSThomas Huth    have applied this distinction universally, rename the "ILC" to "ILEN".  */
405*fcf5ef2aSThomas Huth static inline int get_ilen(uint8_t opc)
406*fcf5ef2aSThomas Huth {
407*fcf5ef2aSThomas Huth     switch (opc >> 6) {
408*fcf5ef2aSThomas Huth     case 0:
409*fcf5ef2aSThomas Huth         return 2;
410*fcf5ef2aSThomas Huth     case 1:
411*fcf5ef2aSThomas Huth     case 2:
412*fcf5ef2aSThomas Huth         return 4;
413*fcf5ef2aSThomas Huth     default:
414*fcf5ef2aSThomas Huth         return 6;
415*fcf5ef2aSThomas Huth     }
416*fcf5ef2aSThomas Huth }
417*fcf5ef2aSThomas Huth 
418*fcf5ef2aSThomas Huth /* PER bits from control register 9 */
419*fcf5ef2aSThomas Huth #define PER_CR9_EVENT_BRANCH           0x80000000
420*fcf5ef2aSThomas Huth #define PER_CR9_EVENT_IFETCH           0x40000000
421*fcf5ef2aSThomas Huth #define PER_CR9_EVENT_STORE            0x20000000
422*fcf5ef2aSThomas Huth #define PER_CR9_EVENT_STORE_REAL       0x08000000
423*fcf5ef2aSThomas Huth #define PER_CR9_EVENT_NULLIFICATION    0x01000000
424*fcf5ef2aSThomas Huth #define PER_CR9_CONTROL_BRANCH_ADDRESS 0x00800000
425*fcf5ef2aSThomas Huth #define PER_CR9_CONTROL_ALTERATION     0x00200000
426*fcf5ef2aSThomas Huth 
427*fcf5ef2aSThomas Huth /* PER bits from the PER CODE/ATMID/AI in lowcore */
428*fcf5ef2aSThomas Huth #define PER_CODE_EVENT_BRANCH          0x8000
429*fcf5ef2aSThomas Huth #define PER_CODE_EVENT_IFETCH          0x4000
430*fcf5ef2aSThomas Huth #define PER_CODE_EVENT_STORE           0x2000
431*fcf5ef2aSThomas Huth #define PER_CODE_EVENT_STORE_REAL      0x0800
432*fcf5ef2aSThomas Huth #define PER_CODE_EVENT_NULLIFICATION   0x0100
433*fcf5ef2aSThomas Huth 
434*fcf5ef2aSThomas Huth /* Compute the ATMID field that is stored in the per_perc_atmid lowcore
435*fcf5ef2aSThomas Huth    entry when a PER exception is triggered.  */
436*fcf5ef2aSThomas Huth static inline uint8_t get_per_atmid(CPUS390XState *env)
437*fcf5ef2aSThomas Huth {
438*fcf5ef2aSThomas Huth     return ((env->psw.mask & PSW_MASK_64) ?      (1 << 7) : 0) |
439*fcf5ef2aSThomas Huth            (                                     (1 << 6)    ) |
440*fcf5ef2aSThomas Huth            ((env->psw.mask & PSW_MASK_32) ?      (1 << 5) : 0) |
441*fcf5ef2aSThomas Huth            ((env->psw.mask & PSW_MASK_DAT)?      (1 << 4) : 0) |
442*fcf5ef2aSThomas Huth            ((env->psw.mask & PSW_ASC_SECONDARY)? (1 << 3) : 0) |
443*fcf5ef2aSThomas Huth            ((env->psw.mask & PSW_ASC_ACCREG)?    (1 << 2) : 0);
444*fcf5ef2aSThomas Huth }
445*fcf5ef2aSThomas Huth 
446*fcf5ef2aSThomas Huth /* Check if an address is within the PER starting address and the PER
447*fcf5ef2aSThomas Huth    ending address.  The address range might loop.  */
448*fcf5ef2aSThomas Huth static inline bool get_per_in_range(CPUS390XState *env, uint64_t addr)
449*fcf5ef2aSThomas Huth {
450*fcf5ef2aSThomas Huth     if (env->cregs[10] <= env->cregs[11]) {
451*fcf5ef2aSThomas Huth         return env->cregs[10] <= addr && addr <= env->cregs[11];
452*fcf5ef2aSThomas Huth     } else {
453*fcf5ef2aSThomas Huth         return env->cregs[10] <= addr || addr <= env->cregs[11];
454*fcf5ef2aSThomas Huth     }
455*fcf5ef2aSThomas Huth }
456*fcf5ef2aSThomas Huth 
457*fcf5ef2aSThomas Huth #ifndef CONFIG_USER_ONLY
458*fcf5ef2aSThomas Huth /* In several cases of runtime exceptions, we havn't recorded the true
459*fcf5ef2aSThomas Huth    instruction length.  Use these codes when raising exceptions in order
460*fcf5ef2aSThomas Huth    to re-compute the length by examining the insn in memory.  */
461*fcf5ef2aSThomas Huth #define ILEN_LATER       0x20
462*fcf5ef2aSThomas Huth #define ILEN_LATER_INC   0x21
463*fcf5ef2aSThomas Huth void trigger_pgm_exception(CPUS390XState *env, uint32_t code, uint32_t ilen);
464*fcf5ef2aSThomas Huth #endif
465*fcf5ef2aSThomas Huth 
466*fcf5ef2aSThomas Huth S390CPU *cpu_s390x_init(const char *cpu_model);
467*fcf5ef2aSThomas Huth S390CPU *s390x_new_cpu(const char *cpu_model, int64_t id, Error **errp);
468*fcf5ef2aSThomas Huth S390CPU *cpu_s390x_create(const char *cpu_model, Error **errp);
469*fcf5ef2aSThomas Huth void s390x_translate_init(void);
470*fcf5ef2aSThomas Huth 
471*fcf5ef2aSThomas Huth /* you can call this signal handler from your SIGBUS and SIGSEGV
472*fcf5ef2aSThomas Huth    signal handlers to inform the virtual CPU of exceptions. non zero
473*fcf5ef2aSThomas Huth    is returned if the signal was handled by the virtual CPU.  */
474*fcf5ef2aSThomas Huth int cpu_s390x_signal_handler(int host_signum, void *pinfo,
475*fcf5ef2aSThomas Huth                            void *puc);
476*fcf5ef2aSThomas Huth int s390_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw,
477*fcf5ef2aSThomas Huth                               int mmu_idx);
478*fcf5ef2aSThomas Huth 
479*fcf5ef2aSThomas Huth 
480*fcf5ef2aSThomas Huth #ifndef CONFIG_USER_ONLY
481*fcf5ef2aSThomas Huth void do_restart_interrupt(CPUS390XState *env);
482*fcf5ef2aSThomas Huth 
483*fcf5ef2aSThomas Huth static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
484*fcf5ef2aSThomas Huth                                        uint8_t *ar)
485*fcf5ef2aSThomas Huth {
486*fcf5ef2aSThomas Huth     hwaddr addr = 0;
487*fcf5ef2aSThomas Huth     uint8_t reg;
488*fcf5ef2aSThomas Huth 
489*fcf5ef2aSThomas Huth     reg = ipb >> 28;
490*fcf5ef2aSThomas Huth     if (reg > 0) {
491*fcf5ef2aSThomas Huth         addr = env->regs[reg];
492*fcf5ef2aSThomas Huth     }
493*fcf5ef2aSThomas Huth     addr += (ipb >> 16) & 0xfff;
494*fcf5ef2aSThomas Huth     if (ar) {
495*fcf5ef2aSThomas Huth         *ar = reg;
496*fcf5ef2aSThomas Huth     }
497*fcf5ef2aSThomas Huth 
498*fcf5ef2aSThomas Huth     return addr;
499*fcf5ef2aSThomas Huth }
500*fcf5ef2aSThomas Huth 
501*fcf5ef2aSThomas Huth /* Base/displacement are at the same locations. */
502*fcf5ef2aSThomas Huth #define decode_basedisp_rs decode_basedisp_s
503*fcf5ef2aSThomas Huth 
504*fcf5ef2aSThomas Huth /* helper functions for run_on_cpu() */
505*fcf5ef2aSThomas Huth static inline void s390_do_cpu_reset(CPUState *cs, run_on_cpu_data arg)
506*fcf5ef2aSThomas Huth {
507*fcf5ef2aSThomas Huth     S390CPUClass *scc = S390_CPU_GET_CLASS(cs);
508*fcf5ef2aSThomas Huth 
509*fcf5ef2aSThomas Huth     scc->cpu_reset(cs);
510*fcf5ef2aSThomas Huth }
511*fcf5ef2aSThomas Huth static inline void s390_do_cpu_full_reset(CPUState *cs, run_on_cpu_data arg)
512*fcf5ef2aSThomas Huth {
513*fcf5ef2aSThomas Huth     cpu_reset(cs);
514*fcf5ef2aSThomas Huth }
515*fcf5ef2aSThomas Huth 
516*fcf5ef2aSThomas Huth void s390x_tod_timer(void *opaque);
517*fcf5ef2aSThomas Huth void s390x_cpu_timer(void *opaque);
518*fcf5ef2aSThomas Huth 
519*fcf5ef2aSThomas Huth int s390_virtio_hypercall(CPUS390XState *env);
520*fcf5ef2aSThomas Huth 
521*fcf5ef2aSThomas Huth #ifdef CONFIG_KVM
522*fcf5ef2aSThomas Huth void kvm_s390_service_interrupt(uint32_t parm);
523*fcf5ef2aSThomas Huth void kvm_s390_vcpu_interrupt(S390CPU *cpu, struct kvm_s390_irq *irq);
524*fcf5ef2aSThomas Huth void kvm_s390_floating_interrupt(struct kvm_s390_irq *irq);
525*fcf5ef2aSThomas Huth int kvm_s390_inject_flic(struct kvm_s390_irq *irq);
526*fcf5ef2aSThomas Huth void kvm_s390_access_exception(S390CPU *cpu, uint16_t code, uint64_t te_code);
527*fcf5ef2aSThomas Huth int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar, void *hostbuf,
528*fcf5ef2aSThomas Huth                     int len, bool is_write);
529*fcf5ef2aSThomas Huth int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_clock);
530*fcf5ef2aSThomas Huth int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_clock);
531*fcf5ef2aSThomas Huth #else
532*fcf5ef2aSThomas Huth static inline void kvm_s390_service_interrupt(uint32_t parm)
533*fcf5ef2aSThomas Huth {
534*fcf5ef2aSThomas Huth }
535*fcf5ef2aSThomas Huth static inline int kvm_s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
536*fcf5ef2aSThomas Huth {
537*fcf5ef2aSThomas Huth     return -ENOSYS;
538*fcf5ef2aSThomas Huth }
539*fcf5ef2aSThomas Huth static inline int kvm_s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
540*fcf5ef2aSThomas Huth {
541*fcf5ef2aSThomas Huth     return -ENOSYS;
542*fcf5ef2aSThomas Huth }
543*fcf5ef2aSThomas Huth static inline int kvm_s390_mem_op(S390CPU *cpu, vaddr addr, uint8_t ar,
544*fcf5ef2aSThomas Huth                                   void *hostbuf, int len, bool is_write)
545*fcf5ef2aSThomas Huth {
546*fcf5ef2aSThomas Huth     return -ENOSYS;
547*fcf5ef2aSThomas Huth }
548*fcf5ef2aSThomas Huth static inline void kvm_s390_access_exception(S390CPU *cpu, uint16_t code,
549*fcf5ef2aSThomas Huth                                              uint64_t te_code)
550*fcf5ef2aSThomas Huth {
551*fcf5ef2aSThomas Huth }
552*fcf5ef2aSThomas Huth #endif
553*fcf5ef2aSThomas Huth 
554*fcf5ef2aSThomas Huth static inline int s390_get_clock(uint8_t *tod_high, uint64_t *tod_low)
555*fcf5ef2aSThomas Huth {
556*fcf5ef2aSThomas Huth     if (kvm_enabled()) {
557*fcf5ef2aSThomas Huth         return kvm_s390_get_clock(tod_high, tod_low);
558*fcf5ef2aSThomas Huth     }
559*fcf5ef2aSThomas Huth     /* Fixme TCG */
560*fcf5ef2aSThomas Huth     *tod_high = 0;
561*fcf5ef2aSThomas Huth     *tod_low = 0;
562*fcf5ef2aSThomas Huth     return 0;
563*fcf5ef2aSThomas Huth }
564*fcf5ef2aSThomas Huth 
565*fcf5ef2aSThomas Huth static inline int s390_set_clock(uint8_t *tod_high, uint64_t *tod_low)
566*fcf5ef2aSThomas Huth {
567*fcf5ef2aSThomas Huth     if (kvm_enabled()) {
568*fcf5ef2aSThomas Huth         return kvm_s390_set_clock(tod_high, tod_low);
569*fcf5ef2aSThomas Huth     }
570*fcf5ef2aSThomas Huth     /* Fixme TCG */
571*fcf5ef2aSThomas Huth     return 0;
572*fcf5ef2aSThomas Huth }
573*fcf5ef2aSThomas Huth 
574*fcf5ef2aSThomas Huth S390CPU *s390_cpu_addr2state(uint16_t cpu_addr);
575*fcf5ef2aSThomas Huth unsigned int s390_cpu_halt(S390CPU *cpu);
576*fcf5ef2aSThomas Huth void s390_cpu_unhalt(S390CPU *cpu);
577*fcf5ef2aSThomas Huth unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu);
578*fcf5ef2aSThomas Huth static inline uint8_t s390_cpu_get_state(S390CPU *cpu)
579*fcf5ef2aSThomas Huth {
580*fcf5ef2aSThomas Huth     return cpu->env.cpu_state;
581*fcf5ef2aSThomas Huth }
582*fcf5ef2aSThomas Huth 
583*fcf5ef2aSThomas Huth void gtod_save(QEMUFile *f, void *opaque);
584*fcf5ef2aSThomas Huth int gtod_load(QEMUFile *f, void *opaque, int version_id);
585*fcf5ef2aSThomas Huth 
586*fcf5ef2aSThomas Huth void cpu_inject_ext(S390CPU *cpu, uint32_t code, uint32_t param,
587*fcf5ef2aSThomas Huth                     uint64_t param64);
588*fcf5ef2aSThomas Huth 
589*fcf5ef2aSThomas Huth /* ioinst.c */
590*fcf5ef2aSThomas Huth void ioinst_handle_xsch(S390CPU *cpu, uint64_t reg1);
591*fcf5ef2aSThomas Huth void ioinst_handle_csch(S390CPU *cpu, uint64_t reg1);
592*fcf5ef2aSThomas Huth void ioinst_handle_hsch(S390CPU *cpu, uint64_t reg1);
593*fcf5ef2aSThomas Huth void ioinst_handle_msch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
594*fcf5ef2aSThomas Huth void ioinst_handle_ssch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
595*fcf5ef2aSThomas Huth void ioinst_handle_stcrw(S390CPU *cpu, uint32_t ipb);
596*fcf5ef2aSThomas Huth void ioinst_handle_stsch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
597*fcf5ef2aSThomas Huth int ioinst_handle_tsch(S390CPU *cpu, uint64_t reg1, uint32_t ipb);
598*fcf5ef2aSThomas Huth void ioinst_handle_chsc(S390CPU *cpu, uint32_t ipb);
599*fcf5ef2aSThomas Huth int ioinst_handle_tpi(S390CPU *cpu, uint32_t ipb);
600*fcf5ef2aSThomas Huth void ioinst_handle_schm(S390CPU *cpu, uint64_t reg1, uint64_t reg2,
601*fcf5ef2aSThomas Huth                         uint32_t ipb);
602*fcf5ef2aSThomas Huth void ioinst_handle_rsch(S390CPU *cpu, uint64_t reg1);
603*fcf5ef2aSThomas Huth void ioinst_handle_rchp(S390CPU *cpu, uint64_t reg1);
604*fcf5ef2aSThomas Huth void ioinst_handle_sal(S390CPU *cpu, uint64_t reg1);
605*fcf5ef2aSThomas Huth 
606*fcf5ef2aSThomas Huth /* service interrupts are floating therefore we must not pass an cpustate */
607*fcf5ef2aSThomas Huth void s390_sclp_extint(uint32_t parm);
608*fcf5ef2aSThomas Huth 
609*fcf5ef2aSThomas Huth #else
610*fcf5ef2aSThomas Huth static inline unsigned int s390_cpu_halt(S390CPU *cpu)
611*fcf5ef2aSThomas Huth {
612*fcf5ef2aSThomas Huth     return 0;
613*fcf5ef2aSThomas Huth }
614*fcf5ef2aSThomas Huth 
615*fcf5ef2aSThomas Huth static inline void s390_cpu_unhalt(S390CPU *cpu)
616*fcf5ef2aSThomas Huth {
617*fcf5ef2aSThomas Huth }
618*fcf5ef2aSThomas Huth 
619*fcf5ef2aSThomas Huth static inline unsigned int s390_cpu_set_state(uint8_t cpu_state, S390CPU *cpu)
620*fcf5ef2aSThomas Huth {
621*fcf5ef2aSThomas Huth     return 0;
622*fcf5ef2aSThomas Huth }
623*fcf5ef2aSThomas Huth #endif
624*fcf5ef2aSThomas Huth 
625*fcf5ef2aSThomas Huth extern void subsystem_reset(void);
626*fcf5ef2aSThomas Huth 
627*fcf5ef2aSThomas Huth #define cpu_init(model) CPU(cpu_s390x_init(model))
628*fcf5ef2aSThomas Huth #define cpu_signal_handler cpu_s390x_signal_handler
629*fcf5ef2aSThomas Huth 
630*fcf5ef2aSThomas Huth void s390_cpu_list(FILE *f, fprintf_function cpu_fprintf);
631*fcf5ef2aSThomas Huth #define cpu_list s390_cpu_list
632*fcf5ef2aSThomas Huth void s390_cpu_model_register_props(Object *obj);
633*fcf5ef2aSThomas Huth void s390_cpu_model_class_register_props(ObjectClass *oc);
634*fcf5ef2aSThomas Huth void s390_realize_cpu_model(CPUState *cs, Error **errp);
635*fcf5ef2aSThomas Huth ObjectClass *s390_cpu_class_by_name(const char *name);
636*fcf5ef2aSThomas Huth 
637*fcf5ef2aSThomas Huth #define EXCP_EXT 1 /* external interrupt */
638*fcf5ef2aSThomas Huth #define EXCP_SVC 2 /* supervisor call (syscall) */
639*fcf5ef2aSThomas Huth #define EXCP_PGM 3 /* program interruption */
640*fcf5ef2aSThomas Huth #define EXCP_IO  7 /* I/O interrupt */
641*fcf5ef2aSThomas Huth #define EXCP_MCHK 8 /* machine check */
642*fcf5ef2aSThomas Huth 
643*fcf5ef2aSThomas Huth #define INTERRUPT_EXT        (1 << 0)
644*fcf5ef2aSThomas Huth #define INTERRUPT_TOD        (1 << 1)
645*fcf5ef2aSThomas Huth #define INTERRUPT_CPUTIMER   (1 << 2)
646*fcf5ef2aSThomas Huth #define INTERRUPT_IO         (1 << 3)
647*fcf5ef2aSThomas Huth #define INTERRUPT_MCHK       (1 << 4)
648*fcf5ef2aSThomas Huth 
649*fcf5ef2aSThomas Huth /* Program Status Word.  */
650*fcf5ef2aSThomas Huth #define S390_PSWM_REGNUM 0
651*fcf5ef2aSThomas Huth #define S390_PSWA_REGNUM 1
652*fcf5ef2aSThomas Huth /* General Purpose Registers.  */
653*fcf5ef2aSThomas Huth #define S390_R0_REGNUM 2
654*fcf5ef2aSThomas Huth #define S390_R1_REGNUM 3
655*fcf5ef2aSThomas Huth #define S390_R2_REGNUM 4
656*fcf5ef2aSThomas Huth #define S390_R3_REGNUM 5
657*fcf5ef2aSThomas Huth #define S390_R4_REGNUM 6
658*fcf5ef2aSThomas Huth #define S390_R5_REGNUM 7
659*fcf5ef2aSThomas Huth #define S390_R6_REGNUM 8
660*fcf5ef2aSThomas Huth #define S390_R7_REGNUM 9
661*fcf5ef2aSThomas Huth #define S390_R8_REGNUM 10
662*fcf5ef2aSThomas Huth #define S390_R9_REGNUM 11
663*fcf5ef2aSThomas Huth #define S390_R10_REGNUM 12
664*fcf5ef2aSThomas Huth #define S390_R11_REGNUM 13
665*fcf5ef2aSThomas Huth #define S390_R12_REGNUM 14
666*fcf5ef2aSThomas Huth #define S390_R13_REGNUM 15
667*fcf5ef2aSThomas Huth #define S390_R14_REGNUM 16
668*fcf5ef2aSThomas Huth #define S390_R15_REGNUM 17
669*fcf5ef2aSThomas Huth /* Total Core Registers. */
670*fcf5ef2aSThomas Huth #define S390_NUM_CORE_REGS 18
671*fcf5ef2aSThomas Huth 
672*fcf5ef2aSThomas Huth /* CC optimization */
673*fcf5ef2aSThomas Huth 
674*fcf5ef2aSThomas Huth /* Instead of computing the condition codes after each x86 instruction,
675*fcf5ef2aSThomas Huth  * QEMU just stores the result (called CC_DST), the type of operation
676*fcf5ef2aSThomas Huth  * (called CC_OP) and whatever operands are needed (CC_SRC and possibly
677*fcf5ef2aSThomas Huth  * CC_VR). When the condition codes are needed, the condition codes can
678*fcf5ef2aSThomas Huth  * be calculated using this information. Condition codes are not generated
679*fcf5ef2aSThomas Huth  * if they are only needed for conditional branches.
680*fcf5ef2aSThomas Huth  */
681*fcf5ef2aSThomas Huth enum cc_op {
682*fcf5ef2aSThomas Huth     CC_OP_CONST0 = 0,           /* CC is 0 */
683*fcf5ef2aSThomas Huth     CC_OP_CONST1,               /* CC is 1 */
684*fcf5ef2aSThomas Huth     CC_OP_CONST2,               /* CC is 2 */
685*fcf5ef2aSThomas Huth     CC_OP_CONST3,               /* CC is 3 */
686*fcf5ef2aSThomas Huth 
687*fcf5ef2aSThomas Huth     CC_OP_DYNAMIC,              /* CC calculation defined by env->cc_op */
688*fcf5ef2aSThomas Huth     CC_OP_STATIC,               /* CC value is env->cc_op */
689*fcf5ef2aSThomas Huth 
690*fcf5ef2aSThomas Huth     CC_OP_NZ,                   /* env->cc_dst != 0 */
691*fcf5ef2aSThomas Huth     CC_OP_LTGT_32,              /* signed less/greater than (32bit) */
692*fcf5ef2aSThomas Huth     CC_OP_LTGT_64,              /* signed less/greater than (64bit) */
693*fcf5ef2aSThomas Huth     CC_OP_LTUGTU_32,            /* unsigned less/greater than (32bit) */
694*fcf5ef2aSThomas Huth     CC_OP_LTUGTU_64,            /* unsigned less/greater than (64bit) */
695*fcf5ef2aSThomas Huth     CC_OP_LTGT0_32,             /* signed less/greater than 0 (32bit) */
696*fcf5ef2aSThomas Huth     CC_OP_LTGT0_64,             /* signed less/greater than 0 (64bit) */
697*fcf5ef2aSThomas Huth 
698*fcf5ef2aSThomas Huth     CC_OP_ADD_64,               /* overflow on add (64bit) */
699*fcf5ef2aSThomas Huth     CC_OP_ADDU_64,              /* overflow on unsigned add (64bit) */
700*fcf5ef2aSThomas Huth     CC_OP_ADDC_64,              /* overflow on unsigned add-carry (64bit) */
701*fcf5ef2aSThomas Huth     CC_OP_SUB_64,               /* overflow on subtraction (64bit) */
702*fcf5ef2aSThomas Huth     CC_OP_SUBU_64,              /* overflow on unsigned subtraction (64bit) */
703*fcf5ef2aSThomas Huth     CC_OP_SUBB_64,              /* overflow on unsigned sub-borrow (64bit) */
704*fcf5ef2aSThomas Huth     CC_OP_ABS_64,               /* sign eval on abs (64bit) */
705*fcf5ef2aSThomas Huth     CC_OP_NABS_64,              /* sign eval on nabs (64bit) */
706*fcf5ef2aSThomas Huth 
707*fcf5ef2aSThomas Huth     CC_OP_ADD_32,               /* overflow on add (32bit) */
708*fcf5ef2aSThomas Huth     CC_OP_ADDU_32,              /* overflow on unsigned add (32bit) */
709*fcf5ef2aSThomas Huth     CC_OP_ADDC_32,              /* overflow on unsigned add-carry (32bit) */
710*fcf5ef2aSThomas Huth     CC_OP_SUB_32,               /* overflow on subtraction (32bit) */
711*fcf5ef2aSThomas Huth     CC_OP_SUBU_32,              /* overflow on unsigned subtraction (32bit) */
712*fcf5ef2aSThomas Huth     CC_OP_SUBB_32,              /* overflow on unsigned sub-borrow (32bit) */
713*fcf5ef2aSThomas Huth     CC_OP_ABS_32,               /* sign eval on abs (64bit) */
714*fcf5ef2aSThomas Huth     CC_OP_NABS_32,              /* sign eval on nabs (64bit) */
715*fcf5ef2aSThomas Huth 
716*fcf5ef2aSThomas Huth     CC_OP_COMP_32,              /* complement */
717*fcf5ef2aSThomas Huth     CC_OP_COMP_64,              /* complement */
718*fcf5ef2aSThomas Huth 
719*fcf5ef2aSThomas Huth     CC_OP_TM_32,                /* test under mask (32bit) */
720*fcf5ef2aSThomas Huth     CC_OP_TM_64,                /* test under mask (64bit) */
721*fcf5ef2aSThomas Huth 
722*fcf5ef2aSThomas Huth     CC_OP_NZ_F32,               /* FP dst != 0 (32bit) */
723*fcf5ef2aSThomas Huth     CC_OP_NZ_F64,               /* FP dst != 0 (64bit) */
724*fcf5ef2aSThomas Huth     CC_OP_NZ_F128,              /* FP dst != 0 (128bit) */
725*fcf5ef2aSThomas Huth 
726*fcf5ef2aSThomas Huth     CC_OP_ICM,                  /* insert characters under mask */
727*fcf5ef2aSThomas Huth     CC_OP_SLA_32,               /* Calculate shift left signed (32bit) */
728*fcf5ef2aSThomas Huth     CC_OP_SLA_64,               /* Calculate shift left signed (64bit) */
729*fcf5ef2aSThomas Huth     CC_OP_FLOGR,                /* find leftmost one */
730*fcf5ef2aSThomas Huth     CC_OP_MAX
731*fcf5ef2aSThomas Huth };
732*fcf5ef2aSThomas Huth 
733*fcf5ef2aSThomas Huth static const char *cc_names[] = {
734*fcf5ef2aSThomas Huth     [CC_OP_CONST0]    = "CC_OP_CONST0",
735*fcf5ef2aSThomas Huth     [CC_OP_CONST1]    = "CC_OP_CONST1",
736*fcf5ef2aSThomas Huth     [CC_OP_CONST2]    = "CC_OP_CONST2",
737*fcf5ef2aSThomas Huth     [CC_OP_CONST3]    = "CC_OP_CONST3",
738*fcf5ef2aSThomas Huth     [CC_OP_DYNAMIC]   = "CC_OP_DYNAMIC",
739*fcf5ef2aSThomas Huth     [CC_OP_STATIC]    = "CC_OP_STATIC",
740*fcf5ef2aSThomas Huth     [CC_OP_NZ]        = "CC_OP_NZ",
741*fcf5ef2aSThomas Huth     [CC_OP_LTGT_32]   = "CC_OP_LTGT_32",
742*fcf5ef2aSThomas Huth     [CC_OP_LTGT_64]   = "CC_OP_LTGT_64",
743*fcf5ef2aSThomas Huth     [CC_OP_LTUGTU_32] = "CC_OP_LTUGTU_32",
744*fcf5ef2aSThomas Huth     [CC_OP_LTUGTU_64] = "CC_OP_LTUGTU_64",
745*fcf5ef2aSThomas Huth     [CC_OP_LTGT0_32]  = "CC_OP_LTGT0_32",
746*fcf5ef2aSThomas Huth     [CC_OP_LTGT0_64]  = "CC_OP_LTGT0_64",
747*fcf5ef2aSThomas Huth     [CC_OP_ADD_64]    = "CC_OP_ADD_64",
748*fcf5ef2aSThomas Huth     [CC_OP_ADDU_64]   = "CC_OP_ADDU_64",
749*fcf5ef2aSThomas Huth     [CC_OP_ADDC_64]   = "CC_OP_ADDC_64",
750*fcf5ef2aSThomas Huth     [CC_OP_SUB_64]    = "CC_OP_SUB_64",
751*fcf5ef2aSThomas Huth     [CC_OP_SUBU_64]   = "CC_OP_SUBU_64",
752*fcf5ef2aSThomas Huth     [CC_OP_SUBB_64]   = "CC_OP_SUBB_64",
753*fcf5ef2aSThomas Huth     [CC_OP_ABS_64]    = "CC_OP_ABS_64",
754*fcf5ef2aSThomas Huth     [CC_OP_NABS_64]   = "CC_OP_NABS_64",
755*fcf5ef2aSThomas Huth     [CC_OP_ADD_32]    = "CC_OP_ADD_32",
756*fcf5ef2aSThomas Huth     [CC_OP_ADDU_32]   = "CC_OP_ADDU_32",
757*fcf5ef2aSThomas Huth     [CC_OP_ADDC_32]   = "CC_OP_ADDC_32",
758*fcf5ef2aSThomas Huth     [CC_OP_SUB_32]    = "CC_OP_SUB_32",
759*fcf5ef2aSThomas Huth     [CC_OP_SUBU_32]   = "CC_OP_SUBU_32",
760*fcf5ef2aSThomas Huth     [CC_OP_SUBB_32]   = "CC_OP_SUBB_32",
761*fcf5ef2aSThomas Huth     [CC_OP_ABS_32]    = "CC_OP_ABS_32",
762*fcf5ef2aSThomas Huth     [CC_OP_NABS_32]   = "CC_OP_NABS_32",
763*fcf5ef2aSThomas Huth     [CC_OP_COMP_32]   = "CC_OP_COMP_32",
764*fcf5ef2aSThomas Huth     [CC_OP_COMP_64]   = "CC_OP_COMP_64",
765*fcf5ef2aSThomas Huth     [CC_OP_TM_32]     = "CC_OP_TM_32",
766*fcf5ef2aSThomas Huth     [CC_OP_TM_64]     = "CC_OP_TM_64",
767*fcf5ef2aSThomas Huth     [CC_OP_NZ_F32]    = "CC_OP_NZ_F32",
768*fcf5ef2aSThomas Huth     [CC_OP_NZ_F64]    = "CC_OP_NZ_F64",
769*fcf5ef2aSThomas Huth     [CC_OP_NZ_F128]   = "CC_OP_NZ_F128",
770*fcf5ef2aSThomas Huth     [CC_OP_ICM]       = "CC_OP_ICM",
771*fcf5ef2aSThomas Huth     [CC_OP_SLA_32]    = "CC_OP_SLA_32",
772*fcf5ef2aSThomas Huth     [CC_OP_SLA_64]    = "CC_OP_SLA_64",
773*fcf5ef2aSThomas Huth     [CC_OP_FLOGR]     = "CC_OP_FLOGR",
774*fcf5ef2aSThomas Huth };
775*fcf5ef2aSThomas Huth 
776*fcf5ef2aSThomas Huth static inline const char *cc_name(int cc_op)
777*fcf5ef2aSThomas Huth {
778*fcf5ef2aSThomas Huth     return cc_names[cc_op];
779*fcf5ef2aSThomas Huth }
780*fcf5ef2aSThomas Huth 
781*fcf5ef2aSThomas Huth static inline void setcc(S390CPU *cpu, uint64_t cc)
782*fcf5ef2aSThomas Huth {
783*fcf5ef2aSThomas Huth     CPUS390XState *env = &cpu->env;
784*fcf5ef2aSThomas Huth 
785*fcf5ef2aSThomas Huth     env->psw.mask &= ~(3ull << 44);
786*fcf5ef2aSThomas Huth     env->psw.mask |= (cc & 3) << 44;
787*fcf5ef2aSThomas Huth     env->cc_op = cc;
788*fcf5ef2aSThomas Huth }
789*fcf5ef2aSThomas Huth 
790*fcf5ef2aSThomas Huth typedef struct LowCore
791*fcf5ef2aSThomas Huth {
792*fcf5ef2aSThomas Huth     /* prefix area: defined by architecture */
793*fcf5ef2aSThomas Huth     uint32_t        ccw1[2];                  /* 0x000 */
794*fcf5ef2aSThomas Huth     uint32_t        ccw2[4];                  /* 0x008 */
795*fcf5ef2aSThomas Huth     uint8_t         pad1[0x80-0x18];          /* 0x018 */
796*fcf5ef2aSThomas Huth     uint32_t        ext_params;               /* 0x080 */
797*fcf5ef2aSThomas Huth     uint16_t        cpu_addr;                 /* 0x084 */
798*fcf5ef2aSThomas Huth     uint16_t        ext_int_code;             /* 0x086 */
799*fcf5ef2aSThomas Huth     uint16_t        svc_ilen;                 /* 0x088 */
800*fcf5ef2aSThomas Huth     uint16_t        svc_code;                 /* 0x08a */
801*fcf5ef2aSThomas Huth     uint16_t        pgm_ilen;                 /* 0x08c */
802*fcf5ef2aSThomas Huth     uint16_t        pgm_code;                 /* 0x08e */
803*fcf5ef2aSThomas Huth     uint32_t        data_exc_code;            /* 0x090 */
804*fcf5ef2aSThomas Huth     uint16_t        mon_class_num;            /* 0x094 */
805*fcf5ef2aSThomas Huth     uint16_t        per_perc_atmid;           /* 0x096 */
806*fcf5ef2aSThomas Huth     uint64_t        per_address;              /* 0x098 */
807*fcf5ef2aSThomas Huth     uint8_t         exc_access_id;            /* 0x0a0 */
808*fcf5ef2aSThomas Huth     uint8_t         per_access_id;            /* 0x0a1 */
809*fcf5ef2aSThomas Huth     uint8_t         op_access_id;             /* 0x0a2 */
810*fcf5ef2aSThomas Huth     uint8_t         ar_access_id;             /* 0x0a3 */
811*fcf5ef2aSThomas Huth     uint8_t         pad2[0xA8-0xA4];          /* 0x0a4 */
812*fcf5ef2aSThomas Huth     uint64_t        trans_exc_code;           /* 0x0a8 */
813*fcf5ef2aSThomas Huth     uint64_t        monitor_code;             /* 0x0b0 */
814*fcf5ef2aSThomas Huth     uint16_t        subchannel_id;            /* 0x0b8 */
815*fcf5ef2aSThomas Huth     uint16_t        subchannel_nr;            /* 0x0ba */
816*fcf5ef2aSThomas Huth     uint32_t        io_int_parm;              /* 0x0bc */
817*fcf5ef2aSThomas Huth     uint32_t        io_int_word;              /* 0x0c0 */
818*fcf5ef2aSThomas Huth     uint8_t         pad3[0xc8-0xc4];          /* 0x0c4 */
819*fcf5ef2aSThomas Huth     uint32_t        stfl_fac_list;            /* 0x0c8 */
820*fcf5ef2aSThomas Huth     uint8_t         pad4[0xe8-0xcc];          /* 0x0cc */
821*fcf5ef2aSThomas Huth     uint32_t        mcck_interruption_code[2]; /* 0x0e8 */
822*fcf5ef2aSThomas Huth     uint8_t         pad5[0xf4-0xf0];          /* 0x0f0 */
823*fcf5ef2aSThomas Huth     uint32_t        external_damage_code;     /* 0x0f4 */
824*fcf5ef2aSThomas Huth     uint64_t        failing_storage_address;  /* 0x0f8 */
825*fcf5ef2aSThomas Huth     uint8_t         pad6[0x110-0x100];        /* 0x100 */
826*fcf5ef2aSThomas Huth     uint64_t        per_breaking_event_addr;  /* 0x110 */
827*fcf5ef2aSThomas Huth     uint8_t         pad7[0x120-0x118];        /* 0x118 */
828*fcf5ef2aSThomas Huth     PSW             restart_old_psw;          /* 0x120 */
829*fcf5ef2aSThomas Huth     PSW             external_old_psw;         /* 0x130 */
830*fcf5ef2aSThomas Huth     PSW             svc_old_psw;              /* 0x140 */
831*fcf5ef2aSThomas Huth     PSW             program_old_psw;          /* 0x150 */
832*fcf5ef2aSThomas Huth     PSW             mcck_old_psw;             /* 0x160 */
833*fcf5ef2aSThomas Huth     PSW             io_old_psw;               /* 0x170 */
834*fcf5ef2aSThomas Huth     uint8_t         pad8[0x1a0-0x180];        /* 0x180 */
835*fcf5ef2aSThomas Huth     PSW             restart_new_psw;          /* 0x1a0 */
836*fcf5ef2aSThomas Huth     PSW             external_new_psw;         /* 0x1b0 */
837*fcf5ef2aSThomas Huth     PSW             svc_new_psw;              /* 0x1c0 */
838*fcf5ef2aSThomas Huth     PSW             program_new_psw;          /* 0x1d0 */
839*fcf5ef2aSThomas Huth     PSW             mcck_new_psw;             /* 0x1e0 */
840*fcf5ef2aSThomas Huth     PSW             io_new_psw;               /* 0x1f0 */
841*fcf5ef2aSThomas Huth     PSW             return_psw;               /* 0x200 */
842*fcf5ef2aSThomas Huth     uint8_t         irb[64];                  /* 0x210 */
843*fcf5ef2aSThomas Huth     uint64_t        sync_enter_timer;         /* 0x250 */
844*fcf5ef2aSThomas Huth     uint64_t        async_enter_timer;        /* 0x258 */
845*fcf5ef2aSThomas Huth     uint64_t        exit_timer;               /* 0x260 */
846*fcf5ef2aSThomas Huth     uint64_t        last_update_timer;        /* 0x268 */
847*fcf5ef2aSThomas Huth     uint64_t        user_timer;               /* 0x270 */
848*fcf5ef2aSThomas Huth     uint64_t        system_timer;             /* 0x278 */
849*fcf5ef2aSThomas Huth     uint64_t        last_update_clock;        /* 0x280 */
850*fcf5ef2aSThomas Huth     uint64_t        steal_clock;              /* 0x288 */
851*fcf5ef2aSThomas Huth     PSW             return_mcck_psw;          /* 0x290 */
852*fcf5ef2aSThomas Huth     uint8_t         pad9[0xc00-0x2a0];        /* 0x2a0 */
853*fcf5ef2aSThomas Huth     /* System info area */
854*fcf5ef2aSThomas Huth     uint64_t        save_area[16];            /* 0xc00 */
855*fcf5ef2aSThomas Huth     uint8_t         pad10[0xd40-0xc80];       /* 0xc80 */
856*fcf5ef2aSThomas Huth     uint64_t        kernel_stack;             /* 0xd40 */
857*fcf5ef2aSThomas Huth     uint64_t        thread_info;              /* 0xd48 */
858*fcf5ef2aSThomas Huth     uint64_t        async_stack;              /* 0xd50 */
859*fcf5ef2aSThomas Huth     uint64_t        kernel_asce;              /* 0xd58 */
860*fcf5ef2aSThomas Huth     uint64_t        user_asce;                /* 0xd60 */
861*fcf5ef2aSThomas Huth     uint64_t        panic_stack;              /* 0xd68 */
862*fcf5ef2aSThomas Huth     uint64_t        user_exec_asce;           /* 0xd70 */
863*fcf5ef2aSThomas Huth     uint8_t         pad11[0xdc0-0xd78];       /* 0xd78 */
864*fcf5ef2aSThomas Huth 
865*fcf5ef2aSThomas Huth     /* SMP info area: defined by DJB */
866*fcf5ef2aSThomas Huth     uint64_t        clock_comparator;         /* 0xdc0 */
867*fcf5ef2aSThomas Huth     uint64_t        ext_call_fast;            /* 0xdc8 */
868*fcf5ef2aSThomas Huth     uint64_t        percpu_offset;            /* 0xdd0 */
869*fcf5ef2aSThomas Huth     uint64_t        current_task;             /* 0xdd8 */
870*fcf5ef2aSThomas Huth     uint32_t        softirq_pending;          /* 0xde0 */
871*fcf5ef2aSThomas Huth     uint32_t        pad_0x0de4;               /* 0xde4 */
872*fcf5ef2aSThomas Huth     uint64_t        int_clock;                /* 0xde8 */
873*fcf5ef2aSThomas Huth     uint8_t         pad12[0xe00-0xdf0];       /* 0xdf0 */
874*fcf5ef2aSThomas Huth 
875*fcf5ef2aSThomas Huth     /* 0xe00 is used as indicator for dump tools */
876*fcf5ef2aSThomas Huth     /* whether the kernel died with panic() or not */
877*fcf5ef2aSThomas Huth     uint32_t        panic_magic;              /* 0xe00 */
878*fcf5ef2aSThomas Huth 
879*fcf5ef2aSThomas Huth     uint8_t         pad13[0x11b8-0xe04];      /* 0xe04 */
880*fcf5ef2aSThomas Huth 
881*fcf5ef2aSThomas Huth     /* 64 bit extparam used for pfault, diag 250 etc  */
882*fcf5ef2aSThomas Huth     uint64_t        ext_params2;               /* 0x11B8 */
883*fcf5ef2aSThomas Huth 
884*fcf5ef2aSThomas Huth     uint8_t         pad14[0x1200-0x11C0];      /* 0x11C0 */
885*fcf5ef2aSThomas Huth 
886*fcf5ef2aSThomas Huth     /* System info area */
887*fcf5ef2aSThomas Huth 
888*fcf5ef2aSThomas Huth     uint64_t        floating_pt_save_area[16]; /* 0x1200 */
889*fcf5ef2aSThomas Huth     uint64_t        gpregs_save_area[16];      /* 0x1280 */
890*fcf5ef2aSThomas Huth     uint32_t        st_status_fixed_logout[4]; /* 0x1300 */
891*fcf5ef2aSThomas Huth     uint8_t         pad15[0x1318-0x1310];      /* 0x1310 */
892*fcf5ef2aSThomas Huth     uint32_t        prefixreg_save_area;       /* 0x1318 */
893*fcf5ef2aSThomas Huth     uint32_t        fpt_creg_save_area;        /* 0x131c */
894*fcf5ef2aSThomas Huth     uint8_t         pad16[0x1324-0x1320];      /* 0x1320 */
895*fcf5ef2aSThomas Huth     uint32_t        tod_progreg_save_area;     /* 0x1324 */
896*fcf5ef2aSThomas Huth     uint32_t        cpu_timer_save_area[2];    /* 0x1328 */
897*fcf5ef2aSThomas Huth     uint32_t        clock_comp_save_area[2];   /* 0x1330 */
898*fcf5ef2aSThomas Huth     uint8_t         pad17[0x1340-0x1338];      /* 0x1338 */
899*fcf5ef2aSThomas Huth     uint32_t        access_regs_save_area[16]; /* 0x1340 */
900*fcf5ef2aSThomas Huth     uint64_t        cregs_save_area[16];       /* 0x1380 */
901*fcf5ef2aSThomas Huth 
902*fcf5ef2aSThomas Huth     /* align to the top of the prefix area */
903*fcf5ef2aSThomas Huth 
904*fcf5ef2aSThomas Huth     uint8_t         pad18[0x2000-0x1400];      /* 0x1400 */
905*fcf5ef2aSThomas Huth } QEMU_PACKED LowCore;
906*fcf5ef2aSThomas Huth 
907*fcf5ef2aSThomas Huth /* STSI */
908*fcf5ef2aSThomas Huth #define STSI_LEVEL_MASK         0x00000000f0000000ULL
909*fcf5ef2aSThomas Huth #define STSI_LEVEL_CURRENT      0x0000000000000000ULL
910*fcf5ef2aSThomas Huth #define STSI_LEVEL_1            0x0000000010000000ULL
911*fcf5ef2aSThomas Huth #define STSI_LEVEL_2            0x0000000020000000ULL
912*fcf5ef2aSThomas Huth #define STSI_LEVEL_3            0x0000000030000000ULL
913*fcf5ef2aSThomas Huth #define STSI_R0_RESERVED_MASK   0x000000000fffff00ULL
914*fcf5ef2aSThomas Huth #define STSI_R0_SEL1_MASK       0x00000000000000ffULL
915*fcf5ef2aSThomas Huth #define STSI_R1_RESERVED_MASK   0x00000000ffff0000ULL
916*fcf5ef2aSThomas Huth #define STSI_R1_SEL2_MASK       0x000000000000ffffULL
917*fcf5ef2aSThomas Huth 
918*fcf5ef2aSThomas Huth /* Basic Machine Configuration */
919*fcf5ef2aSThomas Huth struct sysib_111 {
920*fcf5ef2aSThomas Huth     uint32_t res1[8];
921*fcf5ef2aSThomas Huth     uint8_t  manuf[16];
922*fcf5ef2aSThomas Huth     uint8_t  type[4];
923*fcf5ef2aSThomas Huth     uint8_t  res2[12];
924*fcf5ef2aSThomas Huth     uint8_t  model[16];
925*fcf5ef2aSThomas Huth     uint8_t  sequence[16];
926*fcf5ef2aSThomas Huth     uint8_t  plant[4];
927*fcf5ef2aSThomas Huth     uint8_t  res3[156];
928*fcf5ef2aSThomas Huth };
929*fcf5ef2aSThomas Huth 
930*fcf5ef2aSThomas Huth /* Basic Machine CPU */
931*fcf5ef2aSThomas Huth struct sysib_121 {
932*fcf5ef2aSThomas Huth     uint32_t res1[80];
933*fcf5ef2aSThomas Huth     uint8_t  sequence[16];
934*fcf5ef2aSThomas Huth     uint8_t  plant[4];
935*fcf5ef2aSThomas Huth     uint8_t  res2[2];
936*fcf5ef2aSThomas Huth     uint16_t cpu_addr;
937*fcf5ef2aSThomas Huth     uint8_t  res3[152];
938*fcf5ef2aSThomas Huth };
939*fcf5ef2aSThomas Huth 
940*fcf5ef2aSThomas Huth /* Basic Machine CPUs */
941*fcf5ef2aSThomas Huth struct sysib_122 {
942*fcf5ef2aSThomas Huth     uint8_t res1[32];
943*fcf5ef2aSThomas Huth     uint32_t capability;
944*fcf5ef2aSThomas Huth     uint16_t total_cpus;
945*fcf5ef2aSThomas Huth     uint16_t active_cpus;
946*fcf5ef2aSThomas Huth     uint16_t standby_cpus;
947*fcf5ef2aSThomas Huth     uint16_t reserved_cpus;
948*fcf5ef2aSThomas Huth     uint16_t adjustments[2026];
949*fcf5ef2aSThomas Huth };
950*fcf5ef2aSThomas Huth 
951*fcf5ef2aSThomas Huth /* LPAR CPU */
952*fcf5ef2aSThomas Huth struct sysib_221 {
953*fcf5ef2aSThomas Huth     uint32_t res1[80];
954*fcf5ef2aSThomas Huth     uint8_t  sequence[16];
955*fcf5ef2aSThomas Huth     uint8_t  plant[4];
956*fcf5ef2aSThomas Huth     uint16_t cpu_id;
957*fcf5ef2aSThomas Huth     uint16_t cpu_addr;
958*fcf5ef2aSThomas Huth     uint8_t  res3[152];
959*fcf5ef2aSThomas Huth };
960*fcf5ef2aSThomas Huth 
961*fcf5ef2aSThomas Huth /* LPAR CPUs */
962*fcf5ef2aSThomas Huth struct sysib_222 {
963*fcf5ef2aSThomas Huth     uint32_t res1[32];
964*fcf5ef2aSThomas Huth     uint16_t lpar_num;
965*fcf5ef2aSThomas Huth     uint8_t  res2;
966*fcf5ef2aSThomas Huth     uint8_t  lcpuc;
967*fcf5ef2aSThomas Huth     uint16_t total_cpus;
968*fcf5ef2aSThomas Huth     uint16_t conf_cpus;
969*fcf5ef2aSThomas Huth     uint16_t standby_cpus;
970*fcf5ef2aSThomas Huth     uint16_t reserved_cpus;
971*fcf5ef2aSThomas Huth     uint8_t  name[8];
972*fcf5ef2aSThomas Huth     uint32_t caf;
973*fcf5ef2aSThomas Huth     uint8_t  res3[16];
974*fcf5ef2aSThomas Huth     uint16_t dedicated_cpus;
975*fcf5ef2aSThomas Huth     uint16_t shared_cpus;
976*fcf5ef2aSThomas Huth     uint8_t  res4[180];
977*fcf5ef2aSThomas Huth };
978*fcf5ef2aSThomas Huth 
979*fcf5ef2aSThomas Huth /* VM CPUs */
980*fcf5ef2aSThomas Huth struct sysib_322 {
981*fcf5ef2aSThomas Huth     uint8_t  res1[31];
982*fcf5ef2aSThomas Huth     uint8_t  count;
983*fcf5ef2aSThomas Huth     struct {
984*fcf5ef2aSThomas Huth         uint8_t  res2[4];
985*fcf5ef2aSThomas Huth         uint16_t total_cpus;
986*fcf5ef2aSThomas Huth         uint16_t conf_cpus;
987*fcf5ef2aSThomas Huth         uint16_t standby_cpus;
988*fcf5ef2aSThomas Huth         uint16_t reserved_cpus;
989*fcf5ef2aSThomas Huth         uint8_t  name[8];
990*fcf5ef2aSThomas Huth         uint32_t caf;
991*fcf5ef2aSThomas Huth         uint8_t  cpi[16];
992*fcf5ef2aSThomas Huth         uint8_t res5[3];
993*fcf5ef2aSThomas Huth         uint8_t ext_name_encoding;
994*fcf5ef2aSThomas Huth         uint32_t res3;
995*fcf5ef2aSThomas Huth         uint8_t uuid[16];
996*fcf5ef2aSThomas Huth     } vm[8];
997*fcf5ef2aSThomas Huth     uint8_t res4[1504];
998*fcf5ef2aSThomas Huth     uint8_t ext_names[8][256];
999*fcf5ef2aSThomas Huth };
1000*fcf5ef2aSThomas Huth 
1001*fcf5ef2aSThomas Huth /* MMU defines */
1002*fcf5ef2aSThomas Huth #define _ASCE_ORIGIN            ~0xfffULL /* segment table origin             */
1003*fcf5ef2aSThomas Huth #define _ASCE_SUBSPACE          0x200     /* subspace group control           */
1004*fcf5ef2aSThomas Huth #define _ASCE_PRIVATE_SPACE     0x100     /* private space control            */
1005*fcf5ef2aSThomas Huth #define _ASCE_ALT_EVENT         0x80      /* storage alteration event control */
1006*fcf5ef2aSThomas Huth #define _ASCE_SPACE_SWITCH      0x40      /* space switch event               */
1007*fcf5ef2aSThomas Huth #define _ASCE_REAL_SPACE        0x20      /* real space control               */
1008*fcf5ef2aSThomas Huth #define _ASCE_TYPE_MASK         0x0c      /* asce table type mask             */
1009*fcf5ef2aSThomas Huth #define _ASCE_TYPE_REGION1      0x0c      /* region first table type          */
1010*fcf5ef2aSThomas Huth #define _ASCE_TYPE_REGION2      0x08      /* region second table type         */
1011*fcf5ef2aSThomas Huth #define _ASCE_TYPE_REGION3      0x04      /* region third table type          */
1012*fcf5ef2aSThomas Huth #define _ASCE_TYPE_SEGMENT      0x00      /* segment table type               */
1013*fcf5ef2aSThomas Huth #define _ASCE_TABLE_LENGTH      0x03      /* region table length              */
1014*fcf5ef2aSThomas Huth 
1015*fcf5ef2aSThomas Huth #define _REGION_ENTRY_ORIGIN    ~0xfffULL /* region/segment table origin      */
1016*fcf5ef2aSThomas Huth #define _REGION_ENTRY_RO        0x200     /* region/segment protection bit    */
1017*fcf5ef2aSThomas Huth #define _REGION_ENTRY_TF        0xc0      /* region/segment table offset      */
1018*fcf5ef2aSThomas Huth #define _REGION_ENTRY_INV       0x20      /* invalid region table entry       */
1019*fcf5ef2aSThomas Huth #define _REGION_ENTRY_TYPE_MASK 0x0c      /* region/segment table type mask   */
1020*fcf5ef2aSThomas Huth #define _REGION_ENTRY_TYPE_R1   0x0c      /* region first table type          */
1021*fcf5ef2aSThomas Huth #define _REGION_ENTRY_TYPE_R2   0x08      /* region second table type         */
1022*fcf5ef2aSThomas Huth #define _REGION_ENTRY_TYPE_R3   0x04      /* region third table type          */
1023*fcf5ef2aSThomas Huth #define _REGION_ENTRY_LENGTH    0x03      /* region third length              */
1024*fcf5ef2aSThomas Huth 
1025*fcf5ef2aSThomas Huth #define _SEGMENT_ENTRY_ORIGIN   ~0x7ffULL /* segment table origin             */
1026*fcf5ef2aSThomas Huth #define _SEGMENT_ENTRY_FC       0x400     /* format control                   */
1027*fcf5ef2aSThomas Huth #define _SEGMENT_ENTRY_RO       0x200     /* page protection bit              */
1028*fcf5ef2aSThomas Huth #define _SEGMENT_ENTRY_INV      0x20      /* invalid segment table entry      */
1029*fcf5ef2aSThomas Huth 
1030*fcf5ef2aSThomas Huth #define _PAGE_RO        0x200            /* HW read-only bit  */
1031*fcf5ef2aSThomas Huth #define _PAGE_INVALID   0x400            /* HW invalid bit    */
1032*fcf5ef2aSThomas Huth #define _PAGE_RES0      0x800            /* bit must be zero  */
1033*fcf5ef2aSThomas Huth 
1034*fcf5ef2aSThomas Huth #define SK_C                    (0x1 << 1)
1035*fcf5ef2aSThomas Huth #define SK_R                    (0x1 << 2)
1036*fcf5ef2aSThomas Huth #define SK_F                    (0x1 << 3)
1037*fcf5ef2aSThomas Huth #define SK_ACC_MASK             (0xf << 4)
1038*fcf5ef2aSThomas Huth 
1039*fcf5ef2aSThomas Huth /* SIGP order codes */
1040*fcf5ef2aSThomas Huth #define SIGP_SENSE             0x01
1041*fcf5ef2aSThomas Huth #define SIGP_EXTERNAL_CALL     0x02
1042*fcf5ef2aSThomas Huth #define SIGP_EMERGENCY         0x03
1043*fcf5ef2aSThomas Huth #define SIGP_START             0x04
1044*fcf5ef2aSThomas Huth #define SIGP_STOP              0x05
1045*fcf5ef2aSThomas Huth #define SIGP_RESTART           0x06
1046*fcf5ef2aSThomas Huth #define SIGP_STOP_STORE_STATUS 0x09
1047*fcf5ef2aSThomas Huth #define SIGP_INITIAL_CPU_RESET 0x0b
1048*fcf5ef2aSThomas Huth #define SIGP_CPU_RESET         0x0c
1049*fcf5ef2aSThomas Huth #define SIGP_SET_PREFIX        0x0d
1050*fcf5ef2aSThomas Huth #define SIGP_STORE_STATUS_ADDR 0x0e
1051*fcf5ef2aSThomas Huth #define SIGP_SET_ARCH          0x12
1052*fcf5ef2aSThomas Huth #define SIGP_STORE_ADTL_STATUS 0x17
1053*fcf5ef2aSThomas Huth 
1054*fcf5ef2aSThomas Huth /* SIGP condition codes */
1055*fcf5ef2aSThomas Huth #define SIGP_CC_ORDER_CODE_ACCEPTED 0
1056*fcf5ef2aSThomas Huth #define SIGP_CC_STATUS_STORED       1
1057*fcf5ef2aSThomas Huth #define SIGP_CC_BUSY                2
1058*fcf5ef2aSThomas Huth #define SIGP_CC_NOT_OPERATIONAL     3
1059*fcf5ef2aSThomas Huth 
1060*fcf5ef2aSThomas Huth /* SIGP status bits */
1061*fcf5ef2aSThomas Huth #define SIGP_STAT_EQUIPMENT_CHECK   0x80000000UL
1062*fcf5ef2aSThomas Huth #define SIGP_STAT_INCORRECT_STATE   0x00000200UL
1063*fcf5ef2aSThomas Huth #define SIGP_STAT_INVALID_PARAMETER 0x00000100UL
1064*fcf5ef2aSThomas Huth #define SIGP_STAT_EXT_CALL_PENDING  0x00000080UL
1065*fcf5ef2aSThomas Huth #define SIGP_STAT_STOPPED           0x00000040UL
1066*fcf5ef2aSThomas Huth #define SIGP_STAT_OPERATOR_INTERV   0x00000020UL
1067*fcf5ef2aSThomas Huth #define SIGP_STAT_CHECK_STOP        0x00000010UL
1068*fcf5ef2aSThomas Huth #define SIGP_STAT_INOPERATIVE       0x00000004UL
1069*fcf5ef2aSThomas Huth #define SIGP_STAT_INVALID_ORDER     0x00000002UL
1070*fcf5ef2aSThomas Huth #define SIGP_STAT_RECEIVER_CHECK    0x00000001UL
1071*fcf5ef2aSThomas Huth 
1072*fcf5ef2aSThomas Huth /* SIGP SET ARCHITECTURE modes */
1073*fcf5ef2aSThomas Huth #define SIGP_MODE_ESA_S390 0
1074*fcf5ef2aSThomas Huth #define SIGP_MODE_Z_ARCH_TRANS_ALL_PSW 1
1075*fcf5ef2aSThomas Huth #define SIGP_MODE_Z_ARCH_TRANS_CUR_PSW 2
1076*fcf5ef2aSThomas Huth 
1077*fcf5ef2aSThomas Huth void load_psw(CPUS390XState *env, uint64_t mask, uint64_t addr);
1078*fcf5ef2aSThomas Huth int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
1079*fcf5ef2aSThomas Huth                   target_ulong *raddr, int *flags, bool exc);
1080*fcf5ef2aSThomas Huth int sclp_service_call(CPUS390XState *env, uint64_t sccb, uint32_t code);
1081*fcf5ef2aSThomas Huth uint32_t calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst,
1082*fcf5ef2aSThomas Huth                  uint64_t vr);
1083*fcf5ef2aSThomas Huth void s390_cpu_recompute_watchpoints(CPUState *cs);
1084*fcf5ef2aSThomas Huth 
1085*fcf5ef2aSThomas Huth int s390_cpu_virt_mem_rw(S390CPU *cpu, vaddr laddr, uint8_t ar, void *hostbuf,
1086*fcf5ef2aSThomas Huth                          int len, bool is_write);
1087*fcf5ef2aSThomas Huth 
1088*fcf5ef2aSThomas Huth #define s390_cpu_virt_mem_read(cpu, laddr, ar, dest, len)    \
1089*fcf5ef2aSThomas Huth         s390_cpu_virt_mem_rw(cpu, laddr, ar, dest, len, false)
1090*fcf5ef2aSThomas Huth #define s390_cpu_virt_mem_write(cpu, laddr, ar, dest, len)       \
1091*fcf5ef2aSThomas Huth         s390_cpu_virt_mem_rw(cpu, laddr, ar, dest, len, true)
1092*fcf5ef2aSThomas Huth #define s390_cpu_virt_mem_check_write(cpu, laddr, ar, len)   \
1093*fcf5ef2aSThomas Huth         s390_cpu_virt_mem_rw(cpu, laddr, ar, NULL, len, true)
1094*fcf5ef2aSThomas Huth 
1095*fcf5ef2aSThomas Huth /* The value of the TOD clock for 1.1.1970. */
1096*fcf5ef2aSThomas Huth #define TOD_UNIX_EPOCH 0x7d91048bca000000ULL
1097*fcf5ef2aSThomas Huth 
1098*fcf5ef2aSThomas Huth /* Converts ns to s390's clock format */
1099*fcf5ef2aSThomas Huth static inline uint64_t time2tod(uint64_t ns) {
1100*fcf5ef2aSThomas Huth     return (ns << 9) / 125;
1101*fcf5ef2aSThomas Huth }
1102*fcf5ef2aSThomas Huth 
1103*fcf5ef2aSThomas Huth /* Converts s390's clock format to ns */
1104*fcf5ef2aSThomas Huth static inline uint64_t tod2time(uint64_t t) {
1105*fcf5ef2aSThomas Huth     return (t * 125) >> 9;
1106*fcf5ef2aSThomas Huth }
1107*fcf5ef2aSThomas Huth 
1108*fcf5ef2aSThomas Huth /* from s390-virtio-ccw */
1109*fcf5ef2aSThomas Huth #define MEM_SECTION_SIZE             0x10000000UL
1110*fcf5ef2aSThomas Huth #define MAX_AVAIL_SLOTS              32
1111*fcf5ef2aSThomas Huth 
1112*fcf5ef2aSThomas Huth /* fpu_helper.c */
1113*fcf5ef2aSThomas Huth uint32_t set_cc_nz_f32(float32 v);
1114*fcf5ef2aSThomas Huth uint32_t set_cc_nz_f64(float64 v);
1115*fcf5ef2aSThomas Huth uint32_t set_cc_nz_f128(float128 v);
1116*fcf5ef2aSThomas Huth 
1117*fcf5ef2aSThomas Huth /* misc_helper.c */
1118*fcf5ef2aSThomas Huth #ifndef CONFIG_USER_ONLY
1119*fcf5ef2aSThomas Huth int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
1120*fcf5ef2aSThomas Huth void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3);
1121*fcf5ef2aSThomas Huth #endif
1122*fcf5ef2aSThomas Huth void program_interrupt(CPUS390XState *env, uint32_t code, int ilen);
1123*fcf5ef2aSThomas Huth void QEMU_NORETURN runtime_exception(CPUS390XState *env, int excp,
1124*fcf5ef2aSThomas Huth                                      uintptr_t retaddr);
1125*fcf5ef2aSThomas Huth 
1126*fcf5ef2aSThomas Huth #ifdef CONFIG_KVM
1127*fcf5ef2aSThomas Huth void kvm_s390_io_interrupt(uint16_t subchannel_id,
1128*fcf5ef2aSThomas Huth                            uint16_t subchannel_nr, uint32_t io_int_parm,
1129*fcf5ef2aSThomas Huth                            uint32_t io_int_word);
1130*fcf5ef2aSThomas Huth void kvm_s390_crw_mchk(void);
1131*fcf5ef2aSThomas Huth void kvm_s390_enable_css_support(S390CPU *cpu);
1132*fcf5ef2aSThomas Huth int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier, uint32_t sch,
1133*fcf5ef2aSThomas Huth                                     int vq, bool assign);
1134*fcf5ef2aSThomas Huth int kvm_s390_cpu_restart(S390CPU *cpu);
1135*fcf5ef2aSThomas Huth int kvm_s390_get_memslot_count(KVMState *s);
1136*fcf5ef2aSThomas Huth void kvm_s390_cmma_reset(void);
1137*fcf5ef2aSThomas Huth int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state);
1138*fcf5ef2aSThomas Huth void kvm_s390_reset_vcpu(S390CPU *cpu);
1139*fcf5ef2aSThomas Huth int kvm_s390_set_mem_limit(KVMState *s, uint64_t new_limit, uint64_t *hw_limit);
1140*fcf5ef2aSThomas Huth void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu);
1141*fcf5ef2aSThomas Huth int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu);
1142*fcf5ef2aSThomas Huth int kvm_s390_get_ri(void);
1143*fcf5ef2aSThomas Huth void kvm_s390_crypto_reset(void);
1144*fcf5ef2aSThomas Huth #else
1145*fcf5ef2aSThomas Huth static inline void kvm_s390_io_interrupt(uint16_t subchannel_id,
1146*fcf5ef2aSThomas Huth                                         uint16_t subchannel_nr,
1147*fcf5ef2aSThomas Huth                                         uint32_t io_int_parm,
1148*fcf5ef2aSThomas Huth                                         uint32_t io_int_word)
1149*fcf5ef2aSThomas Huth {
1150*fcf5ef2aSThomas Huth }
1151*fcf5ef2aSThomas Huth static inline void kvm_s390_crw_mchk(void)
1152*fcf5ef2aSThomas Huth {
1153*fcf5ef2aSThomas Huth }
1154*fcf5ef2aSThomas Huth static inline void kvm_s390_enable_css_support(S390CPU *cpu)
1155*fcf5ef2aSThomas Huth {
1156*fcf5ef2aSThomas Huth }
1157*fcf5ef2aSThomas Huth static inline int kvm_s390_assign_subch_ioeventfd(EventNotifier *notifier,
1158*fcf5ef2aSThomas Huth                                                   uint32_t sch, int vq,
1159*fcf5ef2aSThomas Huth                                                   bool assign)
1160*fcf5ef2aSThomas Huth {
1161*fcf5ef2aSThomas Huth     return -ENOSYS;
1162*fcf5ef2aSThomas Huth }
1163*fcf5ef2aSThomas Huth static inline int kvm_s390_cpu_restart(S390CPU *cpu)
1164*fcf5ef2aSThomas Huth {
1165*fcf5ef2aSThomas Huth     return -ENOSYS;
1166*fcf5ef2aSThomas Huth }
1167*fcf5ef2aSThomas Huth static inline void kvm_s390_cmma_reset(void)
1168*fcf5ef2aSThomas Huth {
1169*fcf5ef2aSThomas Huth }
1170*fcf5ef2aSThomas Huth static inline int kvm_s390_get_memslot_count(KVMState *s)
1171*fcf5ef2aSThomas Huth {
1172*fcf5ef2aSThomas Huth   return MAX_AVAIL_SLOTS;
1173*fcf5ef2aSThomas Huth }
1174*fcf5ef2aSThomas Huth static inline int kvm_s390_set_cpu_state(S390CPU *cpu, uint8_t cpu_state)
1175*fcf5ef2aSThomas Huth {
1176*fcf5ef2aSThomas Huth     return -ENOSYS;
1177*fcf5ef2aSThomas Huth }
1178*fcf5ef2aSThomas Huth static inline void kvm_s390_reset_vcpu(S390CPU *cpu)
1179*fcf5ef2aSThomas Huth {
1180*fcf5ef2aSThomas Huth }
1181*fcf5ef2aSThomas Huth static inline int kvm_s390_set_mem_limit(KVMState *s, uint64_t new_limit,
1182*fcf5ef2aSThomas Huth                                          uint64_t *hw_limit)
1183*fcf5ef2aSThomas Huth {
1184*fcf5ef2aSThomas Huth     return 0;
1185*fcf5ef2aSThomas Huth }
1186*fcf5ef2aSThomas Huth static inline void kvm_s390_vcpu_interrupt_pre_save(S390CPU *cpu)
1187*fcf5ef2aSThomas Huth {
1188*fcf5ef2aSThomas Huth }
1189*fcf5ef2aSThomas Huth static inline int kvm_s390_vcpu_interrupt_post_load(S390CPU *cpu)
1190*fcf5ef2aSThomas Huth {
1191*fcf5ef2aSThomas Huth     return 0;
1192*fcf5ef2aSThomas Huth }
1193*fcf5ef2aSThomas Huth static inline int kvm_s390_get_ri(void)
1194*fcf5ef2aSThomas Huth {
1195*fcf5ef2aSThomas Huth     return 0;
1196*fcf5ef2aSThomas Huth }
1197*fcf5ef2aSThomas Huth static inline void kvm_s390_crypto_reset(void)
1198*fcf5ef2aSThomas Huth {
1199*fcf5ef2aSThomas Huth }
1200*fcf5ef2aSThomas Huth #endif
1201*fcf5ef2aSThomas Huth 
1202*fcf5ef2aSThomas Huth static inline int s390_set_memory_limit(uint64_t new_limit, uint64_t *hw_limit)
1203*fcf5ef2aSThomas Huth {
1204*fcf5ef2aSThomas Huth     if (kvm_enabled()) {
1205*fcf5ef2aSThomas Huth         return kvm_s390_set_mem_limit(kvm_state, new_limit, hw_limit);
1206*fcf5ef2aSThomas Huth     }
1207*fcf5ef2aSThomas Huth     return 0;
1208*fcf5ef2aSThomas Huth }
1209*fcf5ef2aSThomas Huth 
1210*fcf5ef2aSThomas Huth static inline void s390_cmma_reset(void)
1211*fcf5ef2aSThomas Huth {
1212*fcf5ef2aSThomas Huth     if (kvm_enabled()) {
1213*fcf5ef2aSThomas Huth         kvm_s390_cmma_reset();
1214*fcf5ef2aSThomas Huth     }
1215*fcf5ef2aSThomas Huth }
1216*fcf5ef2aSThomas Huth 
1217*fcf5ef2aSThomas Huth static inline int s390_cpu_restart(S390CPU *cpu)
1218*fcf5ef2aSThomas Huth {
1219*fcf5ef2aSThomas Huth     if (kvm_enabled()) {
1220*fcf5ef2aSThomas Huth         return kvm_s390_cpu_restart(cpu);
1221*fcf5ef2aSThomas Huth     }
1222*fcf5ef2aSThomas Huth     return -ENOSYS;
1223*fcf5ef2aSThomas Huth }
1224*fcf5ef2aSThomas Huth 
1225*fcf5ef2aSThomas Huth static inline int s390_get_memslot_count(KVMState *s)
1226*fcf5ef2aSThomas Huth {
1227*fcf5ef2aSThomas Huth     if (kvm_enabled()) {
1228*fcf5ef2aSThomas Huth         return kvm_s390_get_memslot_count(s);
1229*fcf5ef2aSThomas Huth     } else {
1230*fcf5ef2aSThomas Huth         return MAX_AVAIL_SLOTS;
1231*fcf5ef2aSThomas Huth     }
1232*fcf5ef2aSThomas Huth }
1233*fcf5ef2aSThomas Huth 
1234*fcf5ef2aSThomas Huth void s390_io_interrupt(uint16_t subchannel_id, uint16_t subchannel_nr,
1235*fcf5ef2aSThomas Huth                        uint32_t io_int_parm, uint32_t io_int_word);
1236*fcf5ef2aSThomas Huth void s390_crw_mchk(void);
1237*fcf5ef2aSThomas Huth 
1238*fcf5ef2aSThomas Huth static inline int s390_assign_subch_ioeventfd(EventNotifier *notifier,
1239*fcf5ef2aSThomas Huth                                               uint32_t sch_id, int vq,
1240*fcf5ef2aSThomas Huth                                               bool assign)
1241*fcf5ef2aSThomas Huth {
1242*fcf5ef2aSThomas Huth     return kvm_s390_assign_subch_ioeventfd(notifier, sch_id, vq, assign);
1243*fcf5ef2aSThomas Huth }
1244*fcf5ef2aSThomas Huth 
1245*fcf5ef2aSThomas Huth static inline void s390_crypto_reset(void)
1246*fcf5ef2aSThomas Huth {
1247*fcf5ef2aSThomas Huth     if (kvm_enabled()) {
1248*fcf5ef2aSThomas Huth         kvm_s390_crypto_reset();
1249*fcf5ef2aSThomas Huth     }
1250*fcf5ef2aSThomas Huth }
1251*fcf5ef2aSThomas Huth 
1252*fcf5ef2aSThomas Huth /* machine check interruption code */
1253*fcf5ef2aSThomas Huth 
1254*fcf5ef2aSThomas Huth /* subclasses */
1255*fcf5ef2aSThomas Huth #define MCIC_SC_SD 0x8000000000000000ULL
1256*fcf5ef2aSThomas Huth #define MCIC_SC_PD 0x4000000000000000ULL
1257*fcf5ef2aSThomas Huth #define MCIC_SC_SR 0x2000000000000000ULL
1258*fcf5ef2aSThomas Huth #define MCIC_SC_CD 0x0800000000000000ULL
1259*fcf5ef2aSThomas Huth #define MCIC_SC_ED 0x0400000000000000ULL
1260*fcf5ef2aSThomas Huth #define MCIC_SC_DG 0x0100000000000000ULL
1261*fcf5ef2aSThomas Huth #define MCIC_SC_W  0x0080000000000000ULL
1262*fcf5ef2aSThomas Huth #define MCIC_SC_CP 0x0040000000000000ULL
1263*fcf5ef2aSThomas Huth #define MCIC_SC_SP 0x0020000000000000ULL
1264*fcf5ef2aSThomas Huth #define MCIC_SC_CK 0x0010000000000000ULL
1265*fcf5ef2aSThomas Huth 
1266*fcf5ef2aSThomas Huth /* subclass modifiers */
1267*fcf5ef2aSThomas Huth #define MCIC_SCM_B  0x0002000000000000ULL
1268*fcf5ef2aSThomas Huth #define MCIC_SCM_DA 0x0000000020000000ULL
1269*fcf5ef2aSThomas Huth #define MCIC_SCM_AP 0x0000000000080000ULL
1270*fcf5ef2aSThomas Huth 
1271*fcf5ef2aSThomas Huth /* storage errors */
1272*fcf5ef2aSThomas Huth #define MCIC_SE_SE 0x0000800000000000ULL
1273*fcf5ef2aSThomas Huth #define MCIC_SE_SC 0x0000400000000000ULL
1274*fcf5ef2aSThomas Huth #define MCIC_SE_KE 0x0000200000000000ULL
1275*fcf5ef2aSThomas Huth #define MCIC_SE_DS 0x0000100000000000ULL
1276*fcf5ef2aSThomas Huth #define MCIC_SE_IE 0x0000000080000000ULL
1277*fcf5ef2aSThomas Huth 
1278*fcf5ef2aSThomas Huth /* validity bits */
1279*fcf5ef2aSThomas Huth #define MCIC_VB_WP 0x0000080000000000ULL
1280*fcf5ef2aSThomas Huth #define MCIC_VB_MS 0x0000040000000000ULL
1281*fcf5ef2aSThomas Huth #define MCIC_VB_PM 0x0000020000000000ULL
1282*fcf5ef2aSThomas Huth #define MCIC_VB_IA 0x0000010000000000ULL
1283*fcf5ef2aSThomas Huth #define MCIC_VB_FA 0x0000008000000000ULL
1284*fcf5ef2aSThomas Huth #define MCIC_VB_VR 0x0000004000000000ULL
1285*fcf5ef2aSThomas Huth #define MCIC_VB_EC 0x0000002000000000ULL
1286*fcf5ef2aSThomas Huth #define MCIC_VB_FP 0x0000001000000000ULL
1287*fcf5ef2aSThomas Huth #define MCIC_VB_GR 0x0000000800000000ULL
1288*fcf5ef2aSThomas Huth #define MCIC_VB_CR 0x0000000400000000ULL
1289*fcf5ef2aSThomas Huth #define MCIC_VB_ST 0x0000000100000000ULL
1290*fcf5ef2aSThomas Huth #define MCIC_VB_AR 0x0000000040000000ULL
1291*fcf5ef2aSThomas Huth #define MCIC_VB_PR 0x0000000000200000ULL
1292*fcf5ef2aSThomas Huth #define MCIC_VB_FC 0x0000000000100000ULL
1293*fcf5ef2aSThomas Huth #define MCIC_VB_CT 0x0000000000020000ULL
1294*fcf5ef2aSThomas Huth #define MCIC_VB_CC 0x0000000000010000ULL
1295*fcf5ef2aSThomas Huth 
1296*fcf5ef2aSThomas Huth #endif
1297