add write/read functions that have endian conversions in them
when we get a virtual port delete it (even though delete does nothing in these cases) src/arch/alpha/linux/system.cc: src/arch/alpha/stacktrace.cc: src/base/remote_gdb.cc: src/cpu/simple_thread.cc: when we get a virtual port delete it (even though delete does nothing in this case) src/mem/port.hh: src/mem/vport.hh: add write/read functions that have endian conversions in them --HG-- extra : convert_revision : 163e05cc038c461f95c92f8ce55422033f9ea513
This commit is contained in:
parent
54d4220b00
commit
8ee856f1d5
|
@ -181,8 +181,11 @@ LinuxAlphaSystem::setDelayLoop(ThreadContext *tc)
|
||||||
if (kernelSymtab->findAddress("loops_per_jiffy", addr)) {
|
if (kernelSymtab->findAddress("loops_per_jiffy", addr)) {
|
||||||
Tick cpuFreq = tc->getCpuPtr()->frequency();
|
Tick cpuFreq = tc->getCpuPtr()->frequency();
|
||||||
Tick intrFreq = platform->intrFrequency();
|
Tick intrFreq = platform->intrFrequency();
|
||||||
tc->getVirtPort(tc)->write(addr,
|
VirtualPort *vp;
|
||||||
(uint32_t)((cpuFreq / intrFreq) * 0.9988));
|
|
||||||
|
vp = tc->getVirtPort();
|
||||||
|
vp->writeHtoG(addr, (uint32_t)((cpuFreq / intrFreq) * 0.9988));
|
||||||
|
tc->delVirtPort(vp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,25 +47,31 @@ ProcessInfo::ProcessInfo(ThreadContext *_tc)
|
||||||
{
|
{
|
||||||
Addr addr = 0;
|
Addr addr = 0;
|
||||||
|
|
||||||
|
VirtualPort *vp;
|
||||||
|
|
||||||
|
vp = tc->getVirtPort();
|
||||||
|
|
||||||
if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr))
|
if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr))
|
||||||
panic("thread info not compiled into kernel\n");
|
panic("thread info not compiled into kernel\n");
|
||||||
thread_info_size = gtoh(tc->getVirtPort()->read<int32_t>(addr));
|
thread_info_size = vp->readGtoH<int32_t>(addr);
|
||||||
|
|
||||||
if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr))
|
if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr))
|
||||||
panic("thread info not compiled into kernel\n");
|
panic("thread info not compiled into kernel\n");
|
||||||
task_struct_size = gtoh(tc->getVirtPort()->read<int32_t>(addr));
|
task_struct_size = vp->readGtoH<int32_t>(addr);
|
||||||
|
|
||||||
if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr))
|
if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr))
|
||||||
panic("thread info not compiled into kernel\n");
|
panic("thread info not compiled into kernel\n");
|
||||||
task_off = gtoh(tc->getVirtPort()->read<int32_t>(addr));
|
task_off = vp->readGtoH<int32_t>(addr);
|
||||||
|
|
||||||
if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr))
|
if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr))
|
||||||
panic("thread info not compiled into kernel\n");
|
panic("thread info not compiled into kernel\n");
|
||||||
pid_off = gtoh(tc->getVirtPort()->read<int32_t>(addr));
|
pid_off = vp->readGtoH<int32_t>(addr);
|
||||||
|
|
||||||
if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
|
if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
|
||||||
panic("thread info not compiled into kernel\n");
|
panic("thread info not compiled into kernel\n");
|
||||||
name_off = gtoh(tc->getVirtPort()->read<int32_t>(addr));
|
name_off = vp->readGtoH<int32_t>(addr);
|
||||||
|
|
||||||
|
tc->delVirtPort(vp);
|
||||||
}
|
}
|
||||||
|
|
||||||
Addr
|
Addr
|
||||||
|
@ -75,7 +81,15 @@ ProcessInfo::task(Addr ksp) const
|
||||||
if (base == ULL(0xfffffc0000000000))
|
if (base == ULL(0xfffffc0000000000))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return gtoh(tc->getVirtPort()->read<Addr>(base + task_off));
|
Addr tsk;
|
||||||
|
|
||||||
|
VirtualPort *vp;
|
||||||
|
|
||||||
|
vp = tc->getVirtPort();
|
||||||
|
tsk = vp->readGtoH<Addr>(base + task_off);
|
||||||
|
tc->delVirtPort(vp);
|
||||||
|
|
||||||
|
return tsk;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -85,7 +99,15 @@ ProcessInfo::pid(Addr ksp) const
|
||||||
if (!task)
|
if (!task)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
return gtoh(tc->getVirtPort()->read<uint16_t>(task + pid_off));
|
uint16_t pd;
|
||||||
|
|
||||||
|
VirtualPort *vp;
|
||||||
|
|
||||||
|
vp = tc->getVirtPort();
|
||||||
|
pd = vp->readGtoH<uint16_t>(task + pid_off);
|
||||||
|
tc->delVirtPort(vp);
|
||||||
|
|
||||||
|
return pd;
|
||||||
}
|
}
|
||||||
|
|
||||||
string
|
string
|
||||||
|
|
|
@ -642,7 +642,9 @@ RemoteGDB::read(Addr vaddr, size_t size, char *data)
|
||||||
|
|
||||||
DPRINTF(GDBRead, "read: addr=%#x, size=%d", vaddr, size);
|
DPRINTF(GDBRead, "read: addr=%#x, size=%d", vaddr, size);
|
||||||
|
|
||||||
context->getVirtPort(context)->readBlob(vaddr, (uint8_t*)data, size);
|
VirtualPort *vp = context->getVirtPort(context);
|
||||||
|
vp->readBlob(vaddr, (uint8_t*)data, size);
|
||||||
|
context->delVirtPort(vp);
|
||||||
|
|
||||||
#if TRACING_ON
|
#if TRACING_ON
|
||||||
if (DTRACE(GDBRead)) {
|
if (DTRACE(GDBRead)) {
|
||||||
|
@ -679,8 +681,9 @@ RemoteGDB::write(Addr vaddr, size_t size, const char *data)
|
||||||
} else
|
} else
|
||||||
DPRINTFNR("\n");
|
DPRINTFNR("\n");
|
||||||
}
|
}
|
||||||
|
VirtualPort *vp = context->getVirtPort(context);
|
||||||
context->getVirtPort(context)->writeBlob(vaddr, (uint8_t*)data, size);
|
vp->writeBlob(vaddr, (uint8_t*)data, size);
|
||||||
|
context->delVirtPort(vp);
|
||||||
|
|
||||||
#ifdef IMB
|
#ifdef IMB
|
||||||
alpha_pal_imb();
|
alpha_pal_imb();
|
||||||
|
|
|
@ -314,9 +314,10 @@ SimpleThread::getVirtPort(ThreadContext *src_tc)
|
||||||
void
|
void
|
||||||
SimpleThread::delVirtPort(VirtualPort *vp)
|
SimpleThread::delVirtPort(VirtualPort *vp)
|
||||||
{
|
{
|
||||||
// assert(!vp->nullThreadContext());
|
if (vp != virtPort) {
|
||||||
delete vp->getPeer();
|
delete vp->getPeer();
|
||||||
delete vp;
|
delete vp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -249,6 +249,14 @@ class FunctionalPort : public Port
|
||||||
virtual void recvFunctional(Packet *pkt) { panic("FuncPort is UniDir"); }
|
virtual void recvFunctional(Packet *pkt) { panic("FuncPort is UniDir"); }
|
||||||
virtual void recvStatusChange(Status status) {}
|
virtual void recvStatusChange(Status status) {}
|
||||||
|
|
||||||
|
/** a write function that also does an endian conversion. */
|
||||||
|
template <typename T>
|
||||||
|
inline void writeHtoG(Addr addr, T d);
|
||||||
|
|
||||||
|
/** a read function that also does an endian conversion. */
|
||||||
|
template <typename T>
|
||||||
|
inline T readGtoH(Addr addr);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
inline void write(Addr addr, T d)
|
inline void write(Addr addr, T d)
|
||||||
{
|
{
|
||||||
|
|
53
src/mem/port_impl.hh
Normal file
53
src/mem/port_impl.hh
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2006 The Regents of The University of Michigan
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are
|
||||||
|
* met: redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer;
|
||||||
|
* redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution;
|
||||||
|
* neither the name of the copyright holders nor the names of its
|
||||||
|
* contributors may be used to endorse or promote products derived from
|
||||||
|
* this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* Authors: Ali Saidi
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "arch/isa_specific.hh"
|
||||||
|
#include "arch/isa_traits.hh"
|
||||||
|
#include "mem/port.hh"
|
||||||
|
#include "sim/byteswap.hh"
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void
|
||||||
|
FunctionalPort::writeHtoG(Addr addr, T d)
|
||||||
|
{
|
||||||
|
d = TheISA::htog(d);
|
||||||
|
writeBlob(addr, (uint8_t*)&d, sizeof(T));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T
|
||||||
|
FunctionalPort::readGtoH(Addr addr)
|
||||||
|
{
|
||||||
|
T d;
|
||||||
|
readBlob(addr, (uint8_t*)&d, sizeof(T));
|
||||||
|
return TheISA::gtoh(d);
|
||||||
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@
|
||||||
#ifndef __MEM_VPORT_HH__
|
#ifndef __MEM_VPORT_HH__
|
||||||
#define __MEM_VPORT_HH__
|
#define __MEM_VPORT_HH__
|
||||||
|
|
||||||
#include "mem/port.hh"
|
#include "mem/port_impl.hh"
|
||||||
#include "config/full_system.hh"
|
#include "config/full_system.hh"
|
||||||
#include "arch/vtophys.hh"
|
#include "arch/vtophys.hh"
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue