system.cc (11793:ef606668d247) | system.cc (12090:11d69759b378) |
---|---|
1/* 2 * Copyright (c) 2010-2013, 2016 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 --- 222 unchanged lines hidden (view full) --- 231{ 232 return new LinuxArmSystem(this); 233} 234 235void 236LinuxArmSystem::startup() 237{ 238 if (enableContextSwitchStatsDump) { | 1/* 2 * Copyright (c) 2010-2013, 2016 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 --- 222 unchanged lines hidden (view full) --- 231{ 232 return new LinuxArmSystem(this); 233} 234 235void 236LinuxArmSystem::startup() 237{ 238 if (enableContextSwitchStatsDump) { |
239 dumpStatsPCEvent = addKernelFuncEvent<DumpStatsPCEvent>("__switch_to"); | 239 if (!highestELIs64()) { 240 dumpStatsPCEvent = 241 addKernelFuncEvent<DumpStatsPCEvent>("__switch_to"); 242 } else { 243 dumpStatsPCEvent = 244 addKernelFuncEvent<DumpStatsPCEvent64>("__switch_to"); 245 } 246 |
240 if (!dumpStatsPCEvent) 241 panic("dumpStatsPCEvent not created!"); 242 243 std::string task_filename = "tasks.txt"; 244 taskFile = simout.create(name() + "." + task_filename); 245 246 for (int i = 0; i < _numContexts; i++) { 247 ThreadContext *tc = threadContexts[i]; --- 23 unchanged lines hidden (view full) --- 271} 272 273void 274LinuxArmSystem::dumpDmesg() 275{ 276 Linux::dumpDmesg(getThreadContext(0), std::cout); 277} 278 | 247 if (!dumpStatsPCEvent) 248 panic("dumpStatsPCEvent not created!"); 249 250 std::string task_filename = "tasks.txt"; 251 taskFile = simout.create(name() + "." + task_filename); 252 253 for (int i = 0; i < _numContexts; i++) { 254 ThreadContext *tc = threadContexts[i]; --- 23 unchanged lines hidden (view full) --- 278} 279 280void 281LinuxArmSystem::dumpDmesg() 282{ 283 Linux::dumpDmesg(getThreadContext(0), std::cout); 284} 285 |
279/** This function is called whenever the the kernel function 280 * "__switch_to" is called to change running tasks. | 286/** 287 * Extracts the information used by the DumpStatsPCEvent by reading the 288 * thread_info pointer passed to __switch_to() in 32 bit ARM Linux |
281 * 282 * r0 = task_struct of the previously running process | 289 * 290 * r0 = task_struct of the previously running process |
283 * r1 = task_info of the previously running process 284 * r2 = task_info of the next process to run | 291 * r1 = thread_info of the previously running process 292 * r2 = thread_info of the next process to run |
285 */ 286void | 293 */ 294void |
287DumpStatsPCEvent::process(ThreadContext *tc) 288{ | 295DumpStatsPCEvent::getTaskDetails(ThreadContext *tc, uint32_t &pid, 296 uint32_t &tgid, std::string &next_task_str, int32_t &mm) { 297 |
289 Linux::ThreadInfo ti(tc); 290 Addr task_descriptor = tc->readIntReg(2); | 298 Linux::ThreadInfo ti(tc); 299 Addr task_descriptor = tc->readIntReg(2); |
291 uint32_t pid = ti.curTaskPID(task_descriptor); 292 uint32_t tgid = ti.curTaskTGID(task_descriptor); 293 std::string next_task_str = ti.curTaskName(task_descriptor); | 300 pid = ti.curTaskPID(task_descriptor); 301 tgid = ti.curTaskTGID(task_descriptor); 302 next_task_str = ti.curTaskName(task_descriptor); |
294 295 // Streamline treats pid == -1 as the kernel process. 296 // Also pid == 0 implies idle process (except during Linux boot) | 303 304 // Streamline treats pid == -1 as the kernel process. 305 // Also pid == 0 implies idle process (except during Linux boot) |
297 int32_t mm = ti.curTaskMm(task_descriptor); | 306 mm = ti.curTaskMm(task_descriptor); 307} 308 309/** 310 * Extracts the information used by the DumpStatsPCEvent64 by reading the 311 * task_struct pointer passed to __switch_to() in 64 bit ARM Linux 312 * 313 * r0 = task_struct of the previously running process 314 * r1 = task_struct of next process to run 315 */ 316void 317DumpStatsPCEvent64::getTaskDetails(ThreadContext *tc, uint32_t &pid, 318 uint32_t &tgid, std::string &next_task_str, int32_t &mm) { 319 320 Linux::ThreadInfo ti(tc); 321 Addr task_struct = tc->readIntReg(1); 322 pid = ti.curTaskPIDFromTaskStruct(task_struct); 323 tgid = ti.curTaskTGIDFromTaskStruct(task_struct); 324 next_task_str = ti.curTaskNameFromTaskStruct(task_struct); 325 326 // Streamline treats pid == -1 as the kernel process. 327 // Also pid == 0 implies idle process (except during Linux boot) 328 mm = ti.curTaskMmFromTaskStruct(task_struct); 329} 330 331/** This function is called whenever the the kernel function 332 * "__switch_to" is called to change running tasks. 333 */ 334void 335DumpStatsPCEvent::process(ThreadContext *tc) 336{ 337 uint32_t pid = 0; 338 uint32_t tgid = 0; 339 std::string next_task_str; 340 int32_t mm = 0; 341 342 getTaskDetails(tc, pid, tgid, next_task_str, mm); 343 |
298 bool is_kernel = (mm == 0); 299 if (is_kernel && (pid != 0)) { 300 pid = -1; 301 tgid = -1; 302 next_task_str = "kernel"; 303 } 304 305 LinuxArmSystem* sys = dynamic_cast<LinuxArmSystem *>(tc->getSystemPtr()); --- 26 unchanged lines hidden --- | 344 bool is_kernel = (mm == 0); 345 if (is_kernel && (pid != 0)) { 346 pid = -1; 347 tgid = -1; 348 next_task_str = "kernel"; 349 } 350 351 LinuxArmSystem* sys = dynamic_cast<LinuxArmSystem *>(tc->getSystemPtr()); --- 26 unchanged lines hidden --- |