MAC: Make gem5 compile and run on MacOSX 10.7.2
Adaptations to make gem5 compile and run on OSX 10.7.2, with a stock gcc 4.2.1 and the remaining dependencies from macports, i.e. python 2.7,.2 swig 2.0.4, mercurial 2.0. The changes include an adaptation of the SConstruct to handle non-library linker flags, and Darwin-specific code to find the memory usage of gem5. A number of Ruby files relied on ambigious uint (without the 32 suffix) which caused compilation errors.
This commit is contained in:
parent
4b77278287
commit
c2dbfc1d6c
10 changed files with 58 additions and 20 deletions
|
@ -663,7 +663,11 @@ if not py_getvar('Py_ENABLE_SHARED'):
|
|||
|
||||
py_libs = []
|
||||
for lib in py_getvar('LIBS').split() + py_getvar('SYSLIBS').split():
|
||||
assert lib.startswith('-l')
|
||||
if not lib.startswith('-l'):
|
||||
# Python requires some special flags to link (e.g. -framework
|
||||
# common on OS X systems), assume appending preserves order
|
||||
main.Append(LINKFLAGS=[lib])
|
||||
else:
|
||||
lib = lib[2:]
|
||||
if lib not in py_libs:
|
||||
py_libs.append(lib)
|
||||
|
|
|
@ -91,7 +91,7 @@ ElfFile('libelf_msize.c')
|
|||
|
||||
m4env = main.Clone()
|
||||
if m4env['GCC']:
|
||||
major,minor,dot = [ int(x) for x in m4env['CXXVERSION'].split('.')]
|
||||
major,minor,dot = [int(x) for x in m4env['GCC_VERSION'].split('.')]
|
||||
if major >= 4:
|
||||
m4env.Append(CCFLAGS=['-Wno-pointer-sign'])
|
||||
m4env.Append(CCFLAGS=['-Wno-implicit'])
|
||||
|
|
|
@ -30,6 +30,12 @@
|
|||
|
||||
#include <unistd.h>
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <mach/mach_init.h>
|
||||
#include <mach/shared_region.h>
|
||||
#include <mach/task.h>
|
||||
#endif
|
||||
|
||||
#include <cctype>
|
||||
#include <cerrno>
|
||||
#include <cmath>
|
||||
|
@ -86,3 +92,27 @@ procInfo(const char *filename, const char *target)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t
|
||||
memUsage()
|
||||
{
|
||||
// For the Mach-based Darwin kernel, use the task_info of the self task
|
||||
#ifdef __APPLE__
|
||||
struct task_basic_info t_info;
|
||||
mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT;
|
||||
|
||||
if (KERN_SUCCESS != task_info(mach_task_self(),
|
||||
TASK_BASIC_INFO, (task_info_t)&t_info,
|
||||
&t_info_count)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Mimic Darwin's implementation of top and subtract
|
||||
// SHARED_REGION_SIZE from the tasks virtual size to account for the
|
||||
// shared memory submap that is incorporated into every process.
|
||||
return (t_info.virtual_size - SHARED_REGION_SIZE) / 1024;
|
||||
#else
|
||||
// Linux implementation
|
||||
return procInfo("/proc/self/status", "VmSize:");
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -39,7 +39,11 @@ std::string &hostname();
|
|||
|
||||
uint64_t procInfo(const char *filename, const char *target);
|
||||
|
||||
inline uint64_t memUsage()
|
||||
{ return procInfo("/proc/self/status", "VmSize:"); }
|
||||
/**
|
||||
* Determine the simulator process' total virtual memory usage.
|
||||
*
|
||||
* @return virtual memory usage in kilobytes
|
||||
*/
|
||||
uint64_t memUsage();
|
||||
|
||||
#endif // __HOSTINFO_HH__
|
||||
|
|
|
@ -43,7 +43,7 @@ class DirectedGenerator : public SimObject
|
|||
virtual ~DirectedGenerator() {}
|
||||
|
||||
virtual bool initiate() = 0;
|
||||
virtual void performCallback(uint proc, Addr address) = 0;
|
||||
virtual void performCallback(uint32_t proc, Addr address) = 0;
|
||||
|
||||
void setDirectedTester(RubyDirectedTester* directed_tester);
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ InvalidateGenerator::initiate()
|
|||
}
|
||||
|
||||
void
|
||||
InvalidateGenerator::performCallback(uint proc, Addr address)
|
||||
InvalidateGenerator::performCallback(uint32_t proc, Addr address)
|
||||
{
|
||||
assert(m_address == address);
|
||||
|
||||
|
|
|
@ -49,14 +49,14 @@ class InvalidateGenerator : public DirectedGenerator
|
|||
~InvalidateGenerator();
|
||||
|
||||
bool initiate();
|
||||
void performCallback(uint proc, Addr address);
|
||||
void performCallback(uint32_t proc, Addr address);
|
||||
|
||||
private:
|
||||
InvalidateGeneratorStatus m_status;
|
||||
Addr m_address;
|
||||
uint m_active_read_node;
|
||||
uint m_active_inv_node;
|
||||
uint m_addr_increment_size;
|
||||
uint32_t m_active_read_node;
|
||||
uint32_t m_active_inv_node;
|
||||
uint32_t m_addr_increment_size;
|
||||
};
|
||||
|
||||
#endif //__CPU_DIRECTEDTEST_INVALIDATEGENERATOR_HH__
|
||||
|
|
|
@ -53,11 +53,11 @@ class RubyDirectedTester : public MemObject
|
|||
RubyDirectedTester *tester;
|
||||
|
||||
public:
|
||||
CpuPort(const std::string &_name, RubyDirectedTester *_tester, uint _idx)
|
||||
CpuPort(const std::string &_name, RubyDirectedTester *_tester, uint32_t _idx)
|
||||
: SimpleTimingPort(_name, _tester), tester(_tester), idx(_idx)
|
||||
{}
|
||||
|
||||
uint idx;
|
||||
uint32_t idx;
|
||||
|
||||
protected:
|
||||
virtual bool recvTiming(PacketPtr pkt);
|
||||
|
|
|
@ -89,7 +89,7 @@ SeriesRequestGenerator::initiate()
|
|||
}
|
||||
|
||||
void
|
||||
SeriesRequestGenerator::performCallback(uint proc, Addr address)
|
||||
SeriesRequestGenerator::performCallback(uint32_t proc, Addr address)
|
||||
{
|
||||
assert(m_active_node == proc);
|
||||
assert(m_address == address);
|
||||
|
|
|
@ -49,13 +49,13 @@ class SeriesRequestGenerator : public DirectedGenerator
|
|||
~SeriesRequestGenerator();
|
||||
|
||||
bool initiate();
|
||||
void performCallback(uint proc, Addr address);
|
||||
void performCallback(uint32_t proc, Addr address);
|
||||
|
||||
private:
|
||||
SeriesRequestGeneratorStatus m_status;
|
||||
Addr m_address;
|
||||
uint m_active_node;
|
||||
uint m_addr_increment_size;
|
||||
uint32_t m_active_node;
|
||||
uint32_t m_addr_increment_size;
|
||||
bool m_issue_writes;
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue