qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [5445] CRIS: Fix brk 8 and add S-flag emulation.


From: Edgar E. Iglesias
Subject: [Qemu-devel] [5445] CRIS: Fix brk 8 and add S-flag emulation.
Date: Tue, 07 Oct 2008 22:48:41 +0000

Revision: 5445
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5445
Author:   edgar_igl
Date:     2008-10-07 22:48:41 +0000 (Tue, 07 Oct 2008)

Log Message:
-----------
CRIS: Fix brk 8 and add S-flag emulation.

* break 8 sets ERP to the current insn.
* First shot at S flag single-stepping.
* Make it easier to use the local disasm.

Modified Paths:
--------------
    trunk/cpu-exec.c
    trunk/target-cris/helper.c
    trunk/target-cris/helper.h
    trunk/target-cris/op_helper.c
    trunk/target-cris/translate.c

Modified: trunk/cpu-exec.c
===================================================================
--- trunk/cpu-exec.c    2008-10-07 21:22:41 UTC (rev 5444)
+++ trunk/cpu-exec.c    2008-10-07 22:48:41 UTC (rev 5445)
@@ -220,7 +220,7 @@
     cs_base = 0;
     pc = env->pc;
 #elif defined(TARGET_CRIS)
-    flags = env->pregs[PR_CCS] & (P_FLAG | U_FLAG | X_FLAG);
+    flags = env->pregs[PR_CCS] & (S_FLAG | P_FLAG | U_FLAG | X_FLAG);
     flags |= env->dslot;
     cs_base = 0;
     pc = env->pc;

Modified: trunk/target-cris/helper.c
===================================================================
--- trunk/target-cris/helper.c  2008-10-07 21:22:41 UTC (rev 5444)
+++ trunk/target-cris/helper.c  2008-10-07 22:48:41 UTC (rev 5445)
@@ -119,7 +119,7 @@
                        /* These exceptions are genereated by the core itself.
                           ERP should point to the insn following the brk.  */
                        ex_vec = env->trap_vector;
-                       env->pregs[PR_ERP] = env->pc + 2;
+                       env->pregs[PR_ERP] = env->pc;
                        break;
 
                case EXCP_NMI:

Modified: trunk/target-cris/helper.h
===================================================================
--- trunk/target-cris/helper.h  2008-10-07 21:22:41 UTC (rev 5444)
+++ trunk/target-cris/helper.h  2008-10-07 22:48:41 UTC (rev 5445)
@@ -2,6 +2,7 @@
 
 void TCG_HELPER_PROTO helper_raise_exception(uint32_t index);
 void TCG_HELPER_PROTO helper_tlb_flush_pid(uint32_t pid);
+void TCG_HELPER_PROTO helper_spc_write(uint32_t pid);
 void TCG_HELPER_PROTO helper_dump(uint32_t a0, uint32_t a1, uint32_t a2);
 void TCG_HELPER_PROTO helper_rfe(void);
 void TCG_HELPER_PROTO helper_rfn(void);

Modified: trunk/target-cris/op_helper.c
===================================================================
--- trunk/target-cris/op_helper.c       2008-10-07 21:22:41 UTC (rev 5444)
+++ trunk/target-cris/op_helper.c       2008-10-07 22:48:41 UTC (rev 5445)
@@ -97,6 +97,14 @@
 #endif
 }
 
+void helper_spc_write(uint32_t new_spc)
+{
+#if !defined(CONFIG_USER_ONLY)
+       tlb_flush_page(env, env->pregs[PR_SPC]);
+       tlb_flush_page(env, new_spc);
+#endif
+}
+
 void helper_dump(uint32_t a0, uint32_t a1, uint32_t a2)
 {
        (fprintf(logfile, "%s: a0=%x a1=%x\n", __func__, a0, a1)); 

Modified: trunk/target-cris/translate.c
===================================================================
--- trunk/target-cris/translate.c       2008-10-07 21:22:41 UTC (rev 5444)
+++ trunk/target-cris/translate.c       2008-10-07 22:48:41 UTC (rev 5445)
@@ -41,7 +41,7 @@
 
 #define DISAS_CRIS 0
 #if DISAS_CRIS
-#define DIS(x) x
+#define DIS(x) if (loglevel & CPU_LOG_TB_IN_ASM) x
 #else
 #define DIS(x)
 #endif
@@ -218,6 +218,8 @@
        else {
                if (r == PR_PID) 
                        tcg_gen_helper_0_1(helper_tlb_flush_pid, tn);
+               if (dc->tb_flags & S_FLAG && r == PR_SPC) 
+                       tcg_gen_helper_0_1(helper_spc_write, tn);
                else if (r == PR_CCS)
                        dc->cpustate_changed = 1;
                tcg_gen_mov_tl(cpu_PR[r], tn);
@@ -1377,8 +1379,6 @@
                } else
                        imm = ldl_code(dc->pc + 2);
                        
-               DIS(fprintf (logfile, "imm=%x rd=%d sext=%d ms=%d\n",
-                            imm, rd, s_ext, memsize));
                tcg_gen_movi_tl(dst, imm);
                dc->postinc = 0;
        } else {
@@ -2063,7 +2063,7 @@
 
     /* User space is not allowed to touch these. Silently ignore.  */
        if (dc->tb_flags & U_FLAG) {
-               flags &= ~(I_FLAG | U_FLAG);
+               flags &= ~(S_FLAG | I_FLAG | U_FLAG);
        }
 
        if (flags & X_FLAG) {
@@ -2083,6 +2083,9 @@
                        dc->cpustate_changed = 1;
                }
        }
+       if (flags & S_FLAG) {
+               dc->cpustate_changed = 1;
+       }
 
 
        /* Simply decode the flags.  */
@@ -2784,9 +2787,6 @@
 
 static unsigned int dec_rfe_etc(DisasContext *dc)
 {
-       DIS(fprintf (logfile, "rfe_etc opc=%x pc=0x%x op1=%d op2=%d\n",
-                   dc->opcode, dc->pc, dc->op1, dc->op2));
-
        cris_cc_mask(dc, 0);
 
        if (dc->op2 == 15) /* ignore halt.  */
@@ -2795,19 +2795,29 @@
        switch (dc->op2 & 7) {
                case 2:
                        /* rfe.  */
+                       DIS(fprintf(logfile, "rfe\n"));
                        cris_evaluate_flags(dc);
                        tcg_gen_helper_0_0(helper_rfe);
                        dc->is_jmp = DISAS_UPDATE;
                        break;
                case 5:
                        /* rfn.  */
+                       DIS(fprintf(logfile, "rfn\n"));
                        cris_evaluate_flags(dc);
                        tcg_gen_helper_0_0(helper_rfn);
                        dc->is_jmp = DISAS_UPDATE;
                        break;
                case 6:
+                       DIS(fprintf(logfile, "break %d\n", dc->op1));
+                       cris_evaluate_flags (dc);
                        /* break.  */
-                       tcg_gen_movi_tl(env_pc, dc->pc);
+                       if (dc->op1 == 8) {
+                               /* TODO: Find out whats special with brk8.  */
+                               tcg_gen_movi_tl(env_pc, dc->pc);
+                       }
+                       else
+                               tcg_gen_movi_tl(env_pc, dc->pc + 2);
+
                        /* Breaks start at 16 in the exception vector.  */
                        t_gen_mov_env_TN(trap_vector, 
                                         tcg_const_tl(dc->op1 + 16));
@@ -2984,6 +2994,22 @@
                }
        }
 
+#if defined(CONFIG_USER_ONLY)
+       /* Single-stepping ?  */
+       if (dc->tb_flags & S_FLAG) {
+               int l1;
+
+               l1 = gen_new_label();
+               tcg_gen_brcondi_tl(TCG_COND_NE,
+                                  cpu_PR[PR_SPC], tcg_const_tl(dc->pc), l1);
+               /* We treat SPC as a break with an odd trap vector.  */
+               cris_evaluate_flags (dc);
+               t_gen_mov_env_TN(trap_vector, tcg_const_tl(3));
+               tcg_gen_movi_tl(env_pc, dc->pc + insn_len);
+               t_gen_raise_exception(EXCP_BREAK);
+               gen_set_label(l1);
+       }
+#endif
        return insn_len;
 }
 
@@ -3080,7 +3106,7 @@
        dc->cc_size_uptodate = -1;
 
        /* Decode TB flags.  */
-       dc->tb_flags = tb->flags & (P_FLAG | U_FLAG | X_FLAG);
+       dc->tb_flags = tb->flags & (S_FLAG | P_FLAG | U_FLAG | X_FLAG);
        dc->delayed_branch = !!(tb->flags & 7);
        if (dc->delayed_branch)
                dc->jmp = JMP_INDIRECT;
@@ -3108,7 +3134,8 @@
                        env->regs[10], env->regs[11],
                        env->regs[12], env->regs[13],
                        env->regs[14], env->regs[15]);
-               
+               fprintf(logfile, "--------------\n");
+               fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
        }
 
        next_page_start = (pc_start & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
@@ -3139,10 +3166,7 @@
                }
 
                /* Pretty disas.  */
-               DIS(fprintf(logfile, "%x ", dc->pc));
-               if (search_pc) {
-                       DIS(fprintf(logfile, "%x ", dc->pc));
-               }
+               DIS(fprintf(logfile, "%8.8x:\t", dc->pc));
 
                 if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
                     gen_io_start();
@@ -3241,14 +3265,14 @@
        }
 
 #ifdef DEBUG_DISAS
+#if !DISAS_CRIS
        if (loglevel & CPU_LOG_TB_IN_ASM) {
-               fprintf(logfile, "--------------\n");
-               fprintf(logfile, "IN: %s\n", lookup_symbol(pc_start));
                target_disas(logfile, pc_start, dc->pc - pc_start, 0);
                fprintf(logfile, "\nisize=%d osize=%zd\n",
                        dc->pc - pc_start, gen_opc_ptr - gen_opc_buf);
        }
 #endif
+#endif
 }
 
 void gen_intermediate_code (CPUState *env, struct TranslationBlock *tb)






reply via email to

[Prev in Thread] Current Thread [Next in Thread]