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
12
SConstruct
12
SConstruct
|
@ -663,10 +663,14 @@ if not py_getvar('Py_ENABLE_SHARED'):
|
||||||
|
|
||||||
py_libs = []
|
py_libs = []
|
||||||
for lib in py_getvar('LIBS').split() + py_getvar('SYSLIBS').split():
|
for lib in py_getvar('LIBS').split() + py_getvar('SYSLIBS').split():
|
||||||
assert lib.startswith('-l')
|
if not lib.startswith('-l'):
|
||||||
lib = lib[2:]
|
# Python requires some special flags to link (e.g. -framework
|
||||||
if lib not in py_libs:
|
# common on OS X systems), assume appending preserves order
|
||||||
py_libs.append(lib)
|
main.Append(LINKFLAGS=[lib])
|
||||||
|
else:
|
||||||
|
lib = lib[2:]
|
||||||
|
if lib not in py_libs:
|
||||||
|
py_libs.append(lib)
|
||||||
py_libs.append(py_version)
|
py_libs.append(py_version)
|
||||||
|
|
||||||
main.Append(CPPPATH=py_includes)
|
main.Append(CPPPATH=py_includes)
|
||||||
|
|
|
@ -91,7 +91,7 @@ ElfFile('libelf_msize.c')
|
||||||
|
|
||||||
m4env = main.Clone()
|
m4env = main.Clone()
|
||||||
if m4env['GCC']:
|
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:
|
if major >= 4:
|
||||||
m4env.Append(CCFLAGS=['-Wno-pointer-sign'])
|
m4env.Append(CCFLAGS=['-Wno-pointer-sign'])
|
||||||
m4env.Append(CCFLAGS=['-Wno-implicit'])
|
m4env.Append(CCFLAGS=['-Wno-implicit'])
|
||||||
|
|
|
@ -30,6 +30,12 @@
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#ifdef __APPLE__
|
||||||
|
#include <mach/mach_init.h>
|
||||||
|
#include <mach/shared_region.h>
|
||||||
|
#include <mach/task.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <cctype>
|
#include <cctype>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
@ -82,7 +88,31 @@ procInfo(const char *filename, const char *target)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fp)
|
if (fp)
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
|
|
||||||
return 0;
|
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);
|
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__
|
#endif // __HOSTINFO_HH__
|
||||||
|
|
|
@ -43,7 +43,7 @@ class DirectedGenerator : public SimObject
|
||||||
virtual ~DirectedGenerator() {}
|
virtual ~DirectedGenerator() {}
|
||||||
|
|
||||||
virtual bool initiate() = 0;
|
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);
|
void setDirectedTester(RubyDirectedTester* directed_tester);
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ InvalidateGenerator::initiate()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
InvalidateGenerator::performCallback(uint proc, Addr address)
|
InvalidateGenerator::performCallback(uint32_t proc, Addr address)
|
||||||
{
|
{
|
||||||
assert(m_address == address);
|
assert(m_address == address);
|
||||||
|
|
||||||
|
|
|
@ -49,14 +49,14 @@ class InvalidateGenerator : public DirectedGenerator
|
||||||
~InvalidateGenerator();
|
~InvalidateGenerator();
|
||||||
|
|
||||||
bool initiate();
|
bool initiate();
|
||||||
void performCallback(uint proc, Addr address);
|
void performCallback(uint32_t proc, Addr address);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
InvalidateGeneratorStatus m_status;
|
InvalidateGeneratorStatus m_status;
|
||||||
Addr m_address;
|
Addr m_address;
|
||||||
uint m_active_read_node;
|
uint32_t m_active_read_node;
|
||||||
uint m_active_inv_node;
|
uint32_t m_active_inv_node;
|
||||||
uint m_addr_increment_size;
|
uint32_t m_addr_increment_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__CPU_DIRECTEDTEST_INVALIDATEGENERATOR_HH__
|
#endif //__CPU_DIRECTEDTEST_INVALIDATEGENERATOR_HH__
|
||||||
|
|
|
@ -53,11 +53,11 @@ class RubyDirectedTester : public MemObject
|
||||||
RubyDirectedTester *tester;
|
RubyDirectedTester *tester;
|
||||||
|
|
||||||
public:
|
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)
|
: SimpleTimingPort(_name, _tester), tester(_tester), idx(_idx)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
uint idx;
|
uint32_t idx;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool recvTiming(PacketPtr pkt);
|
virtual bool recvTiming(PacketPtr pkt);
|
||||||
|
|
|
@ -89,7 +89,7 @@ SeriesRequestGenerator::initiate()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
SeriesRequestGenerator::performCallback(uint proc, Addr address)
|
SeriesRequestGenerator::performCallback(uint32_t proc, Addr address)
|
||||||
{
|
{
|
||||||
assert(m_active_node == proc);
|
assert(m_active_node == proc);
|
||||||
assert(m_address == address);
|
assert(m_address == address);
|
||||||
|
|
|
@ -49,13 +49,13 @@ class SeriesRequestGenerator : public DirectedGenerator
|
||||||
~SeriesRequestGenerator();
|
~SeriesRequestGenerator();
|
||||||
|
|
||||||
bool initiate();
|
bool initiate();
|
||||||
void performCallback(uint proc, Addr address);
|
void performCallback(uint32_t proc, Addr address);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SeriesRequestGeneratorStatus m_status;
|
SeriesRequestGeneratorStatus m_status;
|
||||||
Addr m_address;
|
Addr m_address;
|
||||||
uint m_active_node;
|
uint32_t m_active_node;
|
||||||
uint m_addr_increment_size;
|
uint32_t m_addr_increment_size;
|
||||||
bool m_issue_writes;
|
bool m_issue_writes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue