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
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);
#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"
// 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) {
// 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) {
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);
#include "base/chunk_generator.hh"
#include "mem/mem_object.hh"
+#include "mem/packet_impl.hh"
#include "sim/eventq.hh"
#include "sim/sim_object.hh"
#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!"); }
/*
- * 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
/** 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);
#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"