#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
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;
}
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);
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";
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)) {
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;
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)