stats: update stats for mmap() change.
[gem5.git] / src / arch / arm / stacktrace.cc
index 6b346b0abff761e717752bfdfff3d903eec644c5..0246ffd4e8c31ec67428a4102be5dd20f6c8e56e 100644 (file)
@@ -37,6 +37,7 @@
 #include "base/trace.hh"
 #include "cpu/base.hh"
 #include "cpu/thread_context.hh"
+#include "mem/fs_translating_port_proxy.hh"
 #include "sim/system.hh"
 
 using namespace std;
@@ -47,47 +48,72 @@ namespace ArmISA
     {
         Addr addr = 0;
 
-        VirtualPort *vp;
-
-        vp = tc->getVirtPort();
+        FSTranslatingPortProxy &vp = tc->getVirtProxy();
 
         if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr))
             panic("thread info not compiled into kernel\n");
-        thread_info_size = vp->readGtoH<int32_t>(addr);
+        thread_info_size = vp.readGtoH<int32_t>(addr);
 
         if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr))
             panic("thread info not compiled into kernel\n");
-        task_struct_size = vp->readGtoH<int32_t>(addr);
+        task_struct_size = vp.readGtoH<int32_t>(addr);
 
         if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr))
             panic("thread info not compiled into kernel\n");
-        task_off = vp->readGtoH<int32_t>(addr);
+        task_off = vp.readGtoH<int32_t>(addr);
 
         if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr))
             panic("thread info not compiled into kernel\n");
-        pid_off = vp->readGtoH<int32_t>(addr);
+        pid_off = vp.readGtoH<int32_t>(addr);
 
         if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
             panic("thread info not compiled into kernel\n");
-        name_off = vp->readGtoH<int32_t>(addr);
+        name_off = vp.readGtoH<int32_t>(addr);
     }
 
     Addr
     ProcessInfo::task(Addr ksp) const
     {
-        return 0;
+        Addr base = ksp & ~0x1fff;
+        if (base == ULL(0xffffffffc0000000))
+            return 0;
+
+        Addr tsk;
+
+        FSTranslatingPortProxy &vp = tc->getVirtProxy();
+        tsk = vp.readGtoH<Addr>(base + task_off);
+
+        return tsk;
     }
 
     int
     ProcessInfo::pid(Addr ksp) const
     {
-        return -1;
+        Addr task = this->task(ksp);
+        if (!task)
+            return -1;
+
+        uint16_t pd;
+
+        FSTranslatingPortProxy &vp = tc->getVirtProxy();
+        pd = vp.readGtoH<uint16_t>(task + pid_off);
+
+        return pd;
     }
 
     string
     ProcessInfo::name(Addr ksp) const
     {
-        return "Implement me";
+        Addr task = this->task(ksp);
+        if (!task)
+            return "unknown";
+
+        char comm[256];
+        CopyStringOut(tc, comm, task + name_off, sizeof(comm));
+        if (!comm[0])
+            return "startup";
+
+        return comm;
     }
 
     StackTrace::StackTrace()
@@ -95,7 +121,7 @@ namespace ArmISA
     {
     }
 
-    StackTrace::StackTrace(ThreadContext *_tc, StaticInstPtr inst)
+    StackTrace::StackTrace(ThreadContext *_tc, const StaticInstPtr &inst)
         : tc(0), stack(64)
     {
         trace(_tc, inst);
@@ -144,7 +170,7 @@ namespace ArmISA
     StackTrace::dump()
     {
         DPRINTFN("------ Stack ------\n");
-    
+
         DPRINTFN(" Not implemented\n");
     }
 #endif