Annotation of qemu/target-mips/exec.h, revision 1.1.1.10

1.1       root        1: #if !defined(__QEMU_MIPS_EXEC_H__)
                      2: #define __QEMU_MIPS_EXEC_H__
                      3: 
1.1.1.2   root        4: //#define DEBUG_OP
1.1       root        5: 
1.1.1.5   root        6: #include "config.h"
1.1       root        7: #include "mips-defs.h"
                      8: #include "dyngen-exec.h"
1.1.1.6   root        9: #include "cpu-defs.h"
1.1       root       10: 
                     11: register struct CPUMIPSState *env asm(AREG0);
                     12: 
                     13: #include "cpu.h"
                     14: #include "exec-all.h"
                     15: 
                     16: #if !defined(CONFIG_USER_ONLY)
1.1.1.2   root       17: #include "softmmu_exec.h"
1.1       root       18: #endif /* !defined(CONFIG_USER_ONLY) */
                     19: 
1.1.1.8   root       20: static inline int cpu_has_work(CPUState *env)
                     21: {
1.1.1.10! root       22:     int has_work = 0;
        !            23: 
        !            24:     /* It is implementation dependent if non-enabled interrupts
        !            25:        wake-up the CPU, however most of the implementations only
        !            26:        check for interrupts that can be taken. */
        !            27:     if ((env->interrupt_request & CPU_INTERRUPT_HARD) &&
        !            28:         cpu_mips_hw_interrupts_pending(env)) {
        !            29:         has_work = 1;
        !            30:     }
1.1.1.8   root       31: 
1.1.1.10! root       32:     if (env->interrupt_request & CPU_INTERRUPT_TIMER) {
        !            33:         has_work = 1;
        !            34:     }
        !            35: 
        !            36:     return has_work;
        !            37: }
1.1.1.8   root       38: 
1.1.1.7   root       39: static inline int cpu_halted(CPUState *env)
1.1.1.6   root       40: {
                     41:     if (!env->halted)
                     42:         return 0;
1.1.1.8   root       43:     if (cpu_has_work(env)) {
1.1.1.6   root       44:         env->halted = 0;
                     45:         return 0;
                     46:     }
                     47:     return EXCP_HALTED;
                     48: }
                     49: 
1.1.1.7   root       50: static inline void compute_hflags(CPUState *env)
1.1.1.6   root       51: {
                     52:     env->hflags &= ~(MIPS_HFLAG_COP1X | MIPS_HFLAG_64 | MIPS_HFLAG_CP0 |
1.1.1.7   root       53:                      MIPS_HFLAG_F64 | MIPS_HFLAG_FPU | MIPS_HFLAG_KSU |
                     54:                      MIPS_HFLAG_UX);
1.1.1.6   root       55:     if (!(env->CP0_Status & (1 << CP0St_EXL)) &&
                     56:         !(env->CP0_Status & (1 << CP0St_ERL)) &&
                     57:         !(env->hflags & MIPS_HFLAG_DM)) {
                     58:         env->hflags |= (env->CP0_Status >> CP0St_KSU) & MIPS_HFLAG_KSU;
                     59:     }
                     60: #if defined(TARGET_MIPS64)
                     61:     if (((env->hflags & MIPS_HFLAG_KSU) != MIPS_HFLAG_UM) ||
                     62:         (env->CP0_Status & (1 << CP0St_PX)) ||
                     63:         (env->CP0_Status & (1 << CP0St_UX)))
                     64:         env->hflags |= MIPS_HFLAG_64;
1.1.1.7   root       65:     if (env->CP0_Status & (1 << CP0St_UX))
                     66:         env->hflags |= MIPS_HFLAG_UX;
1.1.1.6   root       67: #endif
                     68:     if ((env->CP0_Status & (1 << CP0St_CU0)) ||
                     69:         !(env->hflags & MIPS_HFLAG_KSU))
                     70:         env->hflags |= MIPS_HFLAG_CP0;
                     71:     if (env->CP0_Status & (1 << CP0St_CU1))
                     72:         env->hflags |= MIPS_HFLAG_FPU;
                     73:     if (env->CP0_Status & (1 << CP0St_FR))
                     74:         env->hflags |= MIPS_HFLAG_F64;
                     75:     if (env->insn_flags & ISA_MIPS32R2) {
1.1.1.7   root       76:         if (env->active_fpu.fcr0 & (1 << FCR0_F64))
1.1.1.6   root       77:             env->hflags |= MIPS_HFLAG_COP1X;
                     78:     } else if (env->insn_flags & ISA_MIPS32) {
                     79:         if (env->hflags & MIPS_HFLAG_64)
                     80:             env->hflags |= MIPS_HFLAG_COP1X;
                     81:     } else if (env->insn_flags & ISA_MIPS4) {
                     82:         /* All supported MIPS IV CPUs use the XX (CU3) to enable
                     83:            and disable the MIPS IV extensions to the MIPS III ISA.
                     84:            Some other MIPS IV CPUs ignore the bit, so the check here
                     85:            would be too restrictive for them.  */
                     86:         if (env->CP0_Status & (1 << CP0St_CU3))
                     87:             env->hflags |= MIPS_HFLAG_COP1X;
                     88:     }
                     89: }
                     90: 
1.1.1.9   root       91: static inline void cpu_pc_from_tb(CPUState *env, TranslationBlock *tb)
                     92: {
                     93:     env->active_tc.PC = tb->pc;
                     94:     env->hflags &= ~MIPS_HFLAG_BMASK;
                     95:     env->hflags |= tb->flags & MIPS_HFLAG_BMASK;
                     96: }
                     97: 
1.1       root       98: #endif /* !defined(__QEMU_MIPS_EXEC_H__) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.