mem-cache: Add multiple eviction stats
[gem5.git] / src / arch / x86 / stacktrace.cc
index 70285e142c30941c5d94cc8d3e002cd6979a8347..0141a9e75cec223e5ee1326f02fa5376a61ca223 100644 (file)
 #include "mem/fs_translating_port_proxy.hh"
 #include "sim/system.hh"
 
-using namespace std;
 namespace X86ISA
 {
 
-ProcessInfo::ProcessInfo(ThreadContext *_tc)
-    : tc(_tc)
+static int32_t
+readSymbol(ThreadContext *tc, const std::string name)
 {
-    Addr addr = 0;
-
-    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);
+    PortProxy &vp = tc->getVirtProxy();
+    SymbolTable *symtab = tc->getSystemPtr()->kernelSymtab;
 
-    if (!tc->getSystemPtr()->kernelSymtab->findAddress(
-                "task_struct_size", addr)) {
+    Addr addr;
+    if (!symtab->findAddress(name, addr))
         panic("thread info not compiled into kernel\n");
-    }
-    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);
-
-    if (!tc->getSystemPtr()->kernelSymtab->findAddress(
-                "task_struct_pid", addr)) {
-        panic("thread info not compiled into kernel\n");
-    }
-    pid_off = vp.readGtoH<int32_t>(addr);
+    return vp.read<int32_t>(addr, GuestByteOrder);
+}
 
-    if (!tc->getSystemPtr()->kernelSymtab->findAddress(
-                "task_struct_comm", addr)) {
-        panic("thread info not compiled into kernel\n");
-    }
-    name_off = vp.readGtoH<int32_t>(addr);
+ProcessInfo::ProcessInfo(ThreadContext *_tc) : tc(_tc)
+{
+    thread_info_size = readSymbol(tc, "thread_info_size");
+    task_struct_size = readSymbol(tc, "task_struct_size");
+    task_off = readSymbol(tc, "thread_info_task");
+    pid_off = readSymbol(tc, "task_struct_pid");
+    name_off = readSymbol(tc, "task_struct_comm");
 }
 
 Addr
@@ -92,8 +75,8 @@ ProcessInfo::task(Addr ksp) const
 
     Addr tsk;
 
-    FSTranslatingPortProxy &vp = tc->getVirtProxy();
-    tsk = vp.readGtoH<Addr>(base + task_off);
+    PortProxy &vp = tc->getVirtProxy();
+    tsk = vp.read<Addr>(base + task_off, GuestByteOrder);
 
     return tsk;
 }
@@ -107,13 +90,13 @@ ProcessInfo::pid(Addr ksp) const
 
     uint16_t pd;
 
-    FSTranslatingPortProxy &vp = tc->getVirtProxy();
-    pd = vp.readGtoH<uint16_t>(task + pid_off);
+    PortProxy &vp = tc->getVirtProxy();
+    pd = vp.read<uint16_t>(task + pid_off, GuestByteOrder);
 
     return pd;
 }
 
-string
+std::string
 ProcessInfo::name(Addr ksp) const
 {
     Addr task = this->task(ksp);
@@ -121,7 +104,7 @@ ProcessInfo::name(Addr ksp) const
         return "console";
 
     char comm[256];
-    CopyStringOut(tc, comm, task + name_off, sizeof(comm));
+    tc->getVirtProxy().readString(comm, task + name_off, sizeof(comm));
     if (!comm[0])
         return "startup";
 
@@ -181,8 +164,7 @@ StackTrace::decodePrologue(Addr sp, Addr callpc, Addr func,
     ra = 0;
 
     for (Addr pc = func; pc < callpc; pc += sizeof(MachInst)) {
-        MachInst inst;
-        CopyOut(tc, (uint8_t *)&inst, pc, sizeof(MachInst));
+        MachInst inst = tc->getVirtProxy().read<MachInst>(pc);
 
         int reg, disp;
         if (decodeStack(inst, disp)) {
@@ -193,7 +175,7 @@ StackTrace::decodePrologue(Addr sp, Addr callpc, Addr func,
             size += disp;
         } else if (decodeSave(inst, reg, disp)) {
             if (!ra && reg == ReturnAddressReg) {
-                CopyOut(tc, (uint8_t *)&ra, sp + disp, sizeof(Addr));
+                ra = tc->getVirtProxy().read<Addr>(sp + disp);
                 if (!ra) {
                     // panic("no return address value pc=%#x\n", pc);
                     return false;
@@ -214,7 +196,7 @@ StackTrace::dump()
 
     DPRINTFN("------ Stack ------\n");
 
-    string symbol;
+    std::string symbol;
     for (int i = 0, size = stack.size(); i < size; ++i) {
         Addr addr = stack[size - i - 1];
         if (addr == user)