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 |
|