Statistics
| Branch: | Revision:

root / cpu-all.h @ 2c1794c4

History | View | Annotate | Download (6.8 kB)

1 5a9fdfec bellard
/*
2 5a9fdfec bellard
 * defines common to all virtual CPUs
3 5a9fdfec bellard
 * 
4 5a9fdfec bellard
 *  Copyright (c) 2003 Fabrice Bellard
5 5a9fdfec bellard
 *
6 5a9fdfec bellard
 * This library is free software; you can redistribute it and/or
7 5a9fdfec bellard
 * modify it under the terms of the GNU Lesser General Public
8 5a9fdfec bellard
 * License as published by the Free Software Foundation; either
9 5a9fdfec bellard
 * version 2 of the License, or (at your option) any later version.
10 5a9fdfec bellard
 *
11 5a9fdfec bellard
 * This library is distributed in the hope that it will be useful,
12 5a9fdfec bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 5a9fdfec bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 5a9fdfec bellard
 * Lesser General Public License for more details.
15 5a9fdfec bellard
 *
16 5a9fdfec bellard
 * You should have received a copy of the GNU Lesser General Public
17 5a9fdfec bellard
 * License along with this library; if not, write to the Free Software
18 5a9fdfec bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 5a9fdfec bellard
 */
20 5a9fdfec bellard
#ifndef CPU_ALL_H
21 5a9fdfec bellard
#define CPU_ALL_H
22 5a9fdfec bellard
23 5a9fdfec bellard
/* all CPU memory access use these macros */
24 5a9fdfec bellard
static inline int ldub(void *ptr)
25 5a9fdfec bellard
{
26 5a9fdfec bellard
    return *(uint8_t *)ptr;
27 5a9fdfec bellard
}
28 5a9fdfec bellard
29 5a9fdfec bellard
static inline int ldsb(void *ptr)
30 5a9fdfec bellard
{
31 5a9fdfec bellard
    return *(int8_t *)ptr;
32 5a9fdfec bellard
}
33 5a9fdfec bellard
34 5a9fdfec bellard
static inline void stb(void *ptr, int v)
35 5a9fdfec bellard
{
36 5a9fdfec bellard
    *(uint8_t *)ptr = v;
37 5a9fdfec bellard
}
38 5a9fdfec bellard
39 5a9fdfec bellard
/* NOTE: on arm, putting 2 in /proc/sys/debug/alignment so that the
40 5a9fdfec bellard
   kernel handles unaligned load/stores may give better results, but
41 5a9fdfec bellard
   it is a system wide setting : bad */
42 5a9fdfec bellard
#if defined(WORDS_BIGENDIAN) || defined(__arm__)
43 5a9fdfec bellard
44 5a9fdfec bellard
/* conservative code for little endian unaligned accesses */
45 5a9fdfec bellard
static inline int lduw(void *ptr)
46 5a9fdfec bellard
{
47 5a9fdfec bellard
#ifdef __powerpc__
48 5a9fdfec bellard
    int val;
49 5a9fdfec bellard
    __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr));
50 5a9fdfec bellard
    return val;
51 5a9fdfec bellard
#else
52 5a9fdfec bellard
    uint8_t *p = ptr;
53 5a9fdfec bellard
    return p[0] | (p[1] << 8);
54 5a9fdfec bellard
#endif
55 5a9fdfec bellard
}
56 5a9fdfec bellard
57 5a9fdfec bellard
static inline int ldsw(void *ptr)
58 5a9fdfec bellard
{
59 5a9fdfec bellard
#ifdef __powerpc__
60 5a9fdfec bellard
    int val;
61 5a9fdfec bellard
    __asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (ptr));
62 5a9fdfec bellard
    return (int16_t)val;
63 5a9fdfec bellard
#else
64 5a9fdfec bellard
    uint8_t *p = ptr;
65 5a9fdfec bellard
    return (int16_t)(p[0] | (p[1] << 8));
66 5a9fdfec bellard
#endif
67 5a9fdfec bellard
}
68 5a9fdfec bellard
69 5a9fdfec bellard
static inline int ldl(void *ptr)
70 5a9fdfec bellard
{
71 5a9fdfec bellard
#ifdef __powerpc__
72 5a9fdfec bellard
    int val;
73 5a9fdfec bellard
    __asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (ptr));
74 5a9fdfec bellard
    return val;
75 5a9fdfec bellard
#else
76 5a9fdfec bellard
    uint8_t *p = ptr;
77 5a9fdfec bellard
    return p[0] | (p[1] << 8) | (p[2] << 16) | (p[3] << 24);
