Statistics
| Branch: | Revision:

root / target-s390x / cpu.h @ bb4ea393

History | View | Annotate | Download (7.1 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 10ec5117 Alexander Graf
30 10ec5117 Alexander Graf
#include "softfloat.h"
31 10ec5117 Alexander Graf
32 10c339a0 Alexander Graf
#define NB_MMU_MODES 2
33 10ec5117 Alexander Graf
34 10ec5117 Alexander Graf
typedef union FPReg {
35 10ec5117 Alexander Graf
    struct {
36 10ec5117 Alexander Graf
#ifdef WORDS_BIGENDIAN
37 10ec5117 Alexander Graf
        float32 e;
38 10ec5117 Alexander Graf
        int32_t __pad;
39 10ec5117 Alexander Graf
#else
40 10ec5117 Alexander Graf
        int32_t __pad;
41 10ec5117 Alexander Graf
        float32 e;
42 10ec5117 Alexander Graf
#endif
43 10ec5117 Alexander Graf
    };
44 10ec5117 Alexander Graf
    float64 d;
45 10ec5117 Alexander Graf
    uint64_t i;
46 10ec5117 Alexander Graf
} FPReg;
47 10ec5117 Alexander Graf
48 10ec5117 Alexander Graf
typedef struct CPUS390XState {
49 10ec5117 Alexander Graf
    uint64_t regs[16];        /* GP registers */
50 10ec5117 Alexander Graf
51 10ec5117 Alexander Graf
    uint32_t aregs[16];        /* access registers */
52 10ec5117 Alexander Graf
53 10ec5117 Alexander Graf
    uint32_t fpc;        /* floating-point control register */
54 10ec5117 Alexander Graf
    FPReg fregs[16]; /* FP registers */
55 10ec5117 Alexander Graf
    float_status fpu_status; /* passed to softfloat lib */
56 10ec5117 Alexander Graf
57 10ec5117 Alexander Graf
    struct {
58 10ec5117 Alexander Graf
        uint64_t mask;
59 10ec5117 Alexander Graf
        uint64_t addr;
60 10ec5117 Alexander Graf
    } psw;
61 10ec5117 Alexander Graf
62 10ec5117 Alexander Graf
    int cc; /* condition code (0-3) */
63 10ec5117 Alexander Graf
64 10ec5117 Alexander Graf
    uint64_t __excp_addr;
65 10ec5117 Alexander Graf
66 10ec5117 Alexander Graf
    CPU_COMMON
67 10ec5117 Alexander Graf
} CPUS390XState;
68 10ec5117 Alexander Graf
69 10ec5117 Alexander Graf
#if defined(CONFIG_USER_ONLY)
70 10ec5117 Alexander Graf
static inline void cpu_clone_regs(CPUState *env, target_ulong newsp)
71 10ec5117 Alexander Graf
{
72 10ec5117 Alexander Graf
    if (newsp)
73 10ec5117 Alexander Graf
        env->regs[15] = newsp;
74 10ec5117 Alexander Graf
    env->regs[0] = 0;
75 10ec5117 Alexander Graf
}
76 10ec5117 Alexander Graf
#endif
77 10ec5117 Alexander Graf
78 10c339a0 Alexander Graf
#define MMU_MODE0_SUFFIX _kernel
79 10c339a0 Alexander Graf
#define MMU_MODE1_SUFFIX _user
80 10c339a0 Alexander Graf
#define MMU_USER_IDX 1
81 10c339a0 Alexander Graf
static inline int cpu_mmu_index (CPUState *env)
82 10c339a0 Alexander Graf
{
83 10c339a0 Alexander Graf
    /* XXX: Currently we don't implement virtual memory */
84 10c339a0 Alexander Graf
    return 0;
85 10c339a0 Alexander Graf
}
86 10c339a0 Alexander Graf
87 10ec5117 Alexander Graf
CPUS390XState *cpu_s390x_init(const char *cpu_model);
88 10ec5117 Alexander Graf
int cpu_s390x_exec(CPUS390XState *s);
89 10ec5117 Alexander Graf
void cpu_s390x_close(CPUS390XState *s);
90 10ec5117 Alexander Graf
91 10ec5117 Alexander Graf
/* you can call this signal handler from your SIGBUS and SIGSEGV
92 10ec5117 Alexander Graf
   signal handlers to inform the virtual CPU of exceptions. non zero
93 10ec5117 Alexander Graf
   is returned if the signal was handled by the virtual CPU.  */
94 10ec5117 Alexander Graf
int cpu_s390x_signal_handler(int host_signum, void *pinfo,
95 10ec5117 Alexander Graf
                           void *puc);
96 10ec5117 Alexander Graf
int cpu_s390x_handle_mmu_fault (CPUS390XState *env, target_ulong address, int rw,
97 10ec5117 Alexander Graf
                              int mmu_idx, int is_softmuu);
98 10ec5117 Alexander Graf
#define cpu_handle_mmu_fault cpu_s390x_handle_mmu_fault
99 10ec5117 Alexander Graf
100 10ec5117 Alexander Graf
#define TARGET_PAGE_BITS 12
101 10ec5117 Alexander Graf
102 52705890 Richard Henderson
/* ??? This is certainly wrong for 64-bit s390x, but given that only KVM
103 52705890 Richard Henderson
   emulation actually works, this is good enough for a placeholder.  */
104 52705890 Richard Henderson
#define TARGET_PHYS_ADDR_SPACE_BITS 32
105 52705890 Richard Henderson
#define TARGET_VIRT_ADDR_SPACE_BITS 32
106 52705890 Richard Henderson
107 10c339a0 Alexander Graf
#ifndef CONFIG_USER_ONLY
108 64b85a8f Blue Swirl
int s390_virtio_hypercall(CPUState *env);
109 64b85a8f Blue Swirl
void kvm_s390_virtio_irq(CPUState *env, int config_change, uint64_t token);
110 64b85a8f Blue Swirl
CPUState *s390_cpu_addr2state(uint16_t cpu_addr);
111 10c339a0 Alexander Graf
#endif
112 10c339a0 Alexander Graf
113 10c339a0 Alexander Graf
114 10ec5117 Alexander Graf
#define cpu_init cpu_s390x_init
115 10ec5117 Alexander Graf
#define cpu_exec cpu_s390x_exec
116 10ec5117 Alexander Graf
#define cpu_gen_code cpu_s390x_gen_code
117 10ec5117 Alexander Graf
118 10ec5117 Alexander Graf
#include "cpu-all.h"
119 10ec5117 Alexander Graf
120 10ec5117 Alexander Graf
#define EXCP_OPEX 1 /* operation exception (sigill) */
121 10ec5117 Alexander Graf
#define EXCP_SVC 2 /* supervisor call (syscall) */
122 10ec5117 Alexander Graf
#define EXCP_ADDR 5 /* addressing exception */
123 10ec5117 Alexander Graf
#define EXCP_EXECUTE_SVC 0xff00000 /* supervisor call via execute insn */
124 10ec5117 Alexander Graf
125 10ec5117 Alexander Graf
static inline void cpu_get_tb_cpu_state(CPUState* env, target_ulong *pc,
126 10ec5117 Alexander Graf
                                        target_ulong *cs_base, int *flags)
127 10ec5117 Alexander Graf
{
128 10ec5117 Alexander Graf
    *pc = env->psw.addr;
129 10ec5117 Alexander Graf
    /* XXX this is correct for user-mode emulation, but needs
130 10ec5117 Alexander Graf
     *     the asce register information as well when softmmu
131 10ec5117 Alexander Graf
     *     is implemented in the future */
132 10ec5117 Alexander Graf
    *cs_base = 0;
133 10ec5117 Alexander Graf
    *flags = env->psw.mask;
134 10ec5117 Alexander Graf
}
135 10c339a0 Alexander Graf
136 10c339a0 Alexander Graf
/* Program Status Word.  */
137 10c339a0 Alexander Graf
#define S390_PSWM_REGNUM 0
138 10c339a0 Alexander Graf
#define S390_PSWA_REGNUM 1
139 10c339a0 Alexander Graf
/* General Purpose Registers.  */
140 10c339a0 Alexander Graf
#define S390_R0_REGNUM 2
141 10c339a0 Alexander Graf
#define S390_R1_REGNUM 3
142 10c339a0 Alexander Graf
#define S390_R2_REGNUM 4
143 10c339a0 Alexander Graf
#define S390_R3_REGNUM 5
144 10c339a0 Alexander Graf
#define S390_R4_REGNUM 6
145 10c339a0 Alexander Graf
#define S390_R5_REGNUM 7
146 10c339a0 Alexander Graf
#define S390_R6_REGNUM 8
147 10c339a0 Alexander Graf
#define S390_R7_REGNUM 9
148 10c339a0 Alexander Graf
#define S390_R8_REGNUM 10
149 10c339a0 Alexander Graf
#define S390_R9_REGNUM 11
150 10c339a0 Alexander Graf
#define S390_R10_REGNUM 12
151 10c339a0 Alexander Graf
#define S390_R11_REGNUM 13
152 10c339a0 Alexander Graf
#define S390_R12_REGNUM 14
153 10c339a0 Alexander Graf
#define S390_R13_REGNUM 15
154 10c339a0 Alexander Graf
#define S390_R14_REGNUM 16
155 10c339a0 Alexander Graf
#define S390_R15_REGNUM 17
156 10c339a0 Alexander Graf
/* Access Registers.  */
157 10c339a0 Alexander Graf
#define S390_A0_REGNUM 18
158 10c339a0 Alexander Graf
#define S390_A1_REGNUM 19
159 10c339a0 Alexander Graf
#define S390_A2_REGNUM 20
160 10c339a0 Alexander Graf
#define S390_A3_REGNUM 21
161 10c339a0 Alexander Graf
#define S390_A4_REGNUM 22
162 10c339a0 Alexander Graf
#define S390_A5_REGNUM 23
163 10c339a0 Alexander Graf
#define S390_A6_REGNUM 24
164 10c339a0 Alexander Graf
#define S390_A7_REGNUM 25
165 10c339a0 Alexander Graf
#define S390_A8_REGNUM 26
166 10c339a0 Alexander Graf
#define S390_A9_REGNUM 27
167 10c339a0 Alexander Graf
#define S390_A10_REGNUM 28
168 10c339a0 Alexander Graf
#define S390_A11_REGNUM 29
169 10c339a0 Alexander Graf
#define S390_A12_REGNUM 30
170 10c339a0 Alexander Graf
#define S390_A13_REGNUM 31
171 10c339a0 Alexander Graf
#define S390_A14_REGNUM 32
172 10c339a0 Alexander Graf
#define S390_A15_REGNUM 33
173 10c339a0 Alexander Graf
/* Floating Point Control Word.  */
174 10c339a0 Alexander Graf
#define S390_FPC_REGNUM 34
175 10c339a0 Alexander Graf
/* Floating Point Registers.  */
176 10c339a0 Alexander Graf
#define S390_F0_REGNUM 35
177 10c339a0 Alexander Graf
#define S390_F1_REGNUM 36
178 10c339a0 Alexander Graf
#define S390_F2_REGNUM 37
179 10c339a0 Alexander Graf
#define S390_F3_REGNUM 38
180 10c339a0 Alexander Graf
#define S390_F4_REGNUM 39
181 10c339a0 Alexander Graf
#define S390_F5_REGNUM 40
182 10c339a0 Alexander Graf
#define S390_F6_REGNUM 41
183 10c339a0 Alexander Graf
#define S390_F7_REGNUM 42
184 10c339a0 Alexander Graf
#define S390_F8_REGNUM 43
185 10c339a0 Alexander Graf
#define S390_F9_REGNUM 44
186 10c339a0 Alexander Graf
#define S390_F10_REGNUM 45
187 10c339a0 Alexander Graf
#define S390_F11_REGNUM 46
188 10c339a0 Alexander Graf
#define S390_F12_REGNUM 47
189 10c339a0 Alexander Graf
#define S390_F13_REGNUM 48
190 10c339a0 Alexander Graf
#define S390_F14_REGNUM 49
191 10c339a0 Alexander Graf
#define S390_F15_REGNUM 50
192 10c339a0 Alexander Graf
/* Total.  */
193 10c339a0 Alexander Graf
#define S390_NUM_REGS 51
194 10c339a0 Alexander Graf
195 10c339a0 Alexander Graf
/* Pseudo registers -- PC and condition code.  */
196 10c339a0 Alexander Graf
#define S390_PC_REGNUM S390_NUM_REGS
197 10c339a0 Alexander Graf
#define S390_CC_REGNUM (S390_NUM_REGS+1)
198 10c339a0 Alexander Graf
#define S390_NUM_PSEUDO_REGS 2
199 10c339a0 Alexander Graf
#define S390_NUM_TOTAL_REGS (S390_NUM_REGS+2)
200 10c339a0 Alexander Graf
201 10c339a0 Alexander Graf
202 10c339a0 Alexander Graf
203 10c339a0 Alexander Graf
/* Program Status Word.  */
204 10c339a0 Alexander Graf
#define S390_PSWM_REGNUM 0
205 10c339a0 Alexander Graf
#define S390_PSWA_REGNUM 1
206 10c339a0 Alexander Graf
/* General Purpose Registers.  */
207 10c339a0 Alexander Graf
#define S390_R0_REGNUM 2
208 10c339a0 Alexander Graf
#define S390_R1_REGNUM 3
209 10c339a0 Alexander Graf
#define S390_R2_REGNUM 4
210 10c339a0 Alexander Graf
#define S390_R3_REGNUM 5
211 10c339a0 Alexander Graf
#define S390_R4_REGNUM 6
212 10c339a0 Alexander Graf
#define S390_R5_REGNUM 7
213 10c339a0 Alexander Graf
#define S390_R6_REGNUM 8
214 10c339a0 Alexander Graf
#define S390_R7_REGNUM 9
215 10c339a0 Alexander Graf
#define S390_R8_REGNUM 10
216 10c339a0 Alexander Graf
#define S390_R9_REGNUM 11
217 10c339a0 Alexander Graf
#define S390_R10_REGNUM 12
218 10c339a0 Alexander Graf
#define S390_R11_REGNUM 13
219 10c339a0 Alexander Graf
#define S390_R12_REGNUM 14
220 10c339a0 Alexander Graf
#define S390_R13_REGNUM 15
221 10c339a0 Alexander Graf
#define S390_R14_REGNUM 16
222 10c339a0 Alexander Graf
#define S390_R15_REGNUM 17
223 10c339a0 Alexander Graf
/* Access Registers.  */
224 10c339a0 Alexander Graf
#define S390_A0_REGNUM 18
225 10c339a0 Alexander Graf
#define S390_A1_REGNUM 19
226 10c339a0 Alexander Graf
#define S390_A2_REGNUM 20
227 10c339a0 Alexander Graf
#define S390_A3_REGNUM 21
228 10c339a0 Alexander Graf
#define S390_A4_REGNUM 22
229 10c339a0 Alexander Graf
#define S390_A5_REGNUM 23
230 10c339a0 Alexander Graf
#define S390_A6_REGNUM 24
231 10c339a0 Alexander Graf
#define S390_A7_REGNUM 25
232 10c339a0 Alexander Graf
#define S390_A8_REGNUM 26
233 10c339a0 Alexander Graf
#define S390_A9_REGNUM 27
234 10c339a0 Alexander Graf
#define S390_A10_REGNUM 28
235 10c339a0 Alexander Graf
#define S390_A11_REGNUM 29
236 10c339a0 Alexander Graf
#define S390_A12_REGNUM 30
237 10c339a0 Alexander Graf
#define S390_A13_REGNUM 31
238 10c339a0 Alexander Graf
#define S390_A14_REGNUM 32
239 10c339a0 Alexander Graf
#define S390_A15_REGNUM 33
240 10c339a0 Alexander Graf
/* Floating Point Control Word.  */
241 10c339a0 Alexander Graf
#define S390_FPC_REGNUM 34
242 10c339a0 Alexander Graf
/* Floating Point Registers.  */
243 10c339a0 Alexander Graf
#define S390_F0_REGNUM 35
244 10c339a0 Alexander Graf
#define S390_F1_REGNUM 36
245 10c339a0 Alexander Graf
#define S390_F2_REGNUM 37
246 10c339a0 Alexander Graf
#define S390_F3_REGNUM 38
247 10c339a0 Alexander Graf
#define S390_F4_REGNUM 39
248 10c339a0 Alexander Graf
#define S390_F5_REGNUM 40
249 10c339a0 Alexander Graf
#define S390_F6_REGNUM 41
250 10c339a0 Alexander Graf
#define S390_F7_REGNUM 42
251 10c339a0 Alexander Graf
#define S390_F8_REGNUM 43
252 10c339a0 Alexander Graf
#define S390_F9_REGNUM 44
253 10c339a0 Alexander Graf
#define S390_F10_REGNUM 45
254 10c339a0 Alexander Graf
#define S390_F11_REGNUM 46
255 10c339a0 Alexander Graf
#define S390_F12_REGNUM 47
256 10c339a0 Alexander Graf
#define S390_F13_REGNUM 48
257 10c339a0 Alexander Graf
#define S390_F14_REGNUM 49
258 10c339a0 Alexander Graf
#define S390_F15_REGNUM 50
259 10c339a0 Alexander Graf
/* Total.  */
260 10c339a0 Alexander Graf
#define S390_NUM_REGS 51
261 10c339a0 Alexander Graf
262 10c339a0 Alexander Graf
/* Pseudo registers -- PC and condition code.  */
263 10c339a0 Alexander Graf
#define S390_PC_REGNUM S390_NUM_REGS
264 10c339a0 Alexander Graf
#define S390_CC_REGNUM (S390_NUM_REGS+1)
265 10c339a0 Alexander Graf
#define S390_NUM_PSEUDO_REGS 2
266 10c339a0 Alexander Graf
#define S390_NUM_TOTAL_REGS (S390_NUM_REGS+2)
267 10c339a0 Alexander Graf
268 10c339a0 Alexander Graf
269 10ec5117 Alexander Graf
#endif