From 10067063ff55d68653f7a1af220ed46a1f37ba9c Mon Sep 17 00:00:00 2001
From: Oliver Ford <oliford@NervousEnergy.(none)>
Date: Sat, 19 Apr 2008 01:20:21 +0100
Subject: [PATCH] Dumping MMU entry of breakpoint address during breakpoint

---
 src/l1trace.cpp  |   11 ++++++-----
 src/pxatrace.cpp |   14 ++++++++++++++
 2 files changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/l1trace.cpp b/src/l1trace.cpp
index 8bf7d67..8204cb2 100644
--- a/src/l1trace.cpp
+++ b/src/l1trace.cpp
@@ -538,6 +538,12 @@ prepL1traps(struct irqData *data)
     data->ignoreAddrCount = ignoreAddrCount;
     memcpy(data->ignoreAddr, ignoreAddr, sizeof(data->ignoreAddr));
 
+    data->mmuVAddr = (uint32*)memPhysMap(cpuGetMMU());  //PXATrace uses this aswell, make sure its always done
+    if (! data->mmuVAddr) {
+        Output("Unable to map MMU table");
+        return -1;
+    }
+
     data->traceCount = MMUTrace.tracecount;
     if (!data->traceCount)
         // Nothing to do.
@@ -550,11 +556,6 @@ prepL1traps(struct irqData *data)
         return -1;
     }
 
-    data->mmuVAddr = (uint32*)memPhysMap(cpuGetMMU());
-    if (! data->mmuVAddr) {
-        Output("Unable to map MMU table");
-        return -1;
-    }
 
     data->max_l1trace = MaxL1Trace;
     data->max_l1trace_after_resume = MaxL1TraceAfterResume;
diff --git a/src/pxatrace.cpp b/src/pxatrace.cpp
index bd8fce0..3e8a1e4 100644
--- a/src/pxatrace.cpp
+++ b/src/pxatrace.cpp
@@ -123,6 +123,8 @@ report_insnTrace(irqData *, const char *header, traceitem *item)
            , header, pc, reg1, reg2);
 }
 
+DEF_GETCPR(get_p15r2, p15, 0, c2, c0, 0)
+
 // Code that handles instruction breakpoint events.
 int __irq
 PXA_prefetch_handler(struct irqData *data, struct irqregs *regs)
@@ -159,6 +161,18 @@ PXA_prefetch_handler(struct irqData *data, struct irqregs *regs)
               , getReg(regs, idata->reg1)
               , getReg(regs, idata->reg2));
 
+    if(data->mmuVAddr){
+        uint32 *l1entryVA = data->mmuVAddr + (old_pc >> 20); //old_pc is already an MVA, look it up in the MMU
+        uint32 *l1entryMVA = (uint32*)MVAddr_irq((uint32)l1entryVA); //but we need to make sure we're using an MVA to access the MMU
+
+        add_trace(data, report_insnTrace, old_pc
+                  , get_p15r2() & 0xffffc000
+                  , (uint32)l1entryVA );
+
+         add_trace(data, report_insnTrace, old_pc
+                   , (uint32)l1entryMVA
+                   , *l1entryMVA );
+    }
     return 1;
 }
 
-- 
1.5.2.5