78 5a9fdfec bellard
#endif
79 5a9fdfec bellard
}
80 5a9fdfec bellard
81 5a9fdfec bellard
static inline uint64_t ldq(void *ptr)
82 5a9fdfec bellard
{
83 5a9fdfec bellard
    uint8_t *p = ptr;
84 5a9fdfec bellard
    uint32_t v1, v2;
85 5a9fdfec bellard
    v1 = ldl(p);
86 5a9fdfec bellard
    v2 = ldl(p + 4);
87 5a9fdfec bellard
    return v1 | ((uint64_t)v2 << 32);
88 5a9fdfec bellard
}
89 5a9fdfec bellard
90 5a9fdfec bellard
static inline void stw(void *ptr, int v)
91 5a9fdfec bellard
{
92 5a9fdfec bellard
#ifdef __powerpc__
93 5a9fdfec bellard
    __asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*(uint16_t *)ptr) : "r" (v), "r" (ptr));
94 5a9fdfec bellard
#else
95 5a9fdfec bellard
    uint8_t *p = ptr;
96 5a9fdfec bellard
    p[0] = v;
97 5a9fdfec bellard
    p[1] = v >> 8;
98 5a9fdfec bellard
#endif
99 5a9fdfec bellard
}
100 5a9fdfec bellard
101 5a9fdfec bellard
static inline void stl(void *ptr, int v)
102 5a9fdfec bellard
{
103 5a9fdfec bellard
#ifdef __powerpc__
104 5a9fdfec bellard
    __asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*(uint32_t *)ptr) : "r" (v), "r" (ptr));
105 5a9fdfec bellard
#else
106 5a9fdfec bellard
    uint8_t *p = ptr;
107 5a9fdfec bellard
    p[0] = v;
108 5a9fdfec bellard
    p[1] = v >> 8;
109 5a9fdfec bellard
    p[2] = v >> 16;
110 5a9fdfec bellard
    p[3] = v >> 24;
