summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorRon Dreslinski <rdreslin@umich.edu>2004-11-17 09:54:38 -0500
committerRon Dreslinski <rdreslin@umich.edu>2004-11-17 09:54:38 -0500
commitf9ff53241f607e87d903f0d6b956db8d4cfab14b (patch)
treea2122d7583153e3bbcc47435cbd5319ef9189d0f /base
parentec636ed43f3bb96b5413214948372661519e296c (diff)
parent7da367d5ddba0cd72fbd351de3479c90b9e91b8c (diff)
downloadgem5-f9ff53241f607e87d903f0d6b956db8d4cfab14b.tar.xz
Merge zizzer:/z/m5/Bitkeeper/m5
into zazzer.eecs.umich.edu:/z/rdreslin/m5bk/clean --HG-- extra : convert_revision : a64b84993c8852b19b1572c6913bf3dc6f6fc249
Diffstat (limited to 'base')
-rw-r--r--base/callback.hh7
-rw-r--r--base/inet.hh4
-rw-r--r--base/loader/symtab.cc44
-rw-r--r--base/loader/symtab.hh31
4 files changed, 46 insertions, 40 deletions
diff --git a/base/callback.hh b/base/callback.hh
index 342ab7e0f..cc2a2f429 100644
--- a/base/callback.hh
+++ b/base/callback.hh
@@ -32,7 +32,7 @@
#include <list>
/**
- * Generic callback class. This base class provides a virutal process
+ * Generic callback class. This base class provides a virtual process
* function that gets called when the callback queue is processed.
*/
class Callback
@@ -103,6 +103,8 @@ class CallbackQueue
}
};
+/// Helper template class to turn a simple class member function into
+/// a callback.
template <class T, void (T::* F)()>
class MakeCallback : public Callback
{
@@ -111,8 +113,9 @@ class MakeCallback : public Callback
public:
MakeCallback(T *o)
- : object(o)
+ : object(o)
{ }
+
void process() { (object->*F)(); }
};
diff --git a/base/inet.hh b/base/inet.hh
index 10b782a6c..4f3857a15 100644
--- a/base/inet.hh
+++ b/base/inet.hh
@@ -348,9 +348,9 @@ struct UdpHdr : public udp_hdr
uint16_t sport() const { return ntohs(uh_sport); }
uint16_t dport() const { return ntohs(uh_dport); }
uint16_t len() const { return ntohs(uh_ulen); }
- uint16_t sum() const { return ntohs(uh_sum); }
+ uint16_t sum() const { return uh_sum; }
- void sum(uint16_t sum) { uh_sum = htons(sum); }
+ void sum(uint16_t sum) { uh_sum = sum; }
int size() const { return sizeof(udp_hdr); }
const uint8_t *bytes() const { return (const uint8_t *)this; }
diff --git a/base/loader/symtab.cc b/base/loader/symtab.cc
index f6abf7e3d..2a29a8575 100644
--- a/base/loader/symtab.cc
+++ b/base/loader/symtab.cc
@@ -38,6 +38,8 @@
using namespace std;
+SymbolTable *debugSymbolTable = NULL;
+
bool
SymbolTable::insert(Addr address, string symbol)
{
@@ -95,26 +97,20 @@ SymbolTable::load(const string &filename)
}
bool
-SymbolTable::findNearestSymbol(Addr address, string &symbol) const
+SymbolTable::findNearestSymbol(Addr address, string &symbol,
+ Addr &sym_address, Addr &next_sym_address) const
{
- ATable::const_iterator i = addrTable.lower_bound(address);
-
- // check for PALCode
- if (address & 0x1)
- return false;
+ // find first key *larger* than desired address
+ ATable::const_iterator i = addrTable.upper_bound(address);
- // first check for the end
- if (i == addrTable.end())
- i--;
- else if (i == addrTable.begin() && (*i).first != address)
+ // if very first key is larger, we're out of luck
+ if (i == addrTable.begin())
return false;
- else if ((*i).first != address)
- i--;
-
- symbol = (*i).second;
- if (address != (*i).first)
- symbol += csprintf("+%d", address - (*i).first);
+ next_sym_address = i->first;
+ --i;
+ sym_address = i->first;
+ symbol = i->second;
return true;
}
@@ -140,19 +136,3 @@ SymbolTable::findAddress(const string &symbol, Addr &address) const
address = (*i).second;
return true;
}
-
-string
-SymbolTable::find(Addr addr) const
-{
- string s;
- findSymbol(addr, s);
- return s;
-}
-
-Addr
-SymbolTable::find(const string &symbol) const
-{
- Addr a = 0;
- findAddress(symbol, a);
- return a;
-}
diff --git a/base/loader/symtab.hh b/base/loader/symtab.hh
index 48230c7a2..5ae29b057 100644
--- a/base/loader/symtab.hh
+++ b/base/loader/symtab.hh
@@ -49,12 +49,35 @@ class SymbolTable
bool insert(Addr address, std::string symbol);
bool load(const std::string &file);
- bool findNearestSymbol(Addr address, std::string &symbol) const;
+ /// Find the nearest symbol equal to or less than the supplied
+ /// address (e.g., the label for the enclosing function).
+ /// @param address The address to look up.
+ /// @param symbol Return reference for symbol string.
+ /// @param sym_address Return reference for symbol address.
+ /// @param next_sym_address Address of following symbol (for
+ /// determining valid range of symbol).
+ /// @retval True if a symbol was found.
+ bool findNearestSymbol(Addr address, std::string &symbol,
+ Addr &sym_address, Addr &next_sym_address) const;
+
+ /// Overload for findNearestSymbol() for callers who don't care
+ /// about next_sym_address.
+ bool findNearestSymbol(Addr address, std::string &symbol,
+ Addr &sym_address) const
+ {
+ Addr dummy;
+ return findNearestSymbol(address, symbol, sym_address, dummy);
+ }
+
+
bool findSymbol(Addr address, std::string &symbol) const;
bool findAddress(const std::string &symbol, Addr &address) const;
-
- std::string find(Addr addr) const;
- Addr find(const std::string &symbol) const;
};
+/// Global unified debugging symbol table (for target). Conceptually
+/// there should be one of these per System object for full system,
+/// and per Process object for non-full-system, but so far one big
+/// global one has worked well enough.
+extern SymbolTable *debugSymbolTable;
+
#endif // __SYMTAB_HH__