]> git.proxmox.com Git - qemu.git/commitdiff
cris: Prepare for CRISv10.
authorEdgar E. Iglesias <edgar.iglesias@gmail.com>
Mon, 15 Feb 2010 10:17:33 +0000 (11:17 +0100)
committerEdgar E. Iglesias <edgar.iglesias@gmail.com>
Mon, 15 Feb 2010 10:17:33 +0000 (11:17 +0100)
* Add prefix flag and special reg.
* Add interrupt lockout.
* Add CC_OP_MSTEP.

Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
cpu-exec.c
target-cris/cpu.h

index 0256edf1f3f6878f4da2f54f38f363d87bc7f188..6a290fd6cde591ba6af466ee6572d97a464f602c 100644 (file)
@@ -497,7 +497,8 @@ int cpu_exec(CPUState *env1)
                     }
 #elif defined(TARGET_CRIS)
                     if (interrupt_request & CPU_INTERRUPT_HARD
-                        && (env->pregs[PR_CCS] & I_FLAG)) {
+                        && (env->pregs[PR_CCS] & I_FLAG)
+                        && !env->locked_irq) {
                         env->exception_index = EXCP_IRQ;
                         do_interrupt(env);
                         next_tb = 0;
index 0626cd8dd986adacd4497445b0d9ae2fca46547f..445d92bfc7794ceae92bfedc2f262a07fd967240 100644 (file)
@@ -49,6 +49,7 @@
 #define PR_WZ  4
 #define PR_EXS 5
 #define PR_EDA 6
+#define PR_PREFIX 6    /* On CRISv10 P6 is reserved, we use it as prefix.  */
 #define PR_MOF 7
 #define PR_DZ  8
 #define PR_EBP 9
@@ -62,6 +63,7 @@
 /* CPU flags.  */
 #define Q_FLAG 0x80000000
 #define M_FLAG 0x40000000
+#define PFIX_FLAG 0x800      /* CRISv10 Only.  */
 #define S_FLAG 0x200
 #define R_FLAG 0x100
 #define P_FLAG 0x80
@@ -121,6 +123,8 @@ typedef struct CPUCRISState {
        /* X flag at the time of cc snapshot.  */
        int cc_x;
 
+       /* CRIS has certain insns that lockout interrupts.  */
+       int locked_irq;
        int interrupt_vector;
        int fault_vector;
        int trap_vector;
@@ -180,6 +184,7 @@ enum {
     CC_OP_MULS,
     CC_OP_MULU,
     CC_OP_DSTEP,
+    CC_OP_MSTEP,
     CC_OP_BOUND,
 
     CC_OP_OR,
@@ -253,7 +258,8 @@ static inline void cpu_get_tb_cpu_state(CPUState *env, target_ulong *pc,
     *pc = env->pc;
     *cs_base = 0;
     *flags = env->dslot |
-            (env->pregs[PR_CCS] & (S_FLAG | P_FLAG | U_FLAG | X_FLAG));
+            (env->pregs[PR_CCS] & (S_FLAG | P_FLAG | U_FLAG
+                                    | X_FLAG | PFIX_FLAG));
 }
 
 #endif