Statistics
| Branch: | Revision:

root / target-s390x / cpu.h @ d8bcbabf

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