1
2
3
4
5
6
7
8
9
10#ifndef S390X_INTERNAL_H
11#define S390X_INTERNAL_H
12
13#include "cpu.h"
14
15#ifndef CONFIG_USER_ONLY
16typedef struct LowCore {
17
18 uint32_t ccw1[2];
19 uint32_t ccw2[4];
20 uint8_t pad1[0x80 - 0x18];
21 uint32_t ext_params;
22 uint16_t cpu_addr;
23 uint16_t ext_int_code;
24 uint16_t svc_ilen;
25 uint16_t svc_code;
26 uint16_t pgm_ilen;
27 uint16_t pgm_code;
28 uint32_t data_exc_code;
29 uint16_t mon_class_num;
30 uint16_t per_perc_atmid;
31 uint64_t per_address;
32 uint8_t exc_access_id;
33 uint8_t per_access_id;
34 uint8_t op_access_id;
35 uint8_t ar_access_id;
36 uint8_t pad2[0xA8 - 0xA4];
37 uint64_t trans_exc_code;
38 uint64_t monitor_code;
39 uint16_t subchannel_id;
40 uint16_t subchannel_nr;
41 uint32_t io_int_parm;
42 uint32_t io_int_word;
43 uint8_t pad3[0xc8 - 0xc4];
44 uint32_t stfl_fac_list;
45 uint8_t pad4[0xe8 - 0xcc];
46 uint64_t mcic;
47 uint8_t pad5[0xf4 - 0xf0];
48 uint32_t external_damage_code;
49 uint64_t failing_storage_address;
50 uint8_t pad6[0x110 - 0x100];
51 uint64_t per_breaking_event_addr;
52 uint8_t pad7[0x120 - 0x118];
53 PSW restart_old_psw;
54 PSW external_old_psw;
55 PSW svc_old_psw;
56 PSW program_old_psw;
57 PSW mcck_old_psw;
58 PSW io_old_psw;
59 uint8_t pad8[0x1a0 - 0x180];
60 PSW restart_new_psw;
61 PSW external_new_psw;
62 PSW svc_new_psw;
63 PSW program_new_psw;
64 PSW mcck_new_psw;
65 PSW io_new_psw;
66 PSW return_psw;
67 uint8_t irb[64];
68 uint64_t sync_enter_timer;
69 uint64_t async_enter_timer;
70 uint64_t exit_timer;
71 uint64_t last_update_timer;
72 uint64_t user_timer;
73 uint64_t system_timer;
74 uint64_t last_update_clock;
75 uint64_t steal_clock;
76 PSW return_mcck_psw;
77 uint8_t pad9[0xc00 - 0x2a0];
78
79 uint64_t save_area[16];
80 uint8_t pad10[0xd40 - 0xc80];
81 uint64_t kernel_stack;
82 uint64_t thread_info;
83 uint64_t async_stack;
84 uint64_t kernel_asce;
85 uint64_t user_asce;
86 uint64_t panic_stack;
87 uint64_t user_exec_asce;
88 uint8_t pad11[0xdc0 - 0xd78];
89
90
91 uint64_t clock_comparator;
92 uint64_t ext_call_fast;
93 uint64_t percpu_offset;
94 uint64_t current_task;
95 uint32_t softirq_pending;
96 uint32_t pad_0x0de4;
97 uint64_t int_clock;
98 uint8_t pad12[0xe00 - 0xdf0];
99
100
101
102 uint32_t panic_magic;
103
104 uint8_t pad13[0x11b8 - 0xe04];
105
106
107 uint64_t ext_params2;
108
109 uint8_t pad14[0x1200 - 0x11C0];
110
111
112
113 uint64_t floating_pt_save_area[16];
114 uint64_t gpregs_save_area[16];
115 uint32_t st_status_fixed_logout[4];
116 uint8_t pad15[0x1318 - 0x1310];
117 uint32_t prefixreg_save_area;
118 uint32_t fpt_creg_save_area;
119 uint8_t pad16[0x1324 - 0x1320];
120 uint32_t tod_progreg_save_area;
121 uint64_t cpu_timer_save_area;
122 uint64_t clock_comp_save_area;
123 uint8_t pad17[0x1340 - 0x1338];
124 uint32_t access_regs_save_area[16];
125 uint64_t cregs_save_area[16];
126
127
128
129 uint8_t pad18[0x2000 - 0x1400];
130} QEMU_PACKED LowCore;
131#endif
132
133#define MAX_ILEN 6
134
135
136
137
138
139
140static inline int get_ilen(uint8_t opc)
141{
142 switch (opc >> 6) {
143 case 0:
144 return 2;
145 case 1:
146 case 2:
147 return 4;
148 default:
149 return 6;
150 }
151}
152
153
154
155static inline uint8_t get_per_atmid(CPUS390XState *env)
156{
157 return ((env->psw.mask & PSW_MASK_64) ? (1 << 7) : 0) |
158 (1 << 6) |
159 ((env->psw.mask & PSW_MASK_32) ? (1 << 5) : 0) |
160 ((env->psw.mask & PSW_MASK_DAT) ? (1 << 4) : 0) |
161 ((env->psw.mask & PSW_ASC_SECONDARY) ? (1 << 3) : 0) |
162 ((env->psw.mask & PSW_ASC_ACCREG) ? (1 << 2) : 0);
163}
164
165static inline uint64_t wrap_address(CPUS390XState *env, uint64_t a)
166{
167 if (!(env->psw.mask & PSW_MASK_64)) {
168 if (!(env->psw.mask & PSW_MASK_32)) {
169
170 a &= 0x00ffffff;
171 } else {
172
173 a &= 0x7fffffff;
174 }
175 }
176 return a;
177}
178
179
180
181
182
183
184
185
186
187
188enum cc_op {
189 CC_OP_CONST0 = 0,
190 CC_OP_CONST1,
191 CC_OP_CONST2,
192 CC_OP_CONST3,
193
194 CC_OP_DYNAMIC,
195 CC_OP_STATIC,
196
197 CC_OP_NZ,
198 CC_OP_LTGT_32,
199 CC_OP_LTGT_64,
200 CC_OP_LTUGTU_32,
201 CC_OP_LTUGTU_64,
202 CC_OP_LTGT0_32,
203 CC_OP_LTGT0_64,
204
205 CC_OP_ADD_64,
206 CC_OP_ADDU_64,
207 CC_OP_ADDC_64,
208 CC_OP_SUB_64,
209 CC_OP_SUBU_64,
210 CC_OP_SUBB_64,
211 CC_OP_ABS_64,
212 CC_OP_NABS_64,
213
214 CC_OP_ADD_32,
215 CC_OP_ADDU_32,
216 CC_OP_ADDC_32,
217 CC_OP_SUB_32,
218 CC_OP_SUBU_32,
219 CC_OP_SUBB_32,
220 CC_OP_ABS_32,
221 CC_OP_NABS_32,
222
223 CC_OP_COMP_32,
224 CC_OP_COMP_64,
225
226 CC_OP_TM_32,
227 CC_OP_TM_64,
228
229 CC_OP_NZ_F32,
230 CC_OP_NZ_F64,
231 CC_OP_NZ_F128,
232
233 CC_OP_ICM,
234 CC_OP_SLA_32,
235 CC_OP_SLA_64,
236 CC_OP_FLOGR,
237 CC_OP_MAX
238};
239
240
241#define TOD_UNIX_EPOCH 0x7d91048bca000000ULL
242
243
244static inline uint64_t time2tod(uint64_t ns)
245{
246 return (ns << 9) / 125;
247}
248
249
250static inline uint64_t tod2time(uint64_t t)
251{
252 return (t * 125) >> 9;
253}
254
255static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
256 uint8_t *ar)
257{
258 hwaddr addr = 0;
259 uint8_t reg;
260
261 reg = ipb >> 28;
262 if (reg > 0) {
263 addr = env->regs[reg];
264 }
265 addr += (ipb >> 16) & 0xfff;
266 if (ar) {
267 *ar = reg;
268 }
269
270 return addr;
271}
272
273
274#define decode_basedisp_rs decode_basedisp_s
275
276static inline void s390_do_cpu_full_reset(CPUState *cs, run_on_cpu_data arg)
277{
278 cpu_reset(cs);
279}
280
281
282
283int s390_cpu_write_elf64_note(WriteCoreDumpFunction f, CPUState *cs,
284 int cpuid, void *opaque);
285
286
287
288const char *cc_name(enum cc_op cc_op);
289void load_psw(CPUS390XState *env, uint64_t mask, uint64_t addr);
290uint32_t calc_cc(CPUS390XState *env, uint32_t cc_op, uint64_t src, uint64_t dst,
291 uint64_t vr);
292
293
294
295#ifndef CONFIG_USER_ONLY
296unsigned int s390_cpu_halt(S390CPU *cpu);
297void s390_cpu_unhalt(S390CPU *cpu);
298#else
299static inline unsigned int s390_cpu_halt(S390CPU *cpu)
300{
301 return 0;
302}
303
304static inline void s390_cpu_unhalt(S390CPU *cpu)
305{
306}
307#endif
308
309
310
311void s390_cpu_model_register_props(Object *obj);
312void s390_cpu_model_class_register_props(ObjectClass *oc);
313void s390_realize_cpu_model(CPUState *cs, Error **errp);
314ObjectClass *s390_cpu_class_by_name(const char *name);
315
316
317
318void s390x_cpu_debug_excp_handler(CPUState *cs);
319void s390_cpu_do_interrupt(CPUState *cpu);
320bool s390_cpu_exec_interrupt(CPUState *cpu, int int_req);
321int s390_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int size, int rw,
322 int mmu_idx);
323void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
324 MMUAccessType access_type,
325 int mmu_idx, uintptr_t retaddr);
326
327
328
329uint32_t set_cc_nz_f32(float32 v);
330uint32_t set_cc_nz_f64(float64 v);
331uint32_t set_cc_nz_f128(float128 v);
332
333
334
335int s390_cpu_gdb_read_register(CPUState *cpu, uint8_t *buf, int reg);
336int s390_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
337void s390_cpu_gdb_init(CPUState *cs);
338
339
340
341void s390_cpu_dump_state(CPUState *cpu, FILE *f, fprintf_function cpu_fprintf,
342 int flags);
343hwaddr s390_cpu_get_phys_page_debug(CPUState *cpu, vaddr addr);
344hwaddr s390_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
345uint64_t get_psw_mask(CPUS390XState *env);
346void s390_cpu_recompute_watchpoints(CPUState *cs);
347void s390x_tod_timer(void *opaque);
348void s390x_cpu_timer(void *opaque);
349void do_restart_interrupt(CPUS390XState *env);
350void s390_handle_wait(S390CPU *cpu);
351#define S390_STORE_STATUS_DEF_ADDR offsetof(LowCore, floating_pt_save_area)
352int s390_store_status(S390CPU *cpu, hwaddr addr, bool store_arch);
353int s390_store_adtl_status(S390CPU *cpu, hwaddr addr, hwaddr len);
354#ifndef CONFIG_USER_ONLY
355LowCore *cpu_map_lowcore(CPUS390XState *env);
356void cpu_unmap_lowcore(LowCore *lowcore);
357#endif
358
359
360
361void trigger_pgm_exception(CPUS390XState *env, uint32_t code, uint32_t ilen);
362void cpu_inject_clock_comparator(S390CPU *cpu);
363void cpu_inject_cpu_timer(S390CPU *cpu);
364void cpu_inject_emergency_signal(S390CPU *cpu, uint16_t src_cpu_addr);
365int cpu_inject_external_call(S390CPU *cpu, uint16_t src_cpu_addr);
366bool s390_cpu_has_io_int(S390CPU *cpu);
367bool s390_cpu_has_ext_int(S390CPU *cpu);
368bool s390_cpu_has_mcck_int(S390CPU *cpu);
369bool s390_cpu_has_int(S390CPU *cpu);
370bool s390_cpu_has_restart_int(S390CPU *cpu);
371bool s390_cpu_has_stop_int(S390CPU *cpu);
372void cpu_inject_restart(S390CPU *cpu);
373void cpu_inject_stop(S390CPU *cpu);
374
375
376
377void ioinst_handle_xsch(S390CPU *cpu, uint64_t reg1, uintptr_t ra);
378void ioinst_handle_csch(S390CPU *cpu, uint64_t reg1, uintptr_t ra);
379void ioinst_handle_hsch(S390CPU *cpu, uint64_t reg1, uintptr_t ra);
380void ioinst_handle_msch(S390CPU *cpu, uint64_t reg1, uint32_t ipb,
381 uintptr_t ra);
382void ioinst_handle_ssch(S390CPU *cpu, uint64_t reg1, uint32_t ipb,
383 uintptr_t ra);
384void ioinst_handle_stcrw(S390CPU *cpu, uint32_t ipb, uintptr_t ra);
385void ioinst_handle_stsch(S390CPU *cpu, uint64_t reg1, uint32_t ipb,
386 uintptr_t ra);
387int ioinst_handle_tsch(S390CPU *cpu, uint64_t reg1, uint32_t ipb, uintptr_t ra);
388void ioinst_handle_chsc(S390CPU *cpu, uint32_t ipb, uintptr_t ra);
389void ioinst_handle_schm(S390CPU *cpu, uint64_t reg1, uint64_t reg2,
390 uint32_t ipb, uintptr_t ra);
391void ioinst_handle_rsch(S390CPU *cpu, uint64_t reg1, uintptr_t ra);
392void ioinst_handle_rchp(S390CPU *cpu, uint64_t reg1, uintptr_t ra);
393void ioinst_handle_sal(S390CPU *cpu, uint64_t reg1, uintptr_t ra);
394
395
396
397target_ulong mmu_real2abs(CPUS390XState *env, target_ulong raddr);
398
399
400
401int mmu_translate(CPUS390XState *env, target_ulong vaddr, int rw, uint64_t asc,
402 target_ulong *raddr, int *flags, bool exc);
403int mmu_translate_real(CPUS390XState *env, target_ulong raddr, int rw,
404 target_ulong *addr, int *flags);
405
406
407
408int handle_diag_288(CPUS390XState *env, uint64_t r1, uint64_t r3);
409void handle_diag_308(CPUS390XState *env, uint64_t r1, uint64_t r3,
410 uintptr_t ra);
411
412
413
414void s390x_translate_init(void);
415
416
417
418int handle_sigp(CPUS390XState *env, uint8_t order, uint64_t r1, uint64_t r3);
419void do_stop_interrupt(CPUS390XState *env);
420
421#endif
422