From 8a9d270f6c17efa79f38e629c7cbcafa51aa8494 Mon Sep 17 00:00:00 2001 From: Ali Saidi Date: Mon, 1 May 2006 18:53:28 -0400 Subject: [PATCH] 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 --- arch/sparc/regfile.hh | 11 +++++- cpu/simple/cpu.cc | 8 ++--- dev/io_device.hh | 1 + mem/packet.cc | 56 +++++++++++++++++++++++++++++ mem/packet.hh | 82 ++++++------------------------------------- mem/physical.cc | 1 + 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()); + data = data_read_pkt->get(); } 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()); + data = data_read_pkt->get(); } 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 - 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 - 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 - 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 - T get() { - assert(staticData || dynamicData); - assert(sizeof(T) <= size); - return *(T*)data; - } + T get(); /** get a pointer to the data ptr. */ template - T* getPtr() { - assert(staticData || dynamicData); - return (T*)data; - } - + T* getPtr(); /** set the value in the data pointer to v. */ template - 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" -- 2.30.2