111 5a9fdfec bellard
#endif
112 5a9fdfec bellard
}
113 5a9fdfec bellard
114 5a9fdfec bellard
static inline void stq(void *ptr, uint64_t v)
115 5a9fdfec bellard
{
116 5a9fdfec bellard
    uint8_t *p = ptr;
117 5a9fdfec bellard
    stl(p, (uint32_t)v);
118 5a9fdfec bellard
    stl(p + 4, v >> 32);
119 5a9fdfec bellard
}
120 5a9fdfec bellard
121 5a9fdfec bellard
/* float access */
122 5a9fdfec bellard
123 5a9fdfec bellard
static inline float ldfl(void *ptr)
124 5a9fdfec bellard
{
125 5a9fdfec bellard
    union {
126 5a9fdfec bellard
        float f;
127 5a9fdfec bellard
        uint32_t i;
128 5a9fdfec bellard
    } u;
129 5a9fdfec bellard
    u.i = ldl(ptr);
130 5a9fdfec bellard
    return u.f;
131 5a9fdfec bellard
}
132 5a9fdfec bellard
133 5a9fdfec bellard
static inline void stfl(void *ptr, float v)
134 5a9fdfec bellard
{
135 5a9fdfec bellard
    union {
136 5a9fdfec bellard
        float f;
137 5a9fdfec bellard
        uint32_t i;
138 5a9fdfec bellard
    } u;
139 5a9fdfec bellard
    u.f = v;
140 5a9fdfec bellard
    stl(ptr, u.i);
141 5a9fdfec bellard
}
142 5a9fdfec bellard
143 5a9fdfec bellard
#if defined(__arm__) && !defined(WORDS_BIGENDIAN)
144 5a9fdfec bellard
145 5a9fdfec bellard
/* NOTE: arm is horrible as double 32 bit words are stored in big endian ! */
146 5a9fdfec bellard
static inline double ldfq(void *ptr)
147 5a9fdfec bellard
{
148 5a9fdfec bellard
    union {
149 5a9fdfec bellard
        double d;
150 5a9fdfec bellard
        uint32_t tab[2];
151 5a9fdfec bellard
    } u;
152 5a9fdfec bellard
    u.tab[1] = ldl(ptr);
153 5a9fdfec bellard
    u.tab[0] = ldl(ptr + 4);
154 5a9fdfec bellard
    return u.d;
155 5a9fdfec bellard
}
156 5a9fdfec bellard
157 5a9fdfec bellard
static inline void stfq(void *ptr, double v)
158 5a9fdfec bellard
{
159 5a9fdfec bellard
    union {
160 5a9fdfec bellard
        double d;
161 5a9fdfec bellard
        uint32_t tab[2];
162 5a9fdfec bellard
    } u;
163 5a9fdfec bellard
    u.d = v;
164 5a9fdfec bellard
    stl(ptr, u.tab[1]);
165 5a9fdfec bellard
    stl(ptr + 4, u.tab[0]);
166 5a9fdfec bellard
}
167 5a9fdfec bellard
168 5a9fdfec bellard
#else
169 5a9fdfec bellard
static inline double ldfq(void *ptr)
170 5a9fdfec bellard
{
171 5a9fdfec bellard
    union {
172 5a9fdfec bellard
        double d;
173 5a9fdfec bellard
        uint64_t i;
174 5a9fdfec bellard
    } u;
175 5a9fdfec bellard
    u.i = ldq(ptr);
176 5a9fdfec bellard
    return u.d;
177 5a9fdfec bellard
}
178 5a9fdfec bellard
179 5a9fdfec bellard
static inline void stfq(void *ptr, double v)
180 5a9fdfec bellard
{
181 5a9fdfec bellard
    union {
182 5a9fdfec bellard
        double d;
183 5a9fdfec bellard
        uint64_t i;
184 5a9fdfec bellard
    } u;
185 5a9fdfec bellard
    u.d = v;
186 5a9fdfec bellard
    stq(ptr, u.i);
187 5a9fdfec bellard
}
188 5a9fdfec bellard
#endif
189 5a9fdfec bellard
190 5a9fdfec bellard
#else
191 5a9fdfec bellard
192 5a9fdfec bellard
static inline int lduw(void *ptr)
193 5a9fdfec bellard
{
194 5a9fdfec bellard
    return *(uint16_t *)ptr;
195 5a9fdfec bellard
}
196 5a9fdfec bellard
197 5a9fdfec bellard
static inline int ldsw(void *ptr)
198 5a9fdfec bellard
{
199 5a9fdfec bellard
    return *(int16_t *)ptr;
200 5a9fdfec bellard
}
201 5a9fdfec bellard
202 5a9fdfec bellard
static inline int ldl(void *ptr)
203 5a9fdfec bellard
{
204 5a9fdfec bellard
    return *(uint32_t *)ptr;
205 5a9fdfec bellard
}
206 5a9fdfec bellard
207 5a9fdfec bellard
static inline uint64_t ldq(void *ptr)
208 5a9fdfec bellard
{
209 5a9fdfec bellard
    return *(uint64_t *)ptr;
210 5a9fdfec bellard
}
211 5a9fdfec bellard
212 5a9fdfec bellard
static inline void stw(void *ptr, int v)
213 5a9fdfec bellard
{
214 5a9fdfec bellard
    *(uint16_t *)ptr = v;
215 5a9fdfec bellard
}
216 5a9fdfec bellard
217 5a9fdfec bellard
static inline void stl(void *ptr, int v)
218 5a9fdfec bellard
{
219 5a9fdfec bellard
    *(uint32_t *)ptr = v;
220 5a9fdfec bellard
}
221 5a9fdfec bellard
222 5a9fdfec bellard
static inline void stq(void *ptr, uint64_t v)
223 5a9fdfec bellard
{
224 5a9fdfec bellard
    *(uint64_t *)ptr = v;
225 5a9fdfec bellard
}
226 5a9fdfec bellard
227 5a9fdfec bellard
/* float access */
228 5a9fdfec bellard
229 5a9fdfec bellard
static inline float ldfl(void *ptr)
230 5a9fdfec bellard
{
231 5a9fdfec bellard
    return *(float *)ptr;
232 5a9fdfec bellard
}
233 5a9fdfec bellard
234 5a9fdfec bellard
static inline double ldfq(void *ptr)
235 5a9fdfec bellard
{
236 5a9fdfec bellard
    return *(double *)ptr;
237 5a9fdfec bellard
}
238 5a9fdfec bellard
239 5a9fdfec bellard
static inline void stfl(void *ptr, float v)
240 5a9fdfec bellard
{
241 5a9fdfec bellard
    *(float *)ptr = v;
242 5a9fdfec bellard
}
243 5a9fdfec bellard
244 5a9fdfec bellard
static inline void stfq(void *ptr, double v)
245 5a9fdfec bellard
{
246 5a9fdfec bellard
    *(double *)ptr = v;
247 5a9fdfec bellard
}
248 5a9fdfec bellard
#endif
249 5a9fdfec bellard
250 5a9fdfec bellard
/* page related stuff */
251 5a9fdfec bellard
252 5a9fdfec bellard
#define TARGET_PAGE_SIZE (1 << TARGET_PAGE_BITS)
253 5a9fdfec bellard
#define TARGET_PAGE_MASK ~(TARGET_PAGE_SIZE - 1)
254 5a9fdfec bellard
#define TARGET_PAGE_ALIGN(addr) (((addr) + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK)
255 5a9fdfec bellard
256 5a9fdfec bellard
extern unsigned long real_host_page_size;
257 5a9fdfec bellard
extern unsigned long host_page_bits;
258 5a9fdfec bellard
extern unsigned long host_page_size;
259 5a9fdfec bellard
extern unsigned long host_page_mask;
260 5a9fdfec bellard
261 5a9fdfec bellard
#define HOST_PAGE_ALIGN(addr) (((addr) + host_page_size - 1) & host_page_mask)
262 5a9fdfec bellard
263 5a9fdfec bellard
/* same as PROT_xxx */
264 5a9fdfec bellard
#define PAGE_READ      0x0001
265 5a9fdfec bellard
#define PAGE_WRITE     0x0002
266 5a9fdfec bellard
#define PAGE_EXEC      0x0004
267 5a9fdfec bellard
#define PAGE_BITS      (PAGE_READ | PAGE_WRITE | PAGE_EXEC)
268 5a9fdfec bellard
#define PAGE_VALID     0x0008
269 5a9fdfec bellard
/* original state of the write flag (used when tracking self-modifying
270 5a9fdfec bellard
   code */
271 5a9fdfec bellard
#define PAGE_WRITE_ORG 0x0010 
272 5a9fdfec bellard
273 5a9fdfec bellard
void page_dump(FILE *f);
274 5a9fdfec bellard
int page_get_flags(unsigned long address);
275 5a9fdfec bellard
void page_set_flags(unsigned long start, unsigned long end, int flags);
276 5a9fdfec bellard
void page_unprotect_range(uint8_t *data, unsigned long data_size);
277 5a9fdfec bellard
278 5a9fdfec bellard
#define SINGLE_CPU_DEFINES
279 5a9fdfec bellard
#ifdef SINGLE_CPU_DEFINES
280 5a9fdfec bellard
281 5a9fdfec bellard
#if defined(TARGET_I386)
282 5a9fdfec bellard
283 5a9fdfec bellard
#define CPUState CPUX86State
284 5a9fdfec bellard
#define cpu_init cpu_x86_init
285 5a9fdfec bellard
#define cpu_exec cpu_x86_exec
286 5a9fdfec bellard
#define cpu_gen_code cpu_x86_gen_code
287 5a9fdfec bellard
#define cpu_interrupt cpu_x86_interrupt
288 5a9fdfec bellard
#define cpu_signal_handler cpu_x86_signal_handler
289 5a9fdfec bellard
290 5a9fdfec bellard
#elif defined(TARGET_ARM)
291 5a9fdfec bellard
292 5a9fdfec bellard
#define CPUState CPUARMState
293 5a9fdfec bellard
#define cpu_init cpu_arm_init
294 5a9fdfec bellard
#define cpu_exec cpu_arm_exec
295 5a9fdfec bellard
#define cpu_gen_code cpu_arm_gen_code
296 5a9fdfec bellard
#define cpu_interrupt cpu_arm_interrupt
297 5a9fdfec bellard
#define cpu_signal_handler cpu_arm_signal_handler
298 5a9fdfec bellard
299 5a9fdfec bellard
#else
300 5a9fdfec bellard
301 5a9fdfec bellard
#error unsupported target CPU
302 5a9fdfec bellard
303 5a9fdfec bellard
#endif
304 5a9fdfec bellard
305 972ddf78 bellard
#endif /* SINGLE_CPU_DEFINES */
306 972ddf78 bellard
307 3b0dca51 bellard
#define DEFAULT_GDBSTUB_PORT 1234
308 3b0dca51 bellard
309 972ddf78 bellard
void cpu_abort(CPUState *env, const char *fmt, ...);
310 e2f22898 bellard
extern CPUState *cpu_single_env;
311 5a9fdfec bellard
312 68a79315 bellard
#define CPU_INTERRUPT_EXIT 0x01 /* wants exit from main loop */
313 68a79315 bellard
#define CPU_INTERRUPT_HARD 0x02 /* hardware interrupt pending */
314 4690764b bellard
void cpu_interrupt(CPUState *s, int mask);
315 68a79315 bellard
316 4c3a88a2 bellard
int cpu_breakpoint_insert(CPUState *env, uint32_t pc);
317 4c3a88a2 bellard
int cpu_breakpoint_remove(CPUState *env, uint32_t pc);
318 4c3a88a2 bellard
319 3b0dca51 bellard
/* gdb stub API */
320 3b0dca51 bellard
extern int gdbstub_fd;
321 3b0dca51 bellard
CPUState *cpu_gdbstub_get_env(void *opaque);
322 4c3a88a2 bellard
int cpu_gdbstub(void *opaque, int (*main_loop)(void *opaque), int port);
323 3b0dca51 bellard
324 5a9fdfec bellard
#endif /* CPU_ALL_H */