summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli Saidi <saidi@eecs.umich.edu>2006-05-01 18:53:28 -0400
committerAli Saidi <saidi@eecs.umich.edu>2006-05-01 18:53:28 -0400
commit8a9d270f6c17efa79f38e629c7cbcafa51aa8494 (patch)
tree75bbf24f940af2b8bf6fe00d42c56b1715bdf07b
parenta8fbc4ec76169a6d735817df2aa8bc2085df5ac8 (diff)
downloadgem5-8a9d270f6c17efa79f38e629c7cbcafa51aa8494.tar.xz
move code from packet.hh to packet.cc and packet_impl.hh
fix very annoying not-compiler bug arch/sparc/regfile.hh: You have not included an out-of-class definition of your static members. See [9.4.2]/4 and about a billion gcc bug reports. If statements get around the problem through some magic, and than seems nicer that putting a definition of them in a c file somewhere. cpu/simple/cpu.cc: get() and set() do the conversion now dev/io_device.hh: need get() and set() defentions in all the devices mem/packet.cc: mem/packet.hh: move code from packet.hh to packet.cc mem/physical.cc: packet_impl needed for templated packet functions --HG-- extra : convert_revision : 6c11842aa928d9af7b4cabe826306fe1fe09e693
-rw-r--r--arch/sparc/regfile.hh11
-rw-r--r--cpu/simple/cpu.cc8
-rw-r--r--dev/io_device.hh1
-rw-r--r--mem/packet.cc56
-rw-r--r--mem/packet.hh82
-rw-r--r--mem/physical.cc1
6 files changed, 83 insertions, 76 deletions
diff --git a/arch/sparc/regfile.hh b/arch/sparc/regfile.hh
index 744d51771..5169a332f 100644
--- a/arch/sparc/regfile.hh
+++ b/arch/sparc/regfile.hh
@@ -140,7 +140,16 @@ namespace SparcISA
DPRINTF(Sparc, "Now using %s globals",
useAlt ? "alternate" : "regular");
regView[Globals] = useAlt ? altGlobals : regGlobals;
- offset[Globals] = useAlt ? AltGlobalOffset : RegGlobalOffset;
+
+ // You have not included an out-of-class definition of your static
+ // members. See [9.4.2]/4 and about a billion gcc bug reports. If
+ // statements get around the problem through some magic, and than
+ // seems nicer that putting a definition of them in a c file
+ // somewhere.
+ if (useAlt)
+ offset[Globals] = AltGlobalOffset;
+ else
+ offset[Globals] = RegGlobalOffset;
}
void serialize(std::ostream &os);
diff --git a/cpu/simple/cpu.cc b/cpu/simple/cpu.cc
index be34d1791..33fe63c26 100644
--- a/cpu/simple/cpu.cc
+++ b/cpu/simple/cpu.cc
@@ -54,6 +54,7 @@
#include "cpu/smt.hh"
#include "cpu/static_inst.hh"
#include "kern/kernel_stats.hh"
+#include "mem/packet_impl.hh"
#include "sim/byteswap.hh"
#include "sim/builder.hh"
#include "sim/debug.hh"
@@ -480,7 +481,7 @@ SimpleCPU::read(Addr addr, T &data, unsigned flags)
// Fault fault = xc->read(memReq,data);
// Not sure what to check for no fault...
if (data_read_pkt->result == Success) {
- data = gtoh(data_read_pkt->get<T>());
+ data = data_read_pkt->get<T>();
}
if (traceData) {
@@ -523,7 +524,7 @@ SimpleCPU::read(Addr addr, T &data, unsigned flags)
// Need to find a way to not duplicate code above.
if (data_read_pkt->result == Success) {
- data = gtoh(data_read_pkt->get<T>());
+ data = data_read_pkt->get<T>();
}
if (traceData) {
@@ -627,9 +628,8 @@ SimpleCPU::write(T data, Addr addr, unsigned flags, uint64_t *res)
data_write_pkt = new Packet;
data_write_pkt->cmd = Write;
data_write_pkt->req = data_write_req;
- T hostData = htog(data);
data_write_pkt->allocate();
- data_write_pkt->set(hostData);
+ data_write_pkt->set(data);
#else
data_write_pkt->reset();
data = htog(data);
diff --git a/dev/io_device.hh b/dev/io_device.hh
index 1f4ef4b6e..e492ccf0b 100644
--- a/dev/io_device.hh
+++ b/dev/io_device.hh
@@ -31,6 +31,7 @@
#include "base/chunk_generator.hh"
#include "mem/mem_object.hh"
+#include "mem/packet_impl.hh"
#include "sim/eventq.hh"
#include "sim/sim_object.hh"
diff --git a/mem/packet.cc b/mem/packet.cc
index 85b76919b..ecd2a7be1 100644
--- a/mem/packet.cc
+++ b/mem/packet.cc
@@ -34,5 +34,61 @@
#include "base/misc.hh"
#include "mem/packet.hh"
+
+/** delete the data pointed to in the data pointer. Ok to call to matter how
+ * data was allocted. */
+void
+Packet::deleteData() {
+ assert(staticData || dynamicData);
+ if (staticData)
+ return;
+
+ if (arrayData)
+ delete [] data;
+ else
+ delete data;
+}
+
+/** If there isn't data in the packet, allocate some. */
+void
+Packet::allocate() {
+ if (data)
+ return;
+ assert(!staticData);
+ dynamicData = true;
+ arrayData = true;
+ data = new uint8_t[size];
+}
+
+/** Do the packet modify the same addresses. */
+bool
+Packet::intersect(Packet *p) {
+ Addr s1 = addr;
+ Addr e1 = addr + size;
+ Addr s2 = p->addr;
+ Addr e2 = p->addr + p->size;
+
+ if (s1 >= s2 && s1 < e2)
+ return true;
+ if (e1 >= s2 && e1 < e2)
+ return true;
+ return false;
+}
+
+/** Minimally reset a packet so something like simple cpu can reuse it. */
+void
+Packet::reset() {
+ result = Unknown;
+ if (dynamicData) {
+ deleteData();
+ dynamicData = false;
+ arrayData = false;
+ time = curTick;
+ }
+}
+
+
+
+
bool fixPacket(Packet &func, Packet &timing)
{ panic("Need to implement!"); }
diff --git a/mem/packet.hh b/mem/packet.hh
index a5bd6bc59..69d00675d 100644
--- a/mem/packet.hh
+++ b/mem/packet.hh
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2003 The Regents of The University of Michigan
+ * Copyright (c) 2006 The Regents of The University of Michigan
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -150,102 +150,42 @@ struct Packet
/** Minimally reset a packet so something like simple cpu can reuse it. */
- void reset() {
- result = Unknown;
- if (dynamicData) {
- deleteData();
- dynamicData = false;
- arrayData = false;
- time = curTick;
- }
- }
+ void reset();
/** Set the data pointer to the following value that should not be freed. */
template <typename T>
- void dataStatic(T *p) {
- assert(!dynamicData);
- data = (PacketDataPtr)p;
- staticData = true;
- }
+ void dataStatic(T *p);
/** Set the data pointer to a value that should have delete [] called on it.
*/
template <typename T>
- void dataDynamicArray(T *p) {
- assert(!staticData && !dynamicData);
- data = (PacketDataPtr)p;
- dynamicData = true;
- arrayData = true;
- }
+ void dataDynamicArray(T *p);
/** set the data pointer to a value that should have delete called on it. */
template <typename T>
- void dataDynamic(T *p) {
- assert(!staticData && !dynamicData);
- data = (PacketDataPtr)p;
- dynamicData = true;
- arrayData = false;
- }
+ void dataDynamic(T *p);
/** return the value of what is pointed to in the packet. */
template <typename T>
- T get() {
- assert(staticData || dynamicData);
- assert(sizeof(T) <= size);
- return *(T*)data;
- }
+ T get();
/** get a pointer to the data ptr. */
template <typename T>
- T* getPtr() {
- assert(staticData || dynamicData);
- return (T*)data;
- }
-
+ T* getPtr();
/** set the value in the data pointer to v. */
template <typename T>
- void set(T v) {
- assert(sizeof(T) <= size);
- *(T*)data = v;
- }
+ void set(T v);
/** delete the data pointed to in the data pointer. Ok to call to matter how
* data was allocted. */
- void deleteData() {
- assert(staticData || dynamicData);
- if (staticData)
- return;
-
- if (arrayData)
- delete [] data;
- else
- delete data;
- }
+ void deleteData();
/** If there isn't data in the packet, allocate some. */
- void allocate() {
- if (data)
- return;
- assert(!staticData);
- dynamicData = true;
- arrayData = true;
- data = new uint8_t[size];
- }
+ void allocate();
/** Do the packet modify the same addresses. */
- bool intersect(Packet *p) {
- Addr s1 = addr;
- Addr e1 = addr + size;
- Addr s2 = p->addr;
- Addr e2 = p->addr + p->size;
-
- if (s1 >= s2 && s1 < e2)
- return true;
- if (e1 >= s2 && e1 < e2)
- return true;
- return false;
- }
+ bool intersect(Packet *p);
};
bool fixPacket(Packet &func, Packet &timing);
diff --git a/mem/physical.cc b/mem/physical.cc
index fd304e63b..a9cefc70b 100644
--- a/mem/physical.cc
+++ b/mem/physical.cc
@@ -40,6 +40,7 @@
#include "base/misc.hh"
#include "config/full_system.hh"
+#include "mem/packet_impl.hh"
#include "mem/physical.hh"
#include "sim/host.hh"
#include "sim/builder.hh"