1 #if !defined(__QEMU_MIPS_EXEC_H__)
2 #define __QEMU_MIPS_EXEC_H__
8 #include "dyngen-exec.h"
11 register struct CPUMIPSState
*env
asm(AREG0
);
16 #if !defined(CONFIG_USER_ONLY)
17 #include "softmmu_exec.h"
18 #endif /* !defined(CONFIG_USER_ONLY) */
20 void dump_fpu(CPUState
*env
);
21 void fpu_dump_state(CPUState
*env
, FILE *f
,
22 int (*fpu_fprintf
)(FILE *f
, const char *fmt
, ...),
25 void cpu_mips_clock_init (CPUState
*env
);
26 void cpu_mips_tlb_flush (CPUState
*env
, int flush_global
);
28 static inline void env_to_regs(void)
32 static inline void regs_to_env(void)
36 static inline int cpu_has_work(CPUState
*env
)
38 return (env
->interrupt_request
&
39 (CPU_INTERRUPT_HARD
| CPU_INTERRUPT_TIMER
));
43 static inline int cpu_halted(CPUState
*env
)
47 if (cpu_has_work(env
)) {
54 static inline void compute_hflags(CPUState
*env
)
56 env
->hflags
&= ~(MIPS_HFLAG_COP1X
| MIPS_HFLAG_64
| MIPS_HFLAG_CP0
|
57 MIPS_HFLAG_F64
| MIPS_HFLAG_FPU
| MIPS_HFLAG_KSU
|
59 if (!(env
->CP0_Status
& (1 << CP0St_EXL
)) &&
60 !(env
->CP0_Status
& (1 << CP0St_ERL
)) &&
61 !(env
->hflags
& MIPS_HFLAG_DM
)) {
62 env
->hflags
|= (env
->CP0_Status
>> CP0St_KSU
) & MIPS_HFLAG_KSU
;
64 #if defined(TARGET_MIPS64)
65 if (((env
->hflags
& MIPS_HFLAG_KSU
) != MIPS_HFLAG_UM
) ||
66 (env
->CP0_Status
& (1 << CP0St_PX
)) ||
67 (env
->CP0_Status
& (1 << CP0St_UX
)))
68 env
->hflags
|= MIPS_HFLAG_64
;
69 if (env
->CP0_Status
& (1 << CP0St_UX
))
70 env
->hflags
|= MIPS_HFLAG_UX
;
72 if ((env
->CP0_Status
& (1 << CP0St_CU0
)) ||
73 !(env
->hflags
& MIPS_HFLAG_KSU
))
74 env
->hflags
|= MIPS_HFLAG_CP0
;
75 if (env
->CP0_Status
& (1 << CP0St_CU1
))
76 env
->hflags
|= MIPS_HFLAG_FPU
;
77 if (env
->CP0_Status
& (1 << CP0St_FR
))
78 env
->hflags
|= MIPS_HFLAG_F64
;
79 if (env
->insn_flags
& ISA_MIPS32R2
) {
80 if (env
->active_fpu
.fcr0
& (1 << FCR0_F64
))
81 env
->hflags
|= MIPS_HFLAG_COP1X
;
82 } else if (env
->insn_flags
& ISA_MIPS32
) {
83 if (env
->hflags
& MIPS_HFLAG_64
)
84 env
->hflags
|= MIPS_HFLAG_COP1X
;
85 } else if (env
->insn_flags
& ISA_MIPS4
) {
86 /* All supported MIPS IV CPUs use the XX (CU3) to enable
87 and disable the MIPS IV extensions to the MIPS III ISA.
88 Some other MIPS IV CPUs ignore the bit, so the check here
89 would be too restrictive for them. */
90 if (env
->CP0_Status
& (1 << CP0St_CU3
))
91 env
->hflags
|= MIPS_HFLAG_COP1X
;
95 #endif /* !defined(__QEMU_MIPS_EXEC_H__) */