root / target-s390x / cpu.h @ 1f206266
History | View | Annotate | Download (33.4 kB)
1 | 10ec5117 | Alexander Graf | /*
|
---|---|---|---|
2 | 10ec5117 | Alexander Graf | * S/390 virtual CPU header
|
3 | 10ec5117 | Alexander Graf | *
|
4 | 10ec5117 | Alexander Graf | * Copyright (c) 2009 Ulrich Hecht
|
5 | 10ec5117 | Alexander Graf | *
|
6 | 10ec5117 | Alexander Graf | * This library is free software; you can redistribute it and/or
|
7 | 10ec5117 | Alexander Graf | * modify it under the terms of the GNU Lesser General Public
|
8 | 10ec5117 | Alexander Graf | * License as published by the Free Software Foundation; either
|
9 | 10ec5117 | Alexander Graf | * version 2 of the License, or (at your option) any later version.
|
10 | 10ec5117 | Alexander Graf | *
|
11 | 10ec5117 | Alexander Graf | * This library is distributed in the hope that it will be useful,
|
12 | 10ec5117 | Alexander Graf | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
13 | 10ec5117 | Alexander Graf | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
14 | 10ec5117 | Alexander Graf | * Lesser General Public License for more details.
|
15 | 10ec5117 | Alexander Graf | *
|
16 | 10ec5117 | Alexander Graf | * You should have received a copy of the GNU Lesser General Public
|
17 | 70539e18 | Blue Swirl | * License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
18 | 10ec5117 | Alexander Graf | */
|
19 | 10ec5117 | Alexander Graf | #ifndef CPU_S390X_H
|
20 | 10ec5117 | Alexander Graf | #define CPU_S390X_H
|
21 | 10ec5117 | Alexander Graf | |
22 | 10ec5117 | Alexander Graf | #define TARGET_LONG_BITS 64 |
23 | 10ec5117 | Alexander Graf | |
24 | 10ec5117 | Alexander Graf | #define ELF_MACHINE EM_S390
|
25 | 10ec5117 | Alexander Graf | |
26 | 10ec5117 | Alexander Graf | #define CPUState struct CPUS390XState |
27 | 10ec5117 | Alexander Graf | |
28 | 10ec5117 | Alexander Graf | #include "cpu-defs.h" |
29 | bcec36ea | Alexander Graf | #define TARGET_PAGE_BITS 12 |
30 | bcec36ea | Alexander Graf | |
31 | bcec36ea | Alexander Graf | #define TARGET_PHYS_ADDR_SPACE_BITS 64 |
32 | bcec36ea | Alexander Graf | #define TARGET_VIRT_ADDR_SPACE_BITS 64 |
33 | bcec36ea | Alexander Graf | |
34 | bcec36ea | Alexander Graf | #include "cpu-all.h" |
35 | 10ec5117 | Alexander Graf | |
36 | 10ec5117 | Alexander Graf | #include "softfloat.h" |
37 | 10ec5117 | Alexander Graf | |
38 | bcec36ea | Alexander Graf | #define NB_MMU_MODES 3 |
39 | 10ec5117 | Alexander Graf | |
40 | bcec36ea | Alexander Graf | #define MMU_MODE0_SUFFIX _primary
|
41 | bcec36ea | Alexander Graf | #define MMU_MODE1_SUFFIX _secondary
|
42 | bcec36ea | Alexander Graf | #define MMU_MODE2_SUFFIX _home
|
43 | bcec36ea | Alexander Graf | |
44 | bcec36ea | Alexander Graf | #define MMU_USER_IDX 1 |
45 | bcec36ea | Alexander Graf | |
46 | bcec36ea | Alexander Graf | #define MAX_EXT_QUEUE 16 |
47 | bcec36ea | Alexander Graf | |
48 | bcec36ea | Alexander Graf | typedef struct PSW { |
49 | bcec36ea | Alexander Graf | uint64_t mask; |
50 | bcec36ea | Alexander Graf | uint64_t addr; |
51 | bcec36ea | Alexander Graf | } PSW; |
52 | bcec36ea | Alexander Graf | |
53 | bcec36ea | Alexander Graf | typedef struct ExtQueue { |
54 | bcec36ea | Alexander Graf | uint32_t code; |
55 | bcec36ea | Alexander Graf | uint32_t param; |
56 | bcec36ea | Alexander Graf | uint32_t param64; |
57 | bcec36ea | Alexander Graf | } ExtQueue; |
58 | 10ec5117 | Alexander Graf | |
59 | 10ec5117 | Alexander Graf | typedef struct CPUS390XState { |
60 | 10ec5117 | Alexander Graf | uint64_t regs[16]; /* GP registers */ |
61 | 10ec5117 | Alexander Graf | |
62 | 10ec5117 | Alexander Graf | uint32_t aregs[16]; /* access registers */ |
63 | 10ec5117 | Alexander Graf | |
64 | 10ec5117 | Alexander Graf | uint32_t fpc; /* floating-point control register */
|
65 | bcec36ea | Alexander Graf | CPU_DoubleU fregs[16]; /* FP registers */ |
66 | 10ec5117 | Alexander Graf | float_status fpu_status; /* passed to softfloat lib */
|
67 | 10ec5117 | Alexander Graf | |
68 | bcec36ea | Alexander Graf | PSW psw; |
69 | 10ec5117 | Alexander Graf | |
70 | bcec36ea | Alexander Graf | uint32_t cc; |
71 | bcec36ea | Alexander Graf | uint32_t cc_op; |
72 | bcec36ea | Alexander Graf | uint64_t cc_src; |
73 | bcec36ea | Alexander Graf | uint64_t cc_dst; |
74 | bcec36ea | Alexander Graf | uint64_t cc_vr; |
75 | 10ec5117 | Alexander Graf | |
76 | 10ec5117 | Alexander Graf | uint64_t __excp_addr; |
77 | bcec36ea | Alexander Graf | uint64_t psa; |
78 | bcec36ea | Alexander Graf | |
79 | bcec36ea | Alexander Graf | uint32_t int_pgm_code; |
80 | bcec36ea | Alexander Graf | uint32_t int_pgm_ilc; |
81 | bcec36ea | Alexander Graf | |
82 | bcec36ea | Alexander Graf | uint32_t int_svc_code; |
83 | bcec36ea | Alexander Graf | uint32_t int_svc_ilc; |
84 | bcec36ea | Alexander Graf | |
85 | bcec36ea | Alexander Graf | uint64_t cregs[16]; /* control registers */ |
86 | bcec36ea | Alexander Graf | |
87 | bcec36ea | Alexander Graf | int pending_int;
|
88 | bcec36ea | Alexander Graf | ExtQueue ext_queue[MAX_EXT_QUEUE]; |
89 | bcec36ea | Alexander Graf | |
90 | bcec36ea | Alexander Graf | /* reset does memset(0) up to here */
|
91 | bcec36ea | Alexander Graf | |
92 | bcec36ea | Alexander Graf | int ext_index;
|
93 | bcec36ea | Alexander Graf | int cpu_num;
|
94 | bcec36ea | Alexander Graf | uint8_t *storage_keys; |
95 | bcec36ea | Alexander Graf | |
96 | bcec36ea | Alexander Graf | uint64_t tod_offset; |
97 | bcec36ea | Alexander Graf | uint64_t tod_basetime; |
98 | bcec36ea | Alexander Graf | QEMUTimer *tod_timer; |
99 | bcec36ea | Alexander Graf | |
100 | bcec36ea | Alexander Graf | QEMUTimer *cpu_timer; |
101 | 10ec5117 | Alexander Graf | |
102 | 10ec5117 | Alexander Graf | CPU_COMMON |
103 | 10ec5117 | Alexander Graf | } CPUS390XState; |
104 | 10ec5117 | Alexander Graf | |
105 | 10ec5117 | Alexander Graf | #if defined(CONFIG_USER_ONLY)
|
106 | 10ec5117 | Alexander Graf | static inline void cpu_clone_regs(CPUState *env, target_ulong newsp) |
107 | 10ec5117 | Alexander Graf | { |
108 | bcec36ea | Alexander Graf | if (newsp) {
|
109 | 10ec5117 | Alexander Graf | env->regs[15] = newsp;
|
110 | bcec36ea | Alexander Graf | } |
111 | 10ec5117 | Alexander Graf | env->regs[0] = 0; |
112 | 10ec5117 | Alexander Graf | } |
113 | 10ec5117 | Alexander Graf | #endif
|
114 | 10ec5117 | Alexander Graf | |
115 | bcec36ea | Alexander Graf | /* Interrupt Codes */
|
116 | bcec36ea | Alexander Graf | /* Program Interrupts */
|
117 | bcec36ea | Alexander Graf | #define PGM_OPERATION 0x0001 |
118 | bcec36ea | Alexander Graf | #define PGM_PRIVILEGED 0x0002 |
119 | bcec36ea | Alexander Graf | #define PGM_EXECUTE 0x0003 |
120 | bcec36ea | Alexander Graf | #define PGM_PROTECTION 0x0004 |
121 | bcec36ea | Alexander Graf | #define PGM_ADDRESSING 0x0005 |
122 | bcec36ea | Alexander Graf | #define PGM_SPECIFICATION 0x0006 |
123 | bcec36ea | Alexander Graf | #define PGM_DATA 0x0007 |
124 | bcec36ea | Alexander Graf | #define PGM_FIXPT_OVERFLOW 0x0008 |
125 | bcec36ea | Alexander Graf | #define PGM_FIXPT_DIVIDE 0x0009 |
126 | bcec36ea | Alexander Graf | #define PGM_DEC_OVERFLOW 0x000a |
127 | bcec36ea | Alexander Graf | #define PGM_DEC_DIVIDE 0x000b |
128 | bcec36ea | Alexander Graf | #define PGM_HFP_EXP_OVERFLOW 0x000c |
129 | bcec36ea | Alexander Graf | #define PGM_HFP_EXP_UNDERFLOW 0x000d |
130 | bcec36ea | Alexander Graf | #define PGM_HFP_SIGNIFICANCE 0x000e |
131 | bcec36ea | Alexander Graf | #define PGM_HFP_DIVIDE 0x000f |
132 | bcec36ea | Alexander Graf | #define PGM_SEGMENT_TRANS 0x0010 |
133 | bcec36ea | Alexander Graf | #define PGM_PAGE_TRANS 0x0011 |
134 | bcec36ea | Alexander Graf | #define PGM_TRANS_SPEC 0x0012 |
135 | bcec36ea | Alexander Graf | #define PGM_SPECIAL_OP 0x0013 |
136 | bcec36ea | Alexander Graf | #define PGM_OPERAND 0x0015 |
137 | bcec36ea | Alexander Graf | #define PGM_TRACE_TABLE 0x0016 |
138 | bcec36ea | Alexander Graf | #define PGM_SPACE_SWITCH 0x001c |
139 | bcec36ea | Alexander Graf | #define PGM_HFP_SQRT 0x001d |
140 | bcec36ea | Alexander Graf | #define PGM_PC_TRANS_SPEC 0x001f |
141 | bcec36ea | Alexander Graf | #define PGM_AFX_TRANS 0x0020 |
142 | bcec36ea | Alexander Graf | #define PGM_ASX_TRANS 0x0021 |
143 | bcec36ea | Alexander Graf | #define PGM_LX_TRANS 0x0022 |
144 | bcec36ea | Alexander Graf | #define PGM_EX_TRANS 0x0023 |
145 | bcec36ea | Alexander Graf | #define PGM_PRIM_AUTH 0x0024 |
146 | bcec36ea | Alexander Graf | #define PGM_SEC_AUTH 0x0025 |
147 | bcec36ea | Alexander Graf | #define PGM_ALET_SPEC 0x0028 |
148 | bcec36ea | Alexander Graf | #define PGM_ALEN_SPEC 0x0029 |
149 | bcec36ea | Alexander Graf | #define PGM_ALE_SEQ 0x002a |
150 | bcec36ea | Alexander Graf | #define PGM_ASTE_VALID 0x002b |
151 | bcec36ea | Alexander Graf | #define PGM_ASTE_SEQ 0x002c |
152 | bcec36ea | Alexander Graf | #define PGM_EXT_AUTH 0x002d |
153 | bcec36ea | Alexander Graf | #define PGM_STACK_FULL 0x0030 |
154 | bcec36ea | Alexander Graf | #define PGM_STACK_EMPTY 0x0031 |
155 | bcec36ea | Alexander Graf | #define PGM_STACK_SPEC 0x0032 |
156 | bcec36ea | Alexander Graf | #define PGM_STACK_TYPE 0x0033 |
157 | bcec36ea | Alexander Graf | #define PGM_STACK_OP 0x0034 |
158 | bcec36ea | Alexander Graf | #define PGM_ASCE_TYPE 0x0038 |
159 | bcec36ea | Alexander Graf | #define PGM_REG_FIRST_TRANS 0x0039 |
160 | bcec36ea | Alexander Graf | #define PGM_REG_SEC_TRANS 0x003a |
161 | bcec36ea | Alexander Graf | #define PGM_REG_THIRD_TRANS 0x003b |
162 | bcec36ea | Alexander Graf | #define PGM_MONITOR 0x0040 |
163 | bcec36ea | Alexander Graf | #define PGM_PER 0x0080 |
164 | bcec36ea | Alexander Graf | #define PGM_CRYPTO 0x0119 |
165 | bcec36ea | Alexander Graf | |
166 | bcec36ea | Alexander Graf | /* External Interrupts */
|
167 | bcec36ea | Alexander Graf | #define EXT_INTERRUPT_KEY 0x0040 |
168 | bcec36ea | Alexander Graf | #define EXT_CLOCK_COMP 0x1004 |
169 | bcec36ea | Alexander Graf | #define EXT_CPU_TIMER 0x1005 |
170 | bcec36ea | Alexander Graf | #define EXT_MALFUNCTION 0x1200 |
171 | bcec36ea | Alexander Graf | #define EXT_EMERGENCY 0x1201 |
172 | bcec36ea | Alexander Graf | #define EXT_EXTERNAL_CALL 0x1202 |
173 | bcec36ea | Alexander Graf | #define EXT_ETR 0x1406 |
174 | bcec36ea | Alexander Graf | #define EXT_SERVICE 0x2401 |
175 | bcec36ea | Alexander Graf | #define EXT_VIRTIO 0x2603 |
176 | bcec36ea | Alexander Graf | |
177 | bcec36ea | Alexander Graf | /* PSW defines */
|
178 | bcec36ea | Alexander Graf | #undef PSW_MASK_PER
|
179 | bcec36ea | Alexander Graf | #undef PSW_MASK_DAT
|
180 | bcec36ea | Alexander Graf | #undef PSW_MASK_IO
|
181 | bcec36ea | Alexander Graf | #undef PSW_MASK_EXT
|
182 | bcec36ea | Alexander Graf | #undef PSW_MASK_KEY
|
183 | bcec36ea | Alexander Graf | #undef PSW_SHIFT_KEY
|
184 | bcec36ea | Alexander Graf | #undef PSW_MASK_MCHECK
|
185 | bcec36ea | Alexander Graf | #undef PSW_MASK_WAIT
|
186 | bcec36ea | Alexander Graf | #undef PSW_MASK_PSTATE
|
187 | bcec36ea | Alexander Graf | #undef PSW_MASK_ASC
|
188 | bcec36ea | Alexander Graf | #undef PSW_MASK_CC
|
189 | bcec36ea | Alexander Graf | #undef PSW_MASK_PM
|
190 | bcec36ea | Alexander Graf | #undef PSW_MASK_64
|
191 | bcec36ea | Alexander Graf | |
192 | bcec36ea | Alexander Graf | #define PSW_MASK_PER 0x4000000000000000ULL |
193 | bcec36ea | Alexander Graf | #define PSW_MASK_DAT 0x0400000000000000ULL |
194 | bcec36ea | Alexander Graf | #define PSW_MASK_IO 0x0200000000000000ULL |
195 | bcec36ea | Alexander Graf | #define PSW_MASK_EXT 0x0100000000000000ULL |
196 | bcec36ea | Alexander Graf | #define PSW_MASK_KEY 0x00F0000000000000ULL |
197 | bcec36ea | Alexander Graf | #define PSW_SHIFT_KEY 56 |
198 | bcec36ea | Alexander Graf | #define PSW_MASK_MCHECK 0x0004000000000000ULL |
199 | bcec36ea | Alexander Graf | #define PSW_MASK_WAIT 0x0002000000000000ULL |
200 | bcec36ea | Alexander Graf | #define PSW_MASK_PSTATE 0x0001000000000000ULL |
201 | bcec36ea | Alexander Graf | #define PSW_MASK_ASC 0x0000C00000000000ULL |
202 | bcec36ea | Alexander Graf | #define PSW_MASK_CC 0x0000300000000000ULL |
203 | bcec36ea | Alexander Graf | #define PSW_MASK_PM 0x00000F0000000000ULL |
204 | bcec36ea | Alexander Graf | #define PSW_MASK_64 0x0000000100000000ULL |
205 | bcec36ea | Alexander Graf | #define PSW_MASK_32 0x0000000080000000ULL |
206 | bcec36ea | Alexander Graf | |
207 | bcec36ea | Alexander Graf | #undef PSW_ASC_PRIMARY
|
208 | bcec36ea | Alexander Graf | #undef PSW_ASC_ACCREG
|
209 | bcec36ea | Alexander Graf | #undef PSW_ASC_SECONDARY
|
210 | bcec36ea | Alexander Graf | #undef PSW_ASC_HOME
|
211 | bcec36ea | Alexander Graf | |
212 | bcec36ea | Alexander Graf | #define PSW_ASC_PRIMARY 0x0000000000000000ULL |
213 | bcec36ea | Alexander Graf | #define PSW_ASC_ACCREG 0x0000400000000000ULL |
214 | bcec36ea | Alexander Graf | #define PSW_ASC_SECONDARY 0x0000800000000000ULL |
215 | bcec36ea | Alexander Graf | #define PSW_ASC_HOME 0x0000C00000000000ULL |
216 | bcec36ea | Alexander Graf | |
217 | bcec36ea | Alexander Graf | /* tb flags */
|
218 | bcec36ea | Alexander Graf | |
219 | bcec36ea | Alexander Graf | #define FLAG_MASK_PER (PSW_MASK_PER >> 32) |
220 | bcec36ea | Alexander Graf | #define FLAG_MASK_DAT (PSW_MASK_DAT >> 32) |
221 | bcec36ea | Alexander Graf | #define FLAG_MASK_IO (PSW_MASK_IO >> 32) |
222 | bcec36ea | Alexander Graf | #define FLAG_MASK_EXT (PSW_MASK_EXT >> 32) |
223 | bcec36ea | Alexander Graf | #define FLAG_MASK_KEY (PSW_MASK_KEY >> 32) |
224 | bcec36ea | Alexander Graf | #define FLAG_MASK_MCHECK (PSW_MASK_MCHECK >> 32) |
225 | bcec36ea | Alexander Graf | #define FLAG_MASK_WAIT (PSW_MASK_WAIT >> 32) |
226 | bcec36ea | Alexander Graf | #define FLAG_MASK_PSTATE (PSW_MASK_PSTATE >> 32) |
227 | bcec36ea | Alexander Graf | #define FLAG_MASK_ASC (PSW_MASK_ASC >> 32) |
228 | bcec36ea | Alexander Graf | #define FLAG_MASK_CC (PSW_MASK_CC >> 32) |
229 | bcec36ea | Alexander Graf | #define FLAG_MASK_PM (PSW_MASK_PM >> 32) |
230 | bcec36ea | Alexander Graf | #define FLAG_MASK_64 (PSW_MASK_64 >> 32) |
231 | bcec36ea | Alexander Graf | #define FLAG_MASK_32 0x00001000 |
232 | bcec36ea | Alexander Graf | |
233 | 10c339a0 | Alexander Graf | static inline int cpu_mmu_index (CPUState *env) |
234 | 10c339a0 | Alexander Graf | { |
235 | bcec36ea | Alexander Graf | if (env->psw.mask & PSW_MASK_PSTATE) {
|
236 | bcec36ea | Alexander Graf | return 1; |
237 | bcec36ea | Alexander Graf | } |
238 | bcec36ea | Alexander Graf | |
239 | 10c339a0 | Alexander Graf | return 0; |
240 | 10c339a0 | Alexander Graf | } |
241 | 10c339a0 | Alexander Graf | |
242 | bcec36ea | Alexander Graf | static inline void cpu_get_tb_cpu_state(CPUState* env, target_ulong *pc, |
243 | bcec36ea | Alexander Graf | target_ulong *cs_base, int *flags)
|
244 | bcec36ea | Alexander Graf | { |
245 | bcec36ea | Alexander Graf | *pc = env->psw.addr; |
246 | bcec36ea | Alexander Graf | *cs_base = 0;
|
247 | bcec36ea | Alexander Graf | *flags = ((env->psw.mask >> 32) & ~FLAG_MASK_CC) |
|
248 | bcec36ea | Alexander Graf | ((env->psw.mask & PSW_MASK_32) ? FLAG_MASK_32 : 0);
|
249 | bcec36ea | Alexander Graf | } |
250 | bcec36ea | Alexander Graf | |
251 | bcec36ea | Alexander Graf | static inline int get_ilc(uint8_t opc) |
252 | bcec36ea | Alexander Graf | { |
253 | bcec36ea | Alexander Graf | switch (opc >> 6) { |
254 | bcec36ea | Alexander Graf | case 0: |
255 | bcec36ea | Alexander Graf | return 1; |
256 | bcec36ea | Alexander Graf | case 1: |
257 | bcec36ea | Alexander Graf | case 2: |
258 | bcec36ea | Alexander Graf | return 2; |
259 | bcec36ea | Alexander Graf | case 3: |
260 | bcec36ea | Alexander Graf | return 3; |
261 | bcec36ea | Alexander Graf | } |
262 | bcec36ea | Alexander Graf | |
263 | bcec36ea | Alexander Graf | return 0; |
264 | bcec36ea | Alexander Graf | } |
265 | bcec36ea | Alexander Graf | |
266 | bcec36ea | Alexander Graf | #define ILC_LATER 0x20 |
267 | bcec36ea | Alexander Graf | #define ILC_LATER_INC 0x21 |
268 | bcec36ea | Alexander Graf | #define ILC_LATER_INC_2 0x22 |
269 | bcec36ea | Alexander Graf | |
270 | bcec36ea | Alexander Graf | |
271 | 10ec5117 | Alexander Graf | CPUS390XState *cpu_s390x_init(const char *cpu_model); |
272 | bcec36ea | Alexander Graf | void s390x_translate_init(void); |
273 | 10ec5117 | Alexander Graf | int cpu_s390x_exec(CPUS390XState *s);
|
274 | 10ec5117 | Alexander Graf | void cpu_s390x_close(CPUS390XState *s);
|
275 | bcec36ea | Alexander Graf | void do_interrupt (CPUState *env);
|
276 | 10ec5117 | Alexander Graf | |
277 | 10ec5117 | Alexander Graf | /* you can call this signal handler from your SIGBUS and SIGSEGV
|
278 | 10ec5117 | Alexander Graf | signal handlers to inform the virtual CPU of exceptions. non zero
|
279 | 10ec5117 | Alexander Graf | is returned if the signal was handled by the virtual CPU. */
|
280 | 10ec5117 | Alexander Graf | int cpu_s390x_signal_handler(int host_signum, void *pinfo, |
281 | 10ec5117 | Alexander Graf | void *puc);
|
282 | 10ec5117 | Alexander Graf | int cpu_s390x_handle_mmu_fault (CPUS390XState *env, target_ulong address, int rw, |
283 | 10ec5117 | Alexander Graf | int mmu_idx, int is_softmuu); |
284 | 10ec5117 | Alexander Graf | #define cpu_handle_mmu_fault cpu_s390x_handle_mmu_fault
|
285 | 10ec5117 | Alexander Graf | |
286 | 52705890 | Richard Henderson | |
287 | 10c339a0 | Alexander Graf | #ifndef CONFIG_USER_ONLY
|
288 | bcec36ea | Alexander Graf | int s390_virtio_hypercall(CPUState *env, uint64_t mem, uint64_t hypercall);
|
289 | bcec36ea | Alexander Graf | |
290 | 1f206266 | Alexander Graf | #ifdef CONFIG_KVM
|
291 | bcec36ea | Alexander Graf | void kvm_s390_interrupt(CPUState *env, int type, uint32_t code); |
292 | 64b85a8f | Blue Swirl | void kvm_s390_virtio_irq(CPUState *env, int config_change, uint64_t token); |
293 | bcec36ea | Alexander Graf | void kvm_s390_interrupt_internal(CPUState *env, int type, uint32_t parm, |
294 | bcec36ea | Alexander Graf | uint64_t parm64, int vm);
|
295 | 1f206266 | Alexander Graf | #else
|
296 | 1f206266 | Alexander Graf | static inline void kvm_s390_interrupt(CPUState *env, int type, uint32_t code) |
297 | 1f206266 | Alexander Graf | { |
298 | 1f206266 | Alexander Graf | } |
299 | 1f206266 | Alexander Graf | |
300 | 1f206266 | Alexander Graf | static inline void kvm_s390_virtio_irq(CPUState *env, int config_change, |
301 | 1f206266 | Alexander Graf | uint64_t token) |
302 | 1f206266 | Alexander Graf | { |
303 | 1f206266 | Alexander Graf | } |
304 | 1f206266 | Alexander Graf | |
305 | 1f206266 | Alexander Graf | static inline void kvm_s390_interrupt_internal(CPUState *env, int type, |
306 | 1f206266 | Alexander Graf | uint32_t parm, uint64_t parm64, |
307 | 1f206266 | Alexander Graf | int vm)
|
308 | 1f206266 | Alexander Graf | { |
309 | 1f206266 | Alexander Graf | } |
310 | 1f206266 | Alexander Graf | #endif
|
311 | 64b85a8f | Blue Swirl | CPUState *s390_cpu_addr2state(uint16_t cpu_addr); |
312 | bcec36ea | Alexander Graf | |
313 | bcec36ea | Alexander Graf | #ifndef KVM_S390_SIGP_STOP
|
314 | bcec36ea | Alexander Graf | #define KVM_S390_SIGP_STOP 0 |
315 | bcec36ea | Alexander Graf | #define KVM_S390_PROGRAM_INT 0 |
316 | bcec36ea | Alexander Graf | #define KVM_S390_SIGP_SET_PREFIX 0 |
317 | bcec36ea | Alexander Graf | #define KVM_S390_RESTART 0 |
318 | bcec36ea | Alexander Graf | #define KVM_S390_INT_VIRTIO 0 |
319 | bcec36ea | Alexander Graf | #define KVM_S390_INT_SERVICE 0 |
320 | bcec36ea | Alexander Graf | #define KVM_S390_INT_EMERGENCY 0 |
321 | bcec36ea | Alexander Graf | #endif
|
322 | bcec36ea | Alexander Graf | |
323 | 10c339a0 | Alexander Graf | #endif
|
324 | bcec36ea | Alexander Graf | void cpu_lock(void); |
325 | bcec36ea | Alexander Graf | void cpu_unlock(void); |
326 | 10c339a0 | Alexander Graf | |
327 | bcec36ea | Alexander Graf | static inline void cpu_set_tls(CPUS390XState *env, target_ulong newtls) |
328 | bcec36ea | Alexander Graf | { |
329 | bcec36ea | Alexander Graf | env->aregs[0] = newtls >> 32; |
330 | bcec36ea | Alexander Graf | env->aregs[1] = newtls & 0xffffffffULL; |
331 | bcec36ea | Alexander Graf | } |
332 | 10c339a0 | Alexander Graf | |
333 | 10ec5117 | Alexander Graf | #define cpu_init cpu_s390x_init
|
334 | 10ec5117 | Alexander Graf | #define cpu_exec cpu_s390x_exec
|
335 | 10ec5117 | Alexander Graf | #define cpu_gen_code cpu_s390x_gen_code
|
336 | bcec36ea | Alexander Graf | #define cpu_signal_handler cpu_s390x_signal_handler
|
337 | 10ec5117 | Alexander Graf | |
338 | bcec36ea | Alexander Graf | #include "exec-all.h" |
339 | bcec36ea | Alexander Graf | |
340 | bcec36ea | Alexander Graf | #ifdef CONFIG_USER_ONLY
|
341 | 10ec5117 | Alexander Graf | |
342 | 10ec5117 | Alexander Graf | #define EXCP_OPEX 1 /* operation exception (sigill) */ |
343 | 10ec5117 | Alexander Graf | #define EXCP_SVC 2 /* supervisor call (syscall) */ |
344 | 10ec5117 | Alexander Graf | #define EXCP_ADDR 5 /* addressing exception */ |
345 | bcec36ea | Alexander Graf | #define EXCP_SPEC 6 /* specification exception */ |
346 | 10ec5117 | Alexander Graf | |
347 | bcec36ea | Alexander Graf | #else
|
348 | bcec36ea | Alexander Graf | |
349 | bcec36ea | Alexander Graf | #define EXCP_EXT 1 /* external interrupt */ |
350 | bcec36ea | Alexander Graf | #define EXCP_SVC 2 /* supervisor call (syscall) */ |
351 | bcec36ea | Alexander Graf | #define EXCP_PGM 3 /* program interruption */ |
352 | bcec36ea | Alexander Graf | |
353 | bcec36ea | Alexander Graf | #endif /* CONFIG_USER_ONLY */ |
354 | bcec36ea | Alexander Graf | |
355 | bcec36ea | Alexander Graf | #define INTERRUPT_EXT (1 << 0) |
356 | bcec36ea | Alexander Graf | #define INTERRUPT_TOD (1 << 1) |
357 | bcec36ea | Alexander Graf | #define INTERRUPT_CPUTIMER (1 << 2) |
358 | 10c339a0 | Alexander Graf | |
359 | 10c339a0 | Alexander Graf | /* Program Status Word. */
|
360 | 10c339a0 | Alexander Graf | #define S390_PSWM_REGNUM 0 |
361 | 10c339a0 | Alexander Graf | #define S390_PSWA_REGNUM 1 |
362 | 10c339a0 | Alexander Graf | /* General Purpose Registers. */
|
363 | 10c339a0 | Alexander Graf | #define S390_R0_REGNUM 2 |
364 | 10c339a0 | Alexander Graf | #define S390_R1_REGNUM 3 |
365 | 10c339a0 | Alexander Graf | #define S390_R2_REGNUM 4 |
366 | 10c339a0 | Alexander Graf | #define S390_R3_REGNUM 5 |
367 | 10c339a0 | Alexander Graf | #define S390_R4_REGNUM 6 |
368 | 10c339a0 | Alexander Graf | #define S390_R5_REGNUM 7 |
369 | 10c339a0 | Alexander Graf | #define S390_R6_REGNUM 8 |
370 | 10c339a0 | Alexander Graf | #define S390_R7_REGNUM 9 |
371 | 10c339a0 | Alexander Graf | #define S390_R8_REGNUM 10 |
372 | 10c339a0 | Alexander Graf | #define S390_R9_REGNUM 11 |
373 | 10c339a0 | Alexander Graf | #define S390_R10_REGNUM 12 |
374 | 10c339a0 | Alexander Graf | #define S390_R11_REGNUM 13 |
375 | 10c339a0 | Alexander Graf | #define S390_R12_REGNUM 14 |
376 | 10c339a0 | Alexander Graf | #define S390_R13_REGNUM 15 |
377 | 10c339a0 | Alexander Graf | #define S390_R14_REGNUM 16 |
378 | 10c339a0 | Alexander Graf | #define S390_R15_REGNUM 17 |
379 | 10c339a0 | Alexander Graf | /* Access Registers. */
|
380 | 10c339a0 | Alexander Graf | #define S390_A0_REGNUM 18 |
381 | 10c339a0 | Alexander Graf | #define S390_A1_REGNUM 19 |
382 | 10c339a0 | Alexander Graf | #define S390_A2_REGNUM 20 |
383 | 10c339a0 | Alexander Graf | #define S390_A3_REGNUM 21 |
384 | 10c339a0 | Alexander Graf | #define S390_A4_REGNUM 22 |
385 | 10c339a0 | Alexander Graf | #define S390_A5_REGNUM 23 |
386 | 10c339a0 | Alexander Graf | #define S390_A6_REGNUM 24 |
387 | 10c339a0 | Alexander Graf | #define S390_A7_REGNUM 25 |
388 | 10c339a0 | Alexander Graf | #define S390_A8_REGNUM 26 |
389 | 10c339a0 | Alexander Graf | #define S390_A9_REGNUM 27 |
390 | 10c339a0 | Alexander Graf | #define S390_A10_REGNUM 28 |
391 | 10c339a0 | Alexander Graf | #define S390_A11_REGNUM 29 |
392 | 10c339a0 | Alexander Graf | #define S390_A12_REGNUM 30 |
393 | 10c339a0 | Alexander Graf | #define S390_A13_REGNUM 31 |
394 | 10c339a0 | Alexander Graf | #define S390_A14_REGNUM 32 |
395 | 10c339a0 | Alexander Graf | #define S390_A15_REGNUM 33 |
396 | 10c339a0 | Alexander Graf | /* Floating Point Control Word. */
|
397 | 10c339a0 | Alexander Graf | #define S390_FPC_REGNUM 34 |
398 | 10c339a0 | Alexander Graf | /* Floating Point Registers. */
|
399 | 10c339a0 | Alexander Graf | #define S390_F0_REGNUM 35 |
400 | 10c339a0 | Alexander Graf | #define S390_F1_REGNUM 36 |
401 | 10c339a0 | Alexander Graf | #define S390_F2_REGNUM 37 |
402 | 10c339a0 | Alexander Graf | #define S390_F3_REGNUM 38 |
403 | 10c339a0 | Alexander Graf | #define S390_F4_REGNUM 39 |
404 | 10c339a0 | Alexander Graf | #define S390_F5_REGNUM 40 |
405 | 10c339a0 | Alexander Graf | #define S390_F6_REGNUM 41 |
406 | 10c339a0 | Alexander Graf | #define S390_F7_REGNUM 42 |
407 | 10c339a0 | Alexander Graf | #define S390_F8_REGNUM 43 |
408 | 10c339a0 | Alexander Graf | #define S390_F9_REGNUM 44 |
409 | 10c339a0 | Alexander Graf | #define S390_F10_REGNUM 45 |
410 | 10c339a0 | Alexander Graf | #define S390_F11_REGNUM 46 |
411 | 10c339a0 | Alexander Graf | #define S390_F12_REGNUM 47 |
412 | 10c339a0 | Alexander Graf | #define S390_F13_REGNUM 48 |
413 | 10c339a0 | Alexander Graf | #define S390_F14_REGNUM 49 |
414 | 10c339a0 | Alexander Graf | #define S390_F15_REGNUM 50 |
415 | 10c339a0 | Alexander Graf | /* Total. */
|
416 | 10c339a0 | Alexander Graf | #define S390_NUM_REGS 51 |
417 | 10c339a0 | Alexander Graf | |
418 | 10c339a0 | Alexander Graf | /* Pseudo registers -- PC and condition code. */
|
419 | 10c339a0 | Alexander Graf | #define S390_PC_REGNUM S390_NUM_REGS
|
420 | 10c339a0 | Alexander Graf | #define S390_CC_REGNUM (S390_NUM_REGS+1) |
421 | 10c339a0 | Alexander Graf | #define S390_NUM_PSEUDO_REGS 2 |
422 | 10c339a0 | Alexander Graf | #define S390_NUM_TOTAL_REGS (S390_NUM_REGS+2) |
423 | 10c339a0 | Alexander Graf | |
424 | 10c339a0 | Alexander Graf | |
425 | 10c339a0 | Alexander Graf | |
426 | 10c339a0 | Alexander Graf | /* Program Status Word. */
|
427 | 10c339a0 | Alexander Graf | #define S390_PSWM_REGNUM 0 |
428 | 10c339a0 | Alexander Graf | #define S390_PSWA_REGNUM 1 |
429 | 10c339a0 | Alexander Graf | /* General Purpose Registers. */
|
430 | 10c339a0 | Alexander Graf | #define S390_R0_REGNUM 2 |
431 | 10c339a0 | Alexander Graf | #define S390_R1_REGNUM 3 |
432 | 10c339a0 | Alexander Graf | #define S390_R2_REGNUM 4 |
433 | 10c339a0 | Alexander Graf | #define S390_R3_REGNUM 5 |
434 | 10c339a0 | Alexander Graf | #define S390_R4_REGNUM 6 |
435 | 10c339a0 | Alexander Graf | #define S390_R5_REGNUM 7 |
436 | 10c339a0 | Alexander Graf | #define S390_R6_REGNUM 8 |
437 | 10c339a0 | Alexander Graf | #define S390_R7_REGNUM 9 |
438 | 10c339a0 | Alexander Graf | #define S390_R8_REGNUM 10 |
439 | 10c339a0 | Alexander Graf | #define S390_R9_REGNUM 11 |
440 | 10c339a0 | Alexander Graf | #define S390_R10_REGNUM 12 |
441 | 10c339a0 | Alexander Graf | #define S390_R11_REGNUM 13 |
442 | 10c339a0 | Alexander Graf | #define S390_R12_REGNUM 14 |
443 | 10c339a0 | Alexander Graf | #define S390_R13_REGNUM 15 |
444 | 10c339a0 | Alexander Graf | #define S390_R14_REGNUM 16 |
445 | 10c339a0 | Alexander Graf | #define S390_R15_REGNUM 17 |
446 | 10c339a0 | Alexander Graf | /* Access Registers. */
|
447 | 10c339a0 | Alexander Graf | #define S390_A0_REGNUM 18 |
448 | 10c339a0 | Alexander Graf | #define S390_A1_REGNUM 19 |
449 | 10c339a0 | Alexander Graf | #define S390_A2_REGNUM 20 |
450 | 10c339a0 | Alexander Graf | #define S390_A3_REGNUM 21 |
451 | 10c339a0 | Alexander Graf | #define S390_A4_REGNUM 22 |
452 | 10c339a0 | Alexander Graf | #define S390_A5_REGNUM 23 |
453 | 10c339a0 | Alexander Graf | #define S390_A6_REGNUM 24 |
454 | 10c339a0 | Alexander Graf | #define S390_A7_REGNUM 25 |
455 | 10c339a0 | Alexander Graf | #define S390_A8_REGNUM 26 |
456 | 10c339a0 | Alexander Graf | #define S390_A9_REGNUM 27 |
457 | 10c339a0 | Alexander Graf | #define S390_A10_REGNUM 28 |
458 | 10c339a0 | Alexander Graf | #define S390_A11_REGNUM 29 |
459 | 10c339a0 | Alexander Graf | #define S390_A12_REGNUM 30 |
460 | 10c339a0 | Alexander Graf | #define S390_A13_REGNUM 31 |
461 | 10c339a0 | Alexander Graf | #define S390_A14_REGNUM 32 |
462 | 10c339a0 | Alexander Graf | #define S390_A15_REGNUM 33 |
463 | 10c339a0 | Alexander Graf | /* Floating Point Control Word. */
|
464 | 10c339a0 | Alexander Graf | #define S390_FPC_REGNUM 34 |
465 | 10c339a0 | Alexander Graf | /* Floating Point Registers. */
|
466 | 10c339a0 | Alexander Graf | #define S390_F0_REGNUM 35 |
467 | 10c339a0 | Alexander Graf | #define S390_F1_REGNUM 36 |
468 | 10c339a0 | Alexander Graf | #define S390_F2_REGNUM 37 |
469 | 10c339a0 | Alexander Graf | #define S390_F3_REGNUM 38 |
470 | 10c339a0 | Alexander Graf | #define S390_F4_REGNUM 39 |
471 | 10c339a0 | Alexander Graf | #define S390_F5_REGNUM 40 |
472 | 10c339a0 | Alexander Graf | #define S390_F6_REGNUM 41 |
473 | 10c339a0 | Alexander Graf | #define S390_F7_REGNUM 42 |
474 | 10c339a0 | Alexander Graf | #define S390_F8_REGNUM 43 |
475 | 10c339a0 | Alexander Graf | #define S390_F9_REGNUM 44 |
476 | 10c339a0 | Alexander Graf | #define S390_F10_REGNUM 45 |
477 | 10c339a0 | Alexander Graf | #define S390_F11_REGNUM 46 |
478 | 10c339a0 | Alexander Graf | #define S390_F12_REGNUM 47 |
479 | 10c339a0 | Alexander Graf | #define S390_F13_REGNUM 48 |
480 | 10c339a0 | Alexander Graf | #define S390_F14_REGNUM 49 |
481 | 10c339a0 | Alexander Graf | #define S390_F15_REGNUM 50 |
482 | 10c339a0 | Alexander Graf | /* Total. */
|
483 | 10c339a0 | Alexander Graf | #define S390_NUM_REGS 51 |
484 | 10c339a0 | Alexander Graf | |
485 | 10c339a0 | Alexander Graf | /* Pseudo registers -- PC and condition code. */
|
486 | 10c339a0 | Alexander Graf | #define S390_PC_REGNUM S390_NUM_REGS
|
487 | 10c339a0 | Alexander Graf | #define S390_CC_REGNUM (S390_NUM_REGS+1) |
488 | 10c339a0 | Alexander Graf | #define S390_NUM_PSEUDO_REGS 2 |
489 | 10c339a0 | Alexander Graf | #define S390_NUM_TOTAL_REGS (S390_NUM_REGS+2) |
490 | 10c339a0 | Alexander Graf | |
491 | bcec36ea | Alexander Graf | /* CC optimization */
|
492 | bcec36ea | Alexander Graf | |
493 | bcec36ea | Alexander Graf | enum cc_op {
|
494 | bcec36ea | Alexander Graf | CC_OP_CONST0 = 0, /* CC is 0 */ |
495 | bcec36ea | Alexander Graf | CC_OP_CONST1, /* CC is 1 */
|
496 | bcec36ea | Alexander Graf | CC_OP_CONST2, /* CC is 2 */
|
497 | bcec36ea | Alexander Graf | CC_OP_CONST3, /* CC is 3 */
|
498 | bcec36ea | Alexander Graf | |
499 | bcec36ea | Alexander Graf | CC_OP_DYNAMIC, /* CC calculation defined by env->cc_op */
|
500 | bcec36ea | Alexander Graf | CC_OP_STATIC, /* CC value is env->cc_op */
|
501 | bcec36ea | Alexander Graf | |
502 | bcec36ea | Alexander Graf | CC_OP_NZ, /* env->cc_dst != 0 */
|
503 | bcec36ea | Alexander Graf | CC_OP_LTGT_32, /* signed less/greater than (32bit) */
|
504 | bcec36ea | Alexander Graf | CC_OP_LTGT_64, /* signed less/greater than (64bit) */
|
505 | bcec36ea | Alexander Graf | CC_OP_LTUGTU_32, /* unsigned less/greater than (32bit) */
|
506 | bcec36ea | Alexander Graf | CC_OP_LTUGTU_64, /* unsigned less/greater than (64bit) */
|
507 | bcec36ea | Alexander Graf | CC_OP_LTGT0_32, /* signed less/greater than 0 (32bit) */
|
508 | bcec36ea | Alexander Graf | CC_OP_LTGT0_64, /* signed less/greater than 0 (64bit) */
|
509 | bcec36ea | Alexander Graf | |
510 | bcec36ea | Alexander Graf | CC_OP_ADD_64, /* overflow on add (64bit) */
|
511 | bcec36ea | Alexander Graf | CC_OP_ADDU_64, /* overflow on unsigned add (64bit) */
|
512 | bcec36ea | Alexander Graf | CC_OP_SUB_64, /* overflow on substraction (64bit) */
|
513 | bcec36ea | Alexander Graf | CC_OP_SUBU_64, /* overflow on unsigned substraction (64bit) */
|
514 | bcec36ea | Alexander Graf | CC_OP_ABS_64, /* sign eval on abs (64bit) */
|
515 | bcec36ea | Alexander Graf | CC_OP_NABS_64, /* sign eval on nabs (64bit) */
|
516 | bcec36ea | Alexander Graf | |
517 | bcec36ea | Alexander Graf | CC_OP_ADD_32, /* overflow on add (32bit) */
|
518 | bcec36ea | Alexander Graf | CC_OP_ADDU_32, /* overflow on unsigned add (32bit) */
|
519 | bcec36ea | Alexander Graf | CC_OP_SUB_32, /* overflow on substraction (32bit) */
|
520 | bcec36ea | Alexander Graf | CC_OP_SUBU_32, /* overflow on unsigned substraction (32bit) */
|
521 | bcec36ea | Alexander Graf | CC_OP_ABS_32, /* sign eval on abs (64bit) */
|
522 | bcec36ea | Alexander Graf | CC_OP_NABS_32, /* sign eval on nabs (64bit) */
|
523 | bcec36ea | Alexander Graf | |
524 | bcec36ea | Alexander Graf | CC_OP_COMP_32, /* complement */
|
525 | bcec36ea | Alexander Graf | CC_OP_COMP_64, /* complement */
|
526 | bcec36ea | Alexander Graf | |
527 | bcec36ea | Alexander Graf | CC_OP_TM_32, /* test under mask (32bit) */
|
528 | bcec36ea | Alexander Graf | CC_OP_TM_64, /* test under mask (64bit) */
|
529 | bcec36ea | Alexander Graf | |
530 | bcec36ea | Alexander Graf | CC_OP_LTGT_F32, /* FP compare (32bit) */
|
531 | bcec36ea | Alexander Graf | CC_OP_LTGT_F64, /* FP compare (64bit) */
|
532 | bcec36ea | Alexander Graf | |
533 | bcec36ea | Alexander Graf | CC_OP_NZ_F32, /* FP dst != 0 (32bit) */
|
534 | bcec36ea | Alexander Graf | CC_OP_NZ_F64, /* FP dst != 0 (64bit) */
|
535 | bcec36ea | Alexander Graf | |
536 | bcec36ea | Alexander Graf | CC_OP_ICM, /* insert characters under mask */
|
537 | bcec36ea | Alexander Graf | CC_OP_SLAG, /* Calculate shift left signed */
|
538 | bcec36ea | Alexander Graf | CC_OP_MAX |
539 | bcec36ea | Alexander Graf | }; |
540 | bcec36ea | Alexander Graf | |
541 | bcec36ea | Alexander Graf | static const char *cc_names[] = { |
542 | bcec36ea | Alexander Graf | [CC_OP_CONST0] = "CC_OP_CONST0",
|
543 | bcec36ea | Alexander Graf | [CC_OP_CONST1] = "CC_OP_CONST1",
|
544 | bcec36ea | Alexander Graf | [CC_OP_CONST2] = "CC_OP_CONST2",
|
545 | bcec36ea | Alexander Graf | [CC_OP_CONST3] = "CC_OP_CONST3",
|
546 | bcec36ea | Alexander Graf | [CC_OP_DYNAMIC] = "CC_OP_DYNAMIC",
|
547 | bcec36ea | Alexander Graf | [CC_OP_STATIC] = "CC_OP_STATIC",
|
548 | bcec36ea | Alexander Graf | [CC_OP_NZ] = "CC_OP_NZ",
|
549 | bcec36ea | Alexander Graf | [CC_OP_LTGT_32] = "CC_OP_LTGT_32",
|
550 | bcec36ea | Alexander Graf | [CC_OP_LTGT_64] = "CC_OP_LTGT_64",
|
551 | bcec36ea | Alexander Graf | [CC_OP_LTUGTU_32] = "CC_OP_LTUGTU_32",
|
552 | bcec36ea | Alexander Graf | [CC_OP_LTUGTU_64] = "CC_OP_LTUGTU_64",
|
553 | bcec36ea | Alexander Graf | [CC_OP_LTGT0_32] = "CC_OP_LTGT0_32",
|
554 | bcec36ea | Alexander Graf | [CC_OP_LTGT0_64] = "CC_OP_LTGT0_64",
|
555 | bcec36ea | Alexander Graf | [CC_OP_ADD_64] = "CC_OP_ADD_64",
|
556 | bcec36ea | Alexander Graf | [CC_OP_ADDU_64] = "CC_OP_ADDU_64",
|
557 | bcec36ea | Alexander Graf | [CC_OP_SUB_64] = "CC_OP_SUB_64",
|
558 | bcec36ea | Alexander Graf | [CC_OP_SUBU_64] = "CC_OP_SUBU_64",
|
559 | bcec36ea | Alexander Graf | [CC_OP_ABS_64] = "CC_OP_ABS_64",
|
560 | bcec36ea | Alexander Graf | [CC_OP_NABS_64] = "CC_OP_NABS_64",
|
561 | bcec36ea | Alexander Graf | [CC_OP_ADD_32] = "CC_OP_ADD_32",
|
562 | bcec36ea | Alexander Graf | [CC_OP_ADDU_32] = "CC_OP_ADDU_32",
|
563 | bcec36ea | Alexander Graf | [CC_OP_SUB_32] = "CC_OP_SUB_32",
|
564 | bcec36ea | Alexander Graf | [CC_OP_SUBU_32] = "CC_OP_SUBU_32",
|
565 | bcec36ea | Alexander Graf | [CC_OP_ABS_32] = "CC_OP_ABS_32",
|
566 | bcec36ea | Alexander Graf | [CC_OP_NABS_32] = "CC_OP_NABS_32",
|
567 | bcec36ea | Alexander Graf | [CC_OP_COMP_32] = "CC_OP_COMP_32",
|
568 | bcec36ea | Alexander Graf | [CC_OP_COMP_64] = "CC_OP_COMP_64",
|
569 | bcec36ea | Alexander Graf | [CC_OP_TM_32] = "CC_OP_TM_32",
|
570 | bcec36ea | Alexander Graf | [CC_OP_TM_64] = "CC_OP_TM_64",
|
571 | bcec36ea | Alexander Graf | [CC_OP_LTGT_F32] = "CC_OP_LTGT_F32",
|
572 | bcec36ea | Alexander Graf | [CC_OP_LTGT_F64] = "CC_OP_LTGT_F64",
|
573 | bcec36ea | Alexander Graf | [CC_OP_NZ_F32] = "CC_OP_NZ_F32",
|
574 | bcec36ea | Alexander Graf | [CC_OP_NZ_F64] = "CC_OP_NZ_F64",
|
575 | bcec36ea | Alexander Graf | [CC_OP_ICM] = "CC_OP_ICM",
|
576 | bcec36ea | Alexander Graf | [CC_OP_SLAG] = "CC_OP_SLAG",
|
577 | bcec36ea | Alexander Graf | }; |
578 | bcec36ea | Alexander Graf | |
579 | bcec36ea | Alexander Graf | static inline const char *cc_name(int cc_op) |
580 | bcec36ea | Alexander Graf | { |
581 | bcec36ea | Alexander Graf | return cc_names[cc_op];
|
582 | bcec36ea | Alexander Graf | } |
583 | bcec36ea | Alexander Graf | |
584 | bcec36ea | Alexander Graf | /* SCLP PV interface defines */
|
585 | bcec36ea | Alexander Graf | #define SCLP_CMDW_READ_SCP_INFO 0x00020001 |
586 | bcec36ea | Alexander Graf | #define SCLP_CMDW_READ_SCP_INFO_FORCED 0x00120001 |
587 | bcec36ea | Alexander Graf | |
588 | bcec36ea | Alexander Graf | #define SCP_LENGTH 0x00 |
589 | bcec36ea | Alexander Graf | #define SCP_FUNCTION_CODE 0x02 |
590 | bcec36ea | Alexander Graf | #define SCP_CONTROL_MASK 0x03 |
591 | bcec36ea | Alexander Graf | #define SCP_RESPONSE_CODE 0x06 |
592 | bcec36ea | Alexander Graf | #define SCP_MEM_CODE 0x08 |
593 | bcec36ea | Alexander Graf | #define SCP_INCREMENT 0x0a |
594 | bcec36ea | Alexander Graf | |
595 | bcec36ea | Alexander Graf | typedef struct LowCore |
596 | bcec36ea | Alexander Graf | { |
597 | bcec36ea | Alexander Graf | /* prefix area: defined by architecture */
|
598 | bcec36ea | Alexander Graf | uint32_t ccw1[2]; /* 0x000 */ |
599 | bcec36ea | Alexander Graf | uint32_t ccw2[4]; /* 0x008 */ |
600 | bcec36ea | Alexander Graf | uint8_t pad1[0x80-0x18]; /* 0x018 */ |
601 | bcec36ea | Alexander Graf | uint32_t ext_params; /* 0x080 */
|
602 | bcec36ea | Alexander Graf | uint16_t cpu_addr; /* 0x084 */
|
603 | bcec36ea | Alexander Graf | uint16_t ext_int_code; /* 0x086 */
|
604 | bcec36ea | Alexander Graf | uint16_t svc_ilc; /* 0x088 */
|
605 | bcec36ea | Alexander Graf | uint16_t svc_code; /* 0x08a */
|
606 | bcec36ea | Alexander Graf | uint16_t pgm_ilc; /* 0x08c */
|
607 | bcec36ea | Alexander Graf | uint16_t pgm_code; /* 0x08e */
|
608 | bcec36ea | Alexander Graf | uint32_t data_exc_code; /* 0x090 */
|
609 | bcec36ea | Alexander Graf | uint16_t mon_class_num; /* 0x094 */
|
610 | bcec36ea | Alexander Graf | uint16_t per_perc_atmid; /* 0x096 */
|
611 | bcec36ea | Alexander Graf | uint64_t per_address; /* 0x098 */
|
612 | bcec36ea | Alexander Graf | uint8_t exc_access_id; /* 0x0a0 */
|
613 | bcec36ea | Alexander Graf | uint8_t per_access_id; /* 0x0a1 */
|
614 | bcec36ea | Alexander Graf | uint8_t op_access_id; /* 0x0a2 */
|
615 | bcec36ea | Alexander Graf | uint8_t ar_access_id; /* 0x0a3 */
|
616 | bcec36ea | Alexander Graf | uint8_t pad2[0xA8-0xA4]; /* 0x0a4 */ |
617 | bcec36ea | Alexander Graf | uint64_t trans_exc_code; /* 0x0a8 */
|
618 | bcec36ea | Alexander Graf | uint64_t monitor_code; /* 0x0b0 */
|
619 | bcec36ea | Alexander Graf | uint16_t subchannel_id; /* 0x0b8 */
|
620 | bcec36ea | Alexander Graf | uint16_t subchannel_nr; /* 0x0ba */
|
621 | bcec36ea | Alexander Graf | uint32_t io_int_parm; /* 0x0bc */
|
622 | bcec36ea | Alexander Graf | uint32_t io_int_word; /* 0x0c0 */
|
623 | bcec36ea | Alexander Graf | uint8_t pad3[0xc8-0xc4]; /* 0x0c4 */ |
624 | bcec36ea | Alexander Graf | uint32_t stfl_fac_list; /* 0x0c8 */
|
625 | bcec36ea | Alexander Graf | uint8_t pad4[0xe8-0xcc]; /* 0x0cc */ |
626 | bcec36ea | Alexander Graf | uint32_t mcck_interruption_code[2]; /* 0x0e8 */ |
627 | bcec36ea | Alexander Graf | uint8_t pad5[0xf4-0xf0]; /* 0x0f0 */ |
628 | bcec36ea | Alexander Graf | uint32_t external_damage_code; /* 0x0f4 */
|
629 | bcec36ea | Alexander Graf | uint64_t failing_storage_address; /* 0x0f8 */
|
630 | bcec36ea | Alexander Graf | uint8_t pad6[0x120-0x100]; /* 0x100 */ |
631 | bcec36ea | Alexander Graf | PSW restart_old_psw; /* 0x120 */
|
632 | bcec36ea | Alexander Graf | PSW external_old_psw; /* 0x130 */
|
633 | bcec36ea | Alexander Graf | PSW svc_old_psw; /* 0x140 */
|
634 | bcec36ea | Alexander Graf | PSW program_old_psw; /* 0x150 */
|
635 | bcec36ea | Alexander Graf | PSW mcck_old_psw; /* 0x160 */
|
636 | bcec36ea | Alexander Graf | PSW io_old_psw; /* 0x170 */
|
637 | bcec36ea | Alexander Graf | uint8_t pad7[0x1a0-0x180]; /* 0x180 */ |
638 | bcec36ea | Alexander Graf | PSW restart_psw; /* 0x1a0 */
|
639 | bcec36ea | Alexander Graf | PSW external_new_psw; /* 0x1b0 */
|
640 | bcec36ea | Alexander Graf | PSW svc_new_psw; /* 0x1c0 */
|
641 | bcec36ea | Alexander Graf | PSW program_new_psw; /* 0x1d0 */
|
642 | bcec36ea | Alexander Graf | PSW mcck_new_psw; /* 0x1e0 */
|
643 | bcec36ea | Alexander Graf | PSW io_new_psw; /* 0x1f0 */
|
644 | bcec36ea | Alexander Graf | PSW return_psw; /* 0x200 */
|
645 | bcec36ea | Alexander Graf | uint8_t irb[64]; /* 0x210 */ |
646 | bcec36ea | Alexander Graf | uint64_t sync_enter_timer; /* 0x250 */
|
647 | bcec36ea | Alexander Graf | uint64_t async_enter_timer; /* 0x258 */
|
648 | bcec36ea | Alexander Graf | uint64_t exit_timer; /* 0x260 */
|
649 | bcec36ea | Alexander Graf | uint64_t last_update_timer; /* 0x268 */
|
650 | bcec36ea | Alexander Graf | uint64_t user_timer; /* 0x270 */
|
651 | bcec36ea | Alexander Graf | uint64_t system_timer; /* 0x278 */
|
652 | bcec36ea | Alexander Graf | uint64_t last_update_clock; /* 0x280 */
|
653 | bcec36ea | Alexander Graf | uint64_t steal_clock; /* 0x288 */
|
654 | bcec36ea | Alexander Graf | PSW return_mcck_psw; /* 0x290 */
|
655 | bcec36ea | Alexander Graf | uint8_t pad8[0xc00-0x2a0]; /* 0x2a0 */ |
656 | bcec36ea | Alexander Graf | /* System info area */
|
657 | bcec36ea | Alexander Graf | uint64_t save_area[16]; /* 0xc00 */ |
658 | bcec36ea | Alexander Graf | uint8_t pad9[0xd40-0xc80]; /* 0xc80 */ |
659 | bcec36ea | Alexander Graf | uint64_t kernel_stack; /* 0xd40 */
|
660 | bcec36ea | Alexander Graf | uint64_t thread_info; /* 0xd48 */
|
661 | bcec36ea | Alexander Graf | uint64_t async_stack; /* 0xd50 */
|
662 | bcec36ea | Alexander Graf | uint64_t kernel_asce; /* 0xd58 */
|
663 | bcec36ea | Alexander Graf | uint64_t user_asce; /* 0xd60 */
|
664 | bcec36ea | Alexander Graf | uint64_t panic_stack; /* 0xd68 */
|
665 | bcec36ea | Alexander Graf | uint64_t user_exec_asce; /* 0xd70 */
|
666 | bcec36ea | Alexander Graf | uint8_t pad10[0xdc0-0xd78]; /* 0xd78 */ |
667 | bcec36ea | Alexander Graf | |
668 | bcec36ea | Alexander Graf | /* SMP info area: defined by DJB */
|
669 | bcec36ea | Alexander Graf | uint64_t clock_comparator; /* 0xdc0 */
|
670 | bcec36ea | Alexander Graf | uint64_t ext_call_fast; /* 0xdc8 */
|
671 | bcec36ea | Alexander Graf | uint64_t percpu_offset; /* 0xdd0 */
|
672 | bcec36ea | Alexander Graf | uint64_t current_task; /* 0xdd8 */
|
673 | bcec36ea | Alexander Graf | uint32_t softirq_pending; /* 0xde0 */
|
674 | bcec36ea | Alexander Graf | uint32_t pad_0x0de4; /* 0xde4 */
|
675 | bcec36ea | Alexander Graf | uint64_t int_clock; /* 0xde8 */
|
676 | bcec36ea | Alexander Graf | uint8_t pad12[0xe00-0xdf0]; /* 0xdf0 */ |
677 | bcec36ea | Alexander Graf | |
678 | bcec36ea | Alexander Graf | /* 0xe00 is used as indicator for dump tools */
|
679 | bcec36ea | Alexander Graf | /* whether the kernel died with panic() or not */
|
680 | bcec36ea | Alexander Graf | uint32_t panic_magic; /* 0xe00 */
|
681 | bcec36ea | Alexander Graf | |
682 | bcec36ea | Alexander Graf | uint8_t pad13[0x11b8-0xe04]; /* 0xe04 */ |
683 | bcec36ea | Alexander Graf | |
684 | bcec36ea | Alexander Graf | /* 64 bit extparam used for pfault, diag 250 etc */
|
685 | bcec36ea | Alexander Graf | uint64_t ext_params2; /* 0x11B8 */
|
686 | bcec36ea | Alexander Graf | |
687 | bcec36ea | Alexander Graf | uint8_t pad14[0x1200-0x11C0]; /* 0x11C0 */ |
688 | bcec36ea | Alexander Graf | |
689 | bcec36ea | Alexander Graf | /* System info area */
|
690 | bcec36ea | Alexander Graf | |
691 | bcec36ea | Alexander Graf | uint64_t floating_pt_save_area[16]; /* 0x1200 */ |
692 | bcec36ea | Alexander Graf | uint64_t gpregs_save_area[16]; /* 0x1280 */ |
693 | bcec36ea | Alexander Graf | uint32_t st_status_fixed_logout[4]; /* 0x1300 */ |
694 | bcec36ea | Alexander Graf | uint8_t pad15[0x1318-0x1310]; /* 0x1310 */ |
695 | bcec36ea | Alexander Graf | uint32_t prefixreg_save_area; /* 0x1318 */
|
696 | bcec36ea | Alexander Graf | uint32_t fpt_creg_save_area; /* 0x131c */
|
697 | bcec36ea | Alexander Graf | uint8_t pad16[0x1324-0x1320]; /* 0x1320 */ |
698 | bcec36ea | Alexander Graf | uint32_t tod_progreg_save_area; /* 0x1324 */
|
699 | bcec36ea | Alexander Graf | uint32_t cpu_timer_save_area[2]; /* 0x1328 */ |
700 | bcec36ea | Alexander Graf | uint32_t clock_comp_save_area[2]; /* 0x1330 */ |
701 | bcec36ea | Alexander Graf | uint8_t pad17[0x1340-0x1338]; /* 0x1338 */ |
702 | bcec36ea | Alexander Graf | uint32_t access_regs_save_area[16]; /* 0x1340 */ |
703 | bcec36ea | Alexander Graf | uint64_t cregs_save_area[16]; /* 0x1380 */ |
704 | bcec36ea | Alexander Graf | |
705 | bcec36ea | Alexander Graf | /* align to the top of the prefix area */
|
706 | bcec36ea | Alexander Graf | |
707 | bcec36ea | Alexander Graf | uint8_t pad18[0x2000-0x1400]; /* 0x1400 */ |
708 | bcec36ea | Alexander Graf | } __attribute__((packed)) LowCore; |
709 | bcec36ea | Alexander Graf | |
710 | bcec36ea | Alexander Graf | /* STSI */
|
711 | bcec36ea | Alexander Graf | #define STSI_LEVEL_MASK 0x00000000f0000000ULL |
712 | bcec36ea | Alexander Graf | #define STSI_LEVEL_CURRENT 0x0000000000000000ULL |
713 | bcec36ea | Alexander Graf | #define STSI_LEVEL_1 0x0000000010000000ULL |
714 | bcec36ea | Alexander Graf | #define STSI_LEVEL_2 0x0000000020000000ULL |
715 | bcec36ea | Alexander Graf | #define STSI_LEVEL_3 0x0000000030000000ULL |
716 | bcec36ea | Alexander Graf | #define STSI_R0_RESERVED_MASK 0x000000000fffff00ULL |
717 | bcec36ea | Alexander Graf | #define STSI_R0_SEL1_MASK 0x00000000000000ffULL |
718 | bcec36ea | Alexander Graf | #define STSI_R1_RESERVED_MASK 0x00000000ffff0000ULL |
719 | bcec36ea | Alexander Graf | #define STSI_R1_SEL2_MASK 0x000000000000ffffULL |
720 | bcec36ea | Alexander Graf | |
721 | bcec36ea | Alexander Graf | /* Basic Machine Configuration */
|
722 | bcec36ea | Alexander Graf | struct sysib_111 {
|
723 | bcec36ea | Alexander Graf | uint32_t res1[8];
|
724 | bcec36ea | Alexander Graf | uint8_t manuf[16];
|
725 | bcec36ea | Alexander Graf | uint8_t type[4];
|
726 | bcec36ea | Alexander Graf | uint8_t res2[12];
|
727 | bcec36ea | Alexander Graf | uint8_t model[16];
|
728 | bcec36ea | Alexander Graf | uint8_t sequence[16];
|
729 | bcec36ea | Alexander Graf | uint8_t plant[4];
|
730 | bcec36ea | Alexander Graf | uint8_t res3[156];
|
731 | bcec36ea | Alexander Graf | }; |
732 | bcec36ea | Alexander Graf | |
733 | bcec36ea | Alexander Graf | /* Basic Machine CPU */
|
734 | bcec36ea | Alexander Graf | struct sysib_121 {
|
735 | bcec36ea | Alexander Graf | uint32_t res1[80];
|
736 | bcec36ea | Alexander Graf | uint8_t sequence[16];
|
737 | bcec36ea | Alexander Graf | uint8_t plant[4];
|
738 | bcec36ea | Alexander Graf | uint8_t res2[2];
|
739 | bcec36ea | Alexander Graf | uint16_t cpu_addr; |
740 | bcec36ea | Alexander Graf | uint8_t res3[152];
|
741 | bcec36ea | Alexander Graf | }; |
742 | bcec36ea | Alexander Graf | |
743 | bcec36ea | Alexander Graf | /* Basic Machine CPUs */
|
744 | bcec36ea | Alexander Graf | struct sysib_122 {
|
745 | bcec36ea | Alexander Graf | uint8_t res1[32];
|
746 | bcec36ea | Alexander Graf | uint32_t capability; |
747 | bcec36ea | Alexander Graf | uint16_t total_cpus; |
748 | bcec36ea | Alexander Graf | uint16_t active_cpus; |
749 | bcec36ea | Alexander Graf | uint16_t standby_cpus; |
750 | bcec36ea | Alexander Graf | uint16_t reserved_cpus; |
751 | bcec36ea | Alexander Graf | uint16_t adjustments[2026];
|
752 | bcec36ea | Alexander Graf | }; |
753 | bcec36ea | Alexander Graf | |
754 | bcec36ea | Alexander Graf | /* LPAR CPU */
|
755 | bcec36ea | Alexander Graf | struct sysib_221 {
|
756 | bcec36ea | Alexander Graf | uint32_t res1[80];
|
757 | bcec36ea | Alexander Graf | uint8_t sequence[16];
|
758 | bcec36ea | Alexander Graf | uint8_t plant[4];
|
759 | bcec36ea | Alexander Graf | uint16_t cpu_id; |
760 | bcec36ea | Alexander Graf | uint16_t cpu_addr; |
761 | bcec36ea | Alexander Graf | uint8_t res3[152];
|
762 | bcec36ea | Alexander Graf | }; |
763 | bcec36ea | Alexander Graf | |
764 | bcec36ea | Alexander Graf | /* LPAR CPUs */
|
765 | bcec36ea | Alexander Graf | struct sysib_222 {
|
766 | bcec36ea | Alexander Graf | uint32_t res1[32];
|
767 | bcec36ea | Alexander Graf | uint16_t lpar_num; |
768 | bcec36ea | Alexander Graf | uint8_t res2; |
769 | bcec36ea | Alexander Graf | uint8_t lcpuc; |
770 | bcec36ea | Alexander Graf | uint16_t total_cpus; |
771 | bcec36ea | Alexander Graf | uint16_t conf_cpus; |
772 | bcec36ea | Alexander Graf | uint16_t standby_cpus; |
773 | bcec36ea | Alexander Graf | uint16_t reserved_cpus; |
774 | bcec36ea | Alexander Graf | uint8_t name[8];
|
775 | bcec36ea | Alexander Graf | uint32_t caf; |
776 | bcec36ea | Alexander Graf | uint8_t res3[16];
|
777 | bcec36ea | Alexander Graf | uint16_t dedicated_cpus; |
778 | bcec36ea | Alexander Graf | uint16_t shared_cpus; |
779 | bcec36ea | Alexander Graf | uint8_t res4[180];
|
780 | bcec36ea | Alexander Graf | }; |
781 | bcec36ea | Alexander Graf | |
782 | bcec36ea | Alexander Graf | /* VM CPUs */
|
783 | bcec36ea | Alexander Graf | struct sysib_322 {
|
784 | bcec36ea | Alexander Graf | uint8_t res1[31];
|
785 | bcec36ea | Alexander Graf | uint8_t count; |
786 | bcec36ea | Alexander Graf | struct {
|
787 | bcec36ea | Alexander Graf | uint8_t res2[4];
|
788 | bcec36ea | Alexander Graf | uint16_t total_cpus; |
789 | bcec36ea | Alexander Graf | uint16_t conf_cpus; |
790 | bcec36ea | Alexander Graf | uint16_t standby_cpus; |
791 | bcec36ea | Alexander Graf | uint16_t reserved_cpus; |
792 | bcec36ea | Alexander Graf | uint8_t name[8];
|
793 | bcec36ea | Alexander Graf | uint32_t caf; |
794 | bcec36ea | Alexander Graf | uint8_t cpi[16];
|
795 | bcec36ea | Alexander Graf | uint8_t res3[24];
|
796 | bcec36ea | Alexander Graf | } vm[8];
|
797 | bcec36ea | Alexander Graf | uint8_t res4[3552];
|
798 | bcec36ea | Alexander Graf | }; |
799 | bcec36ea | Alexander Graf | |
800 | bcec36ea | Alexander Graf | /* MMU defines */
|
801 | bcec36ea | Alexander Graf | #define _ASCE_ORIGIN ~0xfffULL /* segment table origin */ |
802 | bcec36ea | Alexander Graf | #define _ASCE_SUBSPACE 0x200 /* subspace group control */ |
803 | bcec36ea | Alexander Graf | #define _ASCE_PRIVATE_SPACE 0x100 /* private space control */ |
804 | bcec36ea | Alexander Graf | #define _ASCE_ALT_EVENT 0x80 /* storage alteration event control */ |
805 | bcec36ea | Alexander Graf | #define _ASCE_SPACE_SWITCH 0x40 /* space switch event */ |
806 | bcec36ea | Alexander Graf | #define _ASCE_REAL_SPACE 0x20 /* real space control */ |
807 | bcec36ea | Alexander Graf | #define _ASCE_TYPE_MASK 0x0c /* asce table type mask */ |
808 | bcec36ea | Alexander Graf | #define _ASCE_TYPE_REGION1 0x0c /* region first table type */ |
809 | bcec36ea | Alexander Graf | #define _ASCE_TYPE_REGION2 0x08 /* region second table type */ |
810 | bcec36ea | Alexander Graf | #define _ASCE_TYPE_REGION3 0x04 /* region third table type */ |
811 | bcec36ea | Alexander Graf | #define _ASCE_TYPE_SEGMENT 0x00 /* segment table type */ |
812 | bcec36ea | Alexander Graf | #define _ASCE_TABLE_LENGTH 0x03 /* region table length */ |
813 | bcec36ea | Alexander Graf | |
814 | bcec36ea | Alexander Graf | #define _REGION_ENTRY_ORIGIN ~0xfffULL /* region/segment table origin */ |
815 | bcec36ea | Alexander Graf | #define _REGION_ENTRY_INV 0x20 /* invalid region table entry */ |
816 | bcec36ea | Alexander Graf | #define _REGION_ENTRY_TYPE_MASK 0x0c /* region/segment table type mask */ |
817 | bcec36ea | Alexander Graf | #define _REGION_ENTRY_TYPE_R1 0x0c /* region first table type */ |
818 | bcec36ea | Alexander Graf | #define _REGION_ENTRY_TYPE_R2 0x08 /* region second table type */ |
819 | bcec36ea | Alexander Graf | #define _REGION_ENTRY_TYPE_R3 0x04 /* region third table type */ |
820 | bcec36ea | Alexander Graf | #define _REGION_ENTRY_LENGTH 0x03 /* region third length */ |
821 | bcec36ea | Alexander Graf | |
822 | bcec36ea | Alexander Graf | #define _SEGMENT_ENTRY_ORIGIN ~0x7ffULL /* segment table origin */ |
823 | bcec36ea | Alexander Graf | #define _SEGMENT_ENTRY_RO 0x200 /* page protection bit */ |
824 | bcec36ea | Alexander Graf | #define _SEGMENT_ENTRY_INV 0x20 /* invalid segment table entry */ |
825 | bcec36ea | Alexander Graf | |
826 | bcec36ea | Alexander Graf | #define _PAGE_RO 0x200 /* HW read-only bit */ |
827 | bcec36ea | Alexander Graf | #define _PAGE_INVALID 0x400 /* HW invalid bit */ |
828 | bcec36ea | Alexander Graf | |
829 | bcec36ea | Alexander Graf | |
830 | bcec36ea | Alexander Graf | |
831 | bcec36ea | Alexander Graf | /* EBCDIC handling */
|
832 | bcec36ea | Alexander Graf | static const uint8_t ebcdic2ascii[] = { |
833 | bcec36ea | Alexander Graf | 0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F, |
834 | bcec36ea | Alexander Graf | 0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, |
835 | bcec36ea | Alexander Graf | 0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07, |
836 | bcec36ea | Alexander Graf | 0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, |
837 | bcec36ea | Alexander Graf | 0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B, |
838 | bcec36ea | Alexander Graf | 0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07, |
839 | bcec36ea | Alexander Graf | 0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04, |
840 | bcec36ea | Alexander Graf | 0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A, |
841 | bcec36ea | Alexander Graf | 0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86, |
842 | bcec36ea | Alexander Graf | 0x87, 0xA4, 0x5B, 0x2E, 0x3C, 0x28, 0x2B, 0x21, |
843 | bcec36ea | Alexander Graf | 0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07, |
844 | bcec36ea | Alexander Graf | 0x8D, 0xE1, 0x5D, 0x24, 0x2A, 0x29, 0x3B, 0x5E, |
845 | bcec36ea | Alexander Graf | 0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F, |
846 | bcec36ea | Alexander Graf | 0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F, |
847 | bcec36ea | Alexander Graf | 0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, |
848 | bcec36ea | Alexander Graf | 0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22, |
849 | bcec36ea | Alexander Graf | 0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, |
850 | bcec36ea | Alexander Graf | 0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1, |
851 | bcec36ea | Alexander Graf | 0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, |
852 | bcec36ea | Alexander Graf | 0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07, |
853 | bcec36ea | Alexander Graf | 0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, |
854 | bcec36ea | Alexander Graf | 0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07, |
855 | bcec36ea | Alexander Graf | 0x9B, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC, |
856 | bcec36ea | Alexander Graf | 0xAB, 0x07, 0xAA, 0x7C, 0x07, 0x07, 0x07, 0x07, |
857 | bcec36ea | Alexander Graf | 0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, |
858 | bcec36ea | Alexander Graf | 0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07, |
859 | bcec36ea | Alexander Graf | 0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, |
860 | bcec36ea | Alexander Graf | 0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98, |
861 | bcec36ea | Alexander Graf | 0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, |
862 | bcec36ea | Alexander Graf | 0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07, |
863 | bcec36ea | Alexander Graf | 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, |
864 | bcec36ea | Alexander Graf | 0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07, |
865 | bcec36ea | Alexander Graf | }; |
866 | bcec36ea | Alexander Graf | |
867 | bcec36ea | Alexander Graf | static const uint8_t ascii2ebcdic [] = { |
868 | bcec36ea | Alexander Graf | 0x00, 0x01, 0x02, 0x03, 0x37, 0x2D, 0x2E, 0x2F, |
869 | bcec36ea | Alexander Graf | 0x16, 0x05, 0x15, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, |
870 | bcec36ea | Alexander Graf | 0x10, 0x11, 0x12, 0x13, 0x3C, 0x3D, 0x32, 0x26, |
871 | bcec36ea | Alexander Graf | 0x18, 0x19, 0x3F, 0x27, 0x22, 0x1D, 0x1E, 0x1F, |
872 | bcec36ea | Alexander Graf | 0x40, 0x5A, 0x7F, 0x7B, 0x5B, 0x6C, 0x50, 0x7D, |
873 | bcec36ea | Alexander Graf | 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61, |
874 | bcec36ea | Alexander Graf | 0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, |
875 | bcec36ea | Alexander Graf | 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F, |
876 | bcec36ea | Alexander Graf | 0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, |
877 | bcec36ea | Alexander Graf | 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, |
878 | bcec36ea | Alexander Graf | 0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, |
879 | bcec36ea | Alexander Graf | 0xE7, 0xE8, 0xE9, 0xBA, 0xE0, 0xBB, 0xB0, 0x6D, |
880 | bcec36ea | Alexander Graf | 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, |
881 | bcec36ea | Alexander Graf | 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, |
882 | bcec36ea | Alexander Graf | 0x97, 0x98, 0x99, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, |
883 | bcec36ea | Alexander Graf | 0xA7, 0xA8, 0xA9, 0xC0, 0x4F, 0xD0, 0xA1, 0x07, |
884 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
885 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
886 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
887 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
888 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
889 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
890 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
891 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
892 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
893 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
894 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
895 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
896 | bcec36ea | Alexander Graf | 0x3F, 0x59, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
897 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
898 | bcec36ea | Alexander Graf | 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, 0x3F, |
899 | bcec36ea | Alexander Graf | 0x90, 0x3F, 0x3F, 0x3F, 0x3F, 0xEA, 0x3F, 0xFF |
900 | bcec36ea | Alexander Graf | }; |
901 | bcec36ea | Alexander Graf | |
902 | bcec36ea | Alexander Graf | static inline void ebcdic_put(uint8_t *p, const char *ascii, int len) |
903 | bcec36ea | Alexander Graf | { |
904 | bcec36ea | Alexander Graf | int i;
|
905 | bcec36ea | Alexander Graf | |
906 | bcec36ea | Alexander Graf | for (i = 0; i < len; i++) { |
907 | bcec36ea | Alexander Graf | p[i] = ascii2ebcdic[(int)ascii[i]];
|
908 | bcec36ea | Alexander Graf | } |
909 | bcec36ea | Alexander Graf | } |
910 | bcec36ea | Alexander Graf | |
911 | bcec36ea | Alexander Graf | #define SIGP_SENSE 0x01 |
912 | bcec36ea | Alexander Graf | #define SIGP_EXTERNAL_CALL 0x02 |
913 | bcec36ea | Alexander Graf | #define SIGP_EMERGENCY 0x03 |
914 | bcec36ea | Alexander Graf | #define SIGP_START 0x04 |
915 | bcec36ea | Alexander Graf | #define SIGP_STOP 0x05 |
916 | bcec36ea | Alexander Graf | #define SIGP_RESTART 0x06 |
917 | bcec36ea | Alexander Graf | #define SIGP_STOP_STORE_STATUS 0x09 |
918 | bcec36ea | Alexander Graf | #define SIGP_INITIAL_CPU_RESET 0x0b |
919 | bcec36ea | Alexander Graf | #define SIGP_CPU_RESET 0x0c |
920 | bcec36ea | Alexander Graf | #define SIGP_SET_PREFIX 0x0d |
921 | bcec36ea | Alexander Graf | #define SIGP_STORE_STATUS_ADDR 0x0e |
922 | bcec36ea | Alexander Graf | #define SIGP_SET_ARCH 0x12 |
923 | bcec36ea | Alexander Graf | |
924 | bcec36ea | Alexander Graf | /* cpu status bits */
|
925 | bcec36ea | Alexander Graf | #define SIGP_STAT_EQUIPMENT_CHECK 0x80000000UL |
926 | bcec36ea | Alexander Graf | #define SIGP_STAT_INCORRECT_STATE 0x00000200UL |
927 | bcec36ea | Alexander Graf | #define SIGP_STAT_INVALID_PARAMETER 0x00000100UL |
928 | bcec36ea | Alexander Graf | #define SIGP_STAT_EXT_CALL_PENDING 0x00000080UL |
929 | bcec36ea | Alexander Graf | #define SIGP_STAT_STOPPED 0x00000040UL |
930 | bcec36ea | Alexander Graf | #define SIGP_STAT_OPERATOR_INTERV 0x00000020UL |
931 | bcec36ea | Alexander Graf | #define SIGP_STAT_CHECK_STOP 0x00000010UL |
932 | bcec36ea | Alexander Graf | #define SIGP_STAT_INOPERATIVE 0x00000004UL |
933 | bcec36ea | Alexander Graf | #define SIGP_STAT_INVALID_ORDER 0x00000002UL |
934 | bcec36ea | Alexander Graf | #define SIGP_STAT_RECEIVER_CHECK 0x00000001UL |
935 | bcec36ea | Alexander Graf | |
936 | bcec36ea | Alexander Graf | void load_psw(CPUState *env, uint64_t mask, uint64_t addr);
|
937 | bcec36ea | Alexander Graf | int mmu_translate(CPUState *env, target_ulong vaddr, int rw, uint64_t asc, |
938 | bcec36ea | Alexander Graf | target_ulong *raddr, int *flags);
|
939 | bcec36ea | Alexander Graf | int sclp_service_call(CPUState *env, uint32_t sccb, uint64_t code);
|
940 | bcec36ea | Alexander Graf | uint32_t calc_cc(CPUState *env, uint32_t cc_op, uint64_t src, uint64_t dst, |
941 | bcec36ea | Alexander Graf | uint64_t vr); |
942 | bcec36ea | Alexander Graf | |
943 | bcec36ea | Alexander Graf | #define TARGET_HAS_ICE 1 |
944 | bcec36ea | Alexander Graf | |
945 | bcec36ea | Alexander Graf | /* The value of the TOD clock for 1.1.1970. */
|
946 | bcec36ea | Alexander Graf | #define TOD_UNIX_EPOCH 0x7d91048bca000000ULL |
947 | bcec36ea | Alexander Graf | |
948 | bcec36ea | Alexander Graf | /* Converts ns to s390's clock format */
|
949 | bcec36ea | Alexander Graf | static inline uint64_t time2tod(uint64_t ns) { |
950 | bcec36ea | Alexander Graf | return (ns << 9) / 125; |
951 | bcec36ea | Alexander Graf | } |
952 | bcec36ea | Alexander Graf | |
953 | bcec36ea | Alexander Graf | static inline void cpu_inject_ext(CPUState *env, uint32_t code, uint32_t param, |
954 | bcec36ea | Alexander Graf | uint64_t param64) |
955 | bcec36ea | Alexander Graf | { |
956 | bcec36ea | Alexander Graf | if (env->ext_index == MAX_EXT_QUEUE - 1) { |
957 | bcec36ea | Alexander Graf | /* ugh - can't queue anymore. Let's drop. */
|
958 | bcec36ea | Alexander Graf | return;
|
959 | bcec36ea | Alexander Graf | } |
960 | bcec36ea | Alexander Graf | |
961 | bcec36ea | Alexander Graf | env->ext_index++; |
962 | bcec36ea | Alexander Graf | assert(env->ext_index < MAX_EXT_QUEUE); |
963 | bcec36ea | Alexander Graf | |
964 | bcec36ea | Alexander Graf | env->ext_queue[env->ext_index].code = code; |
965 | bcec36ea | Alexander Graf | env->ext_queue[env->ext_index].param = param; |
966 | bcec36ea | Alexander Graf | env->ext_queue[env->ext_index].param64 = param64; |
967 | bcec36ea | Alexander Graf | |
968 | bcec36ea | Alexander Graf | env->pending_int |= INTERRUPT_EXT; |
969 | bcec36ea | Alexander Graf | cpu_interrupt(env, CPU_INTERRUPT_HARD); |
970 | bcec36ea | Alexander Graf | } |
971 | 10c339a0 | Alexander Graf | |
972 | 10ec5117 | Alexander Graf | #endif |