Show size for unassigned accesses (Robert Reif)
[qemu] / target-cris / op_helper.c
index f5c0ed1..bcdaf7e 100644 (file)
@@ -61,7 +61,7 @@ void tlb_fill (target_ulong addr, int is_write, int mmu_idx, void *retaddr)
     D(fprintf(logfile, "%s pc=%x tpc=%x ra=%x\n", __func__, 
             env->pc, env->debug1, retaddr));
     ret = cpu_cris_handle_mmu_fault(env, addr, is_write, mmu_idx, 1);
-    if (__builtin_expect(ret, 0)) {
+    if (unlikely(ret)) {
         if (retaddr) {
             /* now we have a real cpu fault */
             pc = (unsigned long)retaddr;
@@ -91,7 +91,9 @@ void helper_raise_exception(uint32_t index)
 void helper_tlb_flush_pid(uint32_t pid)
 {
 #if !defined(CONFIG_USER_ONLY)
-       cris_mmu_flush_pid(env, pid);
+       pid &= 0xff;
+       if (pid != (env->pregs[PR_PID] & 0xff))
+               cris_mmu_flush_pid(env, env->pregs[PR_PID]);
 #endif
 }
 
@@ -100,11 +102,6 @@ void helper_dump(uint32_t a0, uint32_t a1, uint32_t a2)
        (fprintf(logfile, "%s: a0=%x a1=%x\n", __func__, a0, a1)); 
 }
 
-void helper_dummy(void)
-{
-
-}
-
 /* Used by the tlb decoder.  */
 #define EXTRACT_FIELD(src, start, end) \
            (((src) >> start) & ((1 << (end - start + 1)) - 1))
@@ -121,8 +118,8 @@ void helper_movl_sreg_reg (uint32_t sreg, uint32_t reg)
                if (sreg == 6) {
                        /* Writes to tlb-hi write to mm_cause as a side 
                           effect.  */
-                       env->sregs[SFR_RW_MM_TLB_HI] = T0;
-                       env->sregs[SFR_R_MM_CAUSE] = T0;
+                       env->sregs[SFR_RW_MM_TLB_HI] = env->regs[reg];
+                       env->sregs[SFR_R_MM_CAUSE] = env->regs[reg];
                }
                else if (sreg == 5) {
                        uint32_t set;
@@ -220,20 +217,30 @@ void helper_rfe(void)
                env->pregs[PR_CCS] |= P_FLAG;
 }
 
-void helper_store(uint32_t a0)
+void helper_rfn(void)
 {
-       if (env->pregs[PR_CCS] & P_FLAG )
-       {
-               cpu_abort(env, "cond_store_failed! pc=%x a0=%x\n",
-                         env->pc, a0);
-       }
+       int rflag = env->pregs[PR_CCS] & R_FLAG;
+
+       D(fprintf(logfile, "rfn: erp=%x pid=%x ccs=%x btarget=%x\n", 
+                env->pregs[PR_ERP], env->pregs[PR_PID],
+                env->pregs[PR_CCS],
+                env->btarget));
+
+       cris_ccs_rshift(env);
+
+       /* Set the P_FLAG only if the R_FLAG is not set.  */
+       if (!rflag)
+               env->pregs[PR_CCS] |= P_FLAG;
+
+    /* Always set the M flag.  */
+    env->pregs[PR_CCS] |= M_FLAG;
 }
 
 void do_unassigned_access(target_phys_addr_t addr, int is_write, int is_exec,
-                          int is_asi)
+                          int is_asi, int size)
 {
-       D(printf("%s addr=%x w=%d ex=%d asi=%d\n", 
-               __func__, addr, is_write, is_exec, is_asi));
+       D(printf("%s addr=%x w=%d ex=%d asi=%d, size=%d\n",
+               __func__, addr, is_write, is_exec, is_asi, size));
 }
 
 static void evaluate_flags_writeback(uint32_t flags)