py_libs = []
for lib in py_getvar('LIBS').split() + py_getvar('SYSLIBS').split():
- assert lib.startswith('-l')
- lib = lib[2:]
- if lib not in py_libs:
- py_libs.append(lib)
+ 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)
py_libs.append(py_version)
main.Append(CPPPATH=py_includes)
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'])
#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>
}
if (fp)
- fclose(fp);
+ fclose(fp);
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
+}
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__
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);
}
void
-InvalidateGenerator::performCallback(uint proc, Addr address)
+InvalidateGenerator::performCallback(uint32_t proc, Addr address)
{
assert(m_address == address);
~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__
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);
}
void
-SeriesRequestGenerator::performCallback(uint proc, Addr address)
+SeriesRequestGenerator::performCallback(uint32_t proc, Addr address)
{
assert(m_active_node == proc);
assert(m_address == address);
~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;
};