microblaze: Break the tb at memory barriers
authorEdgar E. Iglesias <edgar.iglesias@gmail.com>
Tue, 10 Jan 2012 09:33:37 +0000 (10:33 +0100)
committerEdgar E. Iglesias <edgar.iglesias@gmail.com>
Thu, 12 Jan 2012 12:54:17 +0000 (13:54 +0100)
Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
target-microblaze/translate.c

index 180ac84f06b9ec0028e201b7c30d767ce36190a5..96ce2ece5183041fcf965251fa9e85ddb4473895 100644 (file)
@@ -1249,12 +1249,22 @@ static void dec_bcc(DisasContext *dc)
 
 static void dec_br(DisasContext *dc)
 {
-    unsigned int dslot, link, abs;
+    unsigned int dslot, link, abs, mbar;
     int mem_index = cpu_mmu_index(dc->env);
 
     dslot = dc->ir & (1 << 20);
     abs = dc->ir & (1 << 19);
     link = dc->ir & (1 << 18);
+
+    /* Memory barrier.  */
+    mbar = (dc->ir >> 16) & 31;
+    if (mbar == 2 && dc->imm == 4) {
+        LOG_DIS("mbar %d\n", dc->rd);
+        /* Break the TB.  */
+        dc->cpustate_changed = 1;
+        return;
+    }
+
     LOG_DIS("br%s%s%s%s imm=%x\n",
              abs ? "a" : "", link ? "l" : "",
              dc->type_b ? "i" : "", dslot ? "d" : "",