155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <stdio.h> 255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <unistd.h> 355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <stdlib.h> 455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <inttypes.h> 555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <assert.h> 655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "trace_reader.h" 755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "armdis.h" 855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "parse_options.h" 955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projecttypedef TraceReader<> TraceReaderType; 1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "parse_options-inl.h" 1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectstatic const uint32_t kOffsetThreshold = 0x100000; 1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectvoid Usage(const char *program) 1755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project{ 1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project fprintf(stderr, "Usage: %s [options] trace_file elf_file\n", program); 1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project OptionsUsage(); 2055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project} 2155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 2255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectint main(int argc, char **argv) { 2355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project // Parse the options 2455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project ParseOptions(argc, argv); 2555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project if (argc - optind != 2) { 2655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project Usage(argv[0]); 2755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project exit(1); 2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project } 2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project char *trace_filename = argv[optind++]; 3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project char *elf_file = argv[optind++]; 3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project TraceReader<> *trace = new TraceReader<>; 3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project trace->Open(trace_filename); 3455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project trace->ReadKernelSymbols(elf_file); 3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project trace->SetRoot(root); 3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project while (1) { 3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project symbol_type *sym; 3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project BBEvent event; 4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project BBEvent ignored; 4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project if (GetNextValidEvent(trace, &event, &ignored, &sym)) 4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project break; 4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project if (event.bb_num == 0) 4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project break; 4655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project //printf("t%llu bb %lld %d\n", event.time, event.bb_num, event.num_insns); 4755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project uint64_t insn_time = trace->ReadInsnTime(event.time); 4855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project if (insn_time != event.time) { 4955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project printf("time: %llu insn time: %llu bb: %llu addr: 0x%x num_insns: %d, pid: %d\n", 5055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project event.time, insn_time, event.bb_num, event.bb_addr, 5155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project event.num_insns, event.pid); 5255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project exit(1); 5355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project } 5455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project for (int ii = 1; ii < event.num_insns; ++ii) { 5555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project trace->ReadInsnTime(event.time); 5655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project } 5755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project } 5855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project 5955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project delete trace; 6055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project return 0; 6155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project} 62