system.cc (9290:90dd57ca9a7e) system.cc (9332:ae2a5329ce96)
1/*
1/*
2 * Copyright (c) 2010 ARM Limited
2 * Copyright (c) 2010-2012 ARM Limited
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated

--- 28 unchanged lines hidden (view full) ---

39 *
40 * Authors: Ali Saidi
41 */
42
43#include "arch/arm/linux/atag.hh"
44#include "arch/arm/linux/system.hh"
45#include "arch/arm/isa_traits.hh"
46#include "arch/arm/utility.hh"
3 * All rights reserved
4 *
5 * The license below extends only to copyright in the software and shall
6 * not be construed as granting a license to any other intellectual
7 * property including but not limited to intellectual property relating
8 * to a hardware implementation of the functionality of the software
9 * licensed hereunder. You may use the software subject to the license
10 * terms below provided that you ensure that this notice is replicated

--- 28 unchanged lines hidden (view full) ---

39 *
40 * Authors: Ali Saidi
41 */
42
43#include "arch/arm/linux/atag.hh"
44#include "arch/arm/linux/system.hh"
45#include "arch/arm/isa_traits.hh"
46#include "arch/arm/utility.hh"
47#include "arch/generic/linux/threadinfo.hh"
47#include "base/loader/object_file.hh"
48#include "base/loader/symtab.hh"
48#include "base/loader/object_file.hh"
49#include "base/loader/symtab.hh"
50#include "cpu/base.hh"
51#include "cpu/pc_event.hh"
49#include "cpu/thread_context.hh"
50#include "debug/Loader.hh"
51#include "kern/linux/events.hh"
52#include "mem/fs_translating_port_proxy.hh"
53#include "mem/physical.hh"
52#include "cpu/thread_context.hh"
53#include "debug/Loader.hh"
54#include "kern/linux/events.hh"
55#include "mem/fs_translating_port_proxy.hh"
56#include "mem/physical.hh"
57#include "sim/stat_control.hh"
54
55using namespace ArmISA;
56using namespace Linux;
57
58LinuxArmSystem::LinuxArmSystem(Params *p)
58
59using namespace ArmISA;
60using namespace Linux;
61
62LinuxArmSystem::LinuxArmSystem(Params *p)
59 : ArmSystem(p)
63 : ArmSystem(p),
64 enableContextSwitchStatsDump(p->enable_context_switch_stats_dump)
60{
61#ifndef NDEBUG
62 kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic");
63 if (!kernelPanicEvent)
64 panic("could not find kernel symbol \'panic\'");
65#endif
66
67 // With ARM udelay() is #defined to __udelay

--- 133 unchanged lines hidden (view full) ---

201}
202
203LinuxArmSystem::~LinuxArmSystem()
204{
205 if (uDelaySkipEvent)
206 delete uDelaySkipEvent;
207 if (constUDelaySkipEvent)
208 delete constUDelaySkipEvent;
65{
66#ifndef NDEBUG
67 kernelPanicEvent = addKernelFuncEvent<BreakPCEvent>("panic");
68 if (!kernelPanicEvent)
69 panic("could not find kernel symbol \'panic\'");
70#endif
71
72 // With ARM udelay() is #defined to __udelay

--- 133 unchanged lines hidden (view full) ---

206}
207
208LinuxArmSystem::~LinuxArmSystem()
209{
210 if (uDelaySkipEvent)
211 delete uDelaySkipEvent;
212 if (constUDelaySkipEvent)
213 delete constUDelaySkipEvent;
214
215 if (dumpStatsPCEvent)
216 delete dumpStatsPCEvent;
209}
210
211LinuxArmSystem *
212LinuxArmSystemParams::create()
213{
214 return new LinuxArmSystem(this);
215}
217}
218
219LinuxArmSystem *
220LinuxArmSystemParams::create()
221{
222 return new LinuxArmSystem(this);
223}
224
225void
226LinuxArmSystem::startup()
227{
228 if (enableContextSwitchStatsDump) {
229 dumpStatsPCEvent = addKernelFuncEvent<DumpStatsPCEvent>("__switch_to");
230 if (!dumpStatsPCEvent)
231 panic("dumpStatsPCEvent not created!");
232
233 std::string task_filename = "tasks.txt";
234 taskFile = simout.create(name() + "." + task_filename);
235
236 for (int i = 0; i < _numContexts; i++) {
237 ThreadContext *tc = threadContexts[i];
238 uint32_t pid = tc->getCpuPtr()->getPid();
239 if (pid != Request::invldPid) {
240 mapPid(tc, pid);
241 tc->getCpuPtr()->taskId(taskMap[pid]);
242 }
243 }
244 }
245}
246
247void
248LinuxArmSystem::mapPid(ThreadContext *tc, uint32_t pid)
249{
250 // Create a new unique identifier for this pid
251 std::map<uint32_t, uint32_t>::iterator itr = taskMap.find(pid);
252 if (itr == taskMap.end()) {
253 uint32_t map_size = taskMap.size();
254 if (map_size > ContextSwitchTaskId::MaxNormalTaskId + 1) {
255 warn_once("Error out of identifiers for cache occupancy stats");
256 taskMap[pid] = ContextSwitchTaskId::Unknown;
257 } else {
258 taskMap[pid] = map_size;
259 }
260 }
261}
262
263/** This function is called whenever the the kernel function
264 * "__switch_to" is called to change running tasks.
265 *
266 * r0 = task_struct of the previously running process
267 * r1 = task_info of the previously running process
268 * r2 = task_info of the next process to run
269 */
270void
271DumpStatsPCEvent::process(ThreadContext *tc)
272{
273 Linux::ThreadInfo ti(tc);
274 Addr task_descriptor = tc->readIntReg(2);
275 uint32_t pid = ti.curTaskPID(task_descriptor);
276 uint32_t tgid = ti.curTaskTGID(task_descriptor);
277 std::string next_task_str = ti.curTaskName(task_descriptor);
278
279 // Streamline treats pid == -1 as the kernel process.
280 // Also pid == 0 implies idle process (except during Linux boot)
281 int32_t mm = ti.curTaskMm(task_descriptor);
282 bool is_kernel = (mm == 0);
283 if (is_kernel && (pid != 0)) {
284 pid = -1;
285 tgid = -1;
286 next_task_str = "kernel";
287 }
288
289 LinuxArmSystem* sys = dynamic_cast<LinuxArmSystem *>(tc->getSystemPtr());
290 if (!sys) {
291 panic("System is not LinuxArmSystem while getting Linux process info!");
292 }
293 std::map<uint32_t, uint32_t>& taskMap = sys->taskMap;
294
295 // Create a new unique identifier for this pid
296 sys->mapPid(tc, pid);
297
298 // Set cpu task id, output process info, and dump stats
299 tc->getCpuPtr()->taskId(taskMap[pid]);
300 tc->getCpuPtr()->setPid(pid);
301
302 std::ostream* taskFile = sys->taskFile;
303
304 // Task file is read by cache occupancy plotting script or
305 // Streamline conversion script.
306 ccprintf(*taskFile,
307 "tick=%lld %d cpu_id=%d next_pid=%d next_tgid=%d next_task=%s\n",
308 curTick(), taskMap[pid], tc->cpuId(), (int) pid, (int) tgid,
309 next_task_str);
310 taskFile->flush();
311
312 // Dump and reset statistics
313 Stats::schedStatEvent(true, true, curTick(), 0);
314}
315