Commit bfed01fc79cb2da1c6ca700bb0ce9238ce2974c7
1 parent
08ab123c
Clean up of some target specifics in exec.c/cpu-exec.c.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2936 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
12 changed files
with
92 additions
and
92 deletions
cpu-exec.c
... | ... | @@ -40,14 +40,14 @@ int tb_invalidated_flag; |
40 | 40 | //#define DEBUG_EXEC |
41 | 41 | //#define DEBUG_SIGNAL |
42 | 42 | |
43 | -#if defined(TARGET_ARM) || defined(TARGET_SPARC) || defined(TARGET_M68K) || \ | |
44 | - defined(TARGET_ALPHA) | |
45 | -/* XXX: unify with i386 target */ | |
46 | 43 | void cpu_loop_exit(void) |
47 | 44 | { |
45 | + /* NOTE: the register at this point must be saved by hand because | |
46 | + longjmp restore them */ | |
47 | + regs_to_env(); | |
48 | 48 | longjmp(env->jmp_env, 1); |
49 | 49 | } |
50 | -#endif | |
50 | + | |
51 | 51 | #if !(defined(TARGET_SPARC) || defined(TARGET_SH4) || defined(TARGET_M68K)) |
52 | 52 | #define reg_T2 |
53 | 53 | #endif |
... | ... | @@ -249,65 +249,8 @@ int cpu_exec(CPUState *env1) |
249 | 249 | TranslationBlock *tb; |
250 | 250 | uint8_t *tc_ptr; |
251 | 251 | |
252 | -#if defined(TARGET_I386) | |
253 | - /* handle exit of HALTED state */ | |
254 | - if (env1->hflags & HF_HALTED_MASK) { | |
255 | - /* disable halt condition */ | |
256 | - if ((env1->interrupt_request & CPU_INTERRUPT_HARD) && | |
257 | - (env1->eflags & IF_MASK)) { | |
258 | - env1->hflags &= ~HF_HALTED_MASK; | |
259 | - } else { | |
260 | - return EXCP_HALTED; | |
261 | - } | |
262 | - } | |
263 | -#elif defined(TARGET_PPC) | |
264 | - if (env1->halted) { | |
265 | - if (env1->msr[MSR_EE] && | |
266 | - (env1->interrupt_request & CPU_INTERRUPT_HARD)) { | |
267 | - env1->halted = 0; | |
268 | - } else { | |
269 | - return EXCP_HALTED; | |
270 | - } | |
271 | - } | |
272 | -#elif defined(TARGET_SPARC) | |
273 | - if (env1->halted) { | |
274 | - if ((env1->interrupt_request & CPU_INTERRUPT_HARD) && | |
275 | - (env1->psret != 0)) { | |
276 | - env1->halted = 0; | |
277 | - } else { | |
278 | - return EXCP_HALTED; | |
279 | - } | |
280 | - } | |
281 | -#elif defined(TARGET_ARM) | |
282 | - if (env1->halted) { | |
283 | - /* An interrupt wakes the CPU even if the I and F CPSR bits are | |
284 | - set. We use EXITTB to silently wake CPU without causing an | |
285 | - actual interrupt. */ | |
286 | - if (env1->interrupt_request & | |
287 | - (CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD | CPU_INTERRUPT_EXITTB)) { | |
288 | - env1->halted = 0; | |
289 | - } else { | |
290 | - return EXCP_HALTED; | |
291 | - } | |
292 | - } | |
293 | -#elif defined(TARGET_MIPS) | |
294 | - if (env1->halted) { | |
295 | - if (env1->interrupt_request & | |
296 | - (CPU_INTERRUPT_HARD | CPU_INTERRUPT_TIMER)) { | |
297 | - env1->halted = 0; | |
298 | - } else { | |
299 | - return EXCP_HALTED; | |
300 | - } | |
301 | - } | |
302 | -#elif defined(TARGET_ALPHA) || defined(TARGET_M68K) | |
303 | - if (env1->halted) { | |
304 | - if (env1->interrupt_request & CPU_INTERRUPT_HARD) { | |
305 | - env1->halted = 0; | |
306 | - } else { | |
307 | - return EXCP_HALTED; | |
308 | - } | |
309 | - } | |
310 | -#endif | |
252 | + if (cpu_halted(env1) == EXCP_HALTED) | |
253 | + return EXCP_HALTED; | |
311 | 254 | |
312 | 255 | cpu_single_env = env1; |
313 | 256 | ... | ... |
target-alpha/exec.h
... | ... | @@ -79,4 +79,14 @@ int cpu_alpha_mtpr (CPUState *env, int iprn, uint64_t val, uint64_t *oldvalp); |
79 | 79 | |
80 | 80 | void do_interrupt (CPUState *env); |
81 | 81 | |
82 | +static inline int cpu_halted(CPUState *env) { | |
83 | + if (!env->halted) | |
84 | + return 0; | |
85 | + if (env->interrupt_request & CPU_INTERRUPT_HARD) { | |
86 | + env->halted = 0; | |
87 | + return 0; | |
88 | + } | |
89 | + return EXCP_HALTED; | |
90 | +} | |
91 | + | |
82 | 92 | #endif /* !defined (__ALPHA_EXEC_H__) */ | ... | ... |
target-arm/exec.h
... | ... | @@ -48,6 +48,20 @@ static inline void regs_to_env(void) |
48 | 48 | int cpu_arm_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
49 | 49 | int is_user, int is_softmmu); |
50 | 50 | |
51 | +static inline int cpu_halted(CPUState *env) { | |
52 | + if (!env->halted) | |
53 | + return 0; | |
54 | + /* An interrupt wakes the CPU even if the I and F CPSR bits are | |
55 | + set. We use EXITTB to silently wake CPU without causing an | |
56 | + actual interrupt. */ | |
57 | + if (env->interrupt_request & | |
58 | + (CPU_INTERRUPT_FIQ | CPU_INTERRUPT_HARD | CPU_INTERRUPT_EXITTB)) { | |
59 | + env->halted = 0; | |
60 | + return 0; | |
61 | + } | |
62 | + return EXCP_HALTED; | |
63 | +} | |
64 | + | |
51 | 65 | #if !defined(CONFIG_USER_ONLY) |
52 | 66 | #include "softmmu_exec.h" |
53 | 67 | #endif | ... | ... |
target-i386/exec.h
... | ... | @@ -575,3 +575,16 @@ static inline void regs_to_env(void) |
575 | 575 | env->regs[R_EDI] = EDI; |
576 | 576 | #endif |
577 | 577 | } |
578 | + | |
579 | +static inline int cpu_halted(CPUState *env) { | |
580 | + /* handle exit of HALTED state */ | |
581 | + if (env->hflags & HF_HALTED_MASK) | |
582 | + return 0; | |
583 | + /* disable halt condition */ | |
584 | + if ((env->interrupt_request & CPU_INTERRUPT_HARD) && | |
585 | + (env->eflags & IF_MASK)) { | |
586 | + env->hflags &= ~HF_HALTED_MASK; | |
587 | + return 0; | |
588 | + } | |
589 | + return EXCP_HALTED; | |
590 | +} | ... | ... |
target-i386/helper.c
... | ... | @@ -106,14 +106,6 @@ void cpu_unlock(void) |
106 | 106 | spin_unlock(&global_cpu_lock); |
107 | 107 | } |
108 | 108 | |
109 | -void cpu_loop_exit(void) | |
110 | -{ | |
111 | - /* NOTE: the register at this point must be saved by hand because | |
112 | - longjmp restore them */ | |
113 | - regs_to_env(); | |
114 | - longjmp(env->jmp_env, 1); | |
115 | -} | |
116 | - | |
117 | 109 | /* return non zero if error */ |
118 | 110 | static inline int load_segment(uint32_t *e1_ptr, uint32_t *e2_ptr, |
119 | 111 | int selector) | ... | ... |
target-m68k/exec.h
... | ... | @@ -49,3 +49,13 @@ float64 helper_sub_cmpf64(CPUM68KState *env, float64 src0, float64 src1); |
49 | 49 | void helper_movec(CPUM68KState *env, int reg, uint32_t val); |
50 | 50 | |
51 | 51 | void cpu_loop_exit(void); |
52 | + | |
53 | +static inline int cpu_halted(CPUState *env) { | |
54 | + if (!env->halted) | |
55 | + return 0; | |
56 | + if (env->interrupt_request & CPU_INTERRUPT_HARD) { | |
57 | + env->halted = 0; | |
58 | + return 0; | |
59 | + } | |
60 | + return EXCP_HALTED; | |
61 | +} | ... | ... |
target-mips/exec.h
... | ... | @@ -56,14 +56,6 @@ register target_ulong T2 asm(AREG3); |
56 | 56 | #include "softmmu_exec.h" |
57 | 57 | #endif /* !defined(CONFIG_USER_ONLY) */ |
58 | 58 | |
59 | -static inline void env_to_regs(void) | |
60 | -{ | |
61 | -} | |
62 | - | |
63 | -static inline void regs_to_env(void) | |
64 | -{ | |
65 | -} | |
66 | - | |
67 | 59 | #ifdef TARGET_MIPS64 |
68 | 60 | #if TARGET_LONG_BITS > HOST_LONG_BITS |
69 | 61 | void do_dsll (void); |
... | ... | @@ -240,4 +232,23 @@ FOP_PROTO(le) |
240 | 232 | FOP_PROTO(ngt) |
241 | 233 | #undef FOP_PROTO |
242 | 234 | |
235 | +static inline void env_to_regs(void) | |
236 | +{ | |
237 | +} | |
238 | + | |
239 | +static inline void regs_to_env(void) | |
240 | +{ | |
241 | +} | |
242 | + | |
243 | +static inline int cpu_halted(CPUState *env) { | |
244 | + if (!env->halted) | |
245 | + return 0; | |
246 | + if (env->interrupt_request & | |
247 | + (CPU_INTERRUPT_HARD | CPU_INTERRUPT_TIMER)) { | |
248 | + env->halted = 0; | |
249 | + return 0; | |
250 | + } | |
251 | + return EXCP_HALTED; | |
252 | +} | |
253 | + | |
243 | 254 | #endif /* !defined(__QEMU_MIPS_EXEC_H__) */ | ... | ... |
target-mips/op_helper.c
... | ... | @@ -24,10 +24,6 @@ |
24 | 24 | |
25 | 25 | /*****************************************************************************/ |
26 | 26 | /* Exceptions processing helpers */ |
27 | -void cpu_loop_exit(void) | |
28 | -{ | |
29 | - longjmp(env->jmp_env, 1); | |
30 | -} | |
31 | 27 | |
32 | 28 | void do_raise_exception_err (uint32_t exception, int error_code) |
33 | 29 | { | ... | ... |
target-ppc/exec.h
... | ... | @@ -122,4 +122,14 @@ static inline void regs_to_env(void) |
122 | 122 | int cpu_ppc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
123 | 123 | int is_user, int is_softmmu); |
124 | 124 | |
125 | +static inline int cpu_halted(CPUState *env) { | |
126 | + if (!env->halted) | |
127 | + return 0; | |
128 | + if (env->msr[MSR_EE] && (env->interrupt_request & CPU_INTERRUPT_HARD)) { | |
129 | + env->halted = 0; | |
130 | + return 0; | |
131 | + } | |
132 | + return EXCP_HALTED; | |
133 | +} | |
134 | + | |
125 | 135 | #endif /* !defined (__PPC_H__) */ | ... | ... |
target-ppc/op_helper.c
... | ... | @@ -40,10 +40,6 @@ |
40 | 40 | |
41 | 41 | /*****************************************************************************/ |
42 | 42 | /* Exceptions processing helpers */ |
43 | -void cpu_loop_exit (void) | |
44 | -{ | |
45 | - longjmp(env->jmp_env, 1); | |
46 | -} | |
47 | 43 | |
48 | 44 | void do_raise_exception_err (uint32_t exception, int error_code) |
49 | 45 | { | ... | ... |
target-sh4/op_helper.c
target-sparc/exec.h
... | ... | @@ -115,4 +115,14 @@ static inline void regs_to_env(void) |
115 | 115 | int cpu_sparc_handle_mmu_fault(CPUState *env, target_ulong address, int rw, |
116 | 116 | int is_user, int is_softmmu); |
117 | 117 | |
118 | +static inline int cpu_halted(CPUState *env) { | |
119 | + if (!env->halted) | |
120 | + return 0; | |
121 | + if ((env->interrupt_request & CPU_INTERRUPT_HARD) && (env->psret != 0)) { | |
122 | + env->halted = 0; | |
123 | + return 0; | |
124 | + } | |
125 | + return EXCP_HALTED; | |
126 | +} | |
127 | + | |
118 | 128 | #endif | ... | ... |