diff options
author | Yabin Cui <yabinc@google.com> | 2021-05-13 17:03:14 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2021-05-13 17:03:14 +0000 |
commit | 16508f8394b00afb72e14aaa5447db976ca3207e (patch) | |
tree | 23dc405e6144f3693d16c98a13d525ecde1f3740 | |
parent | b3b2ea7ecbd1e449850959b3e57f746f3445d8f7 (diff) | |
parent | f886c89e6e196cd0c3cd49231841625f20c0f791 (diff) | |
download | extras-16508f8394b00afb72e14aaa5447db976ca3207e.tar.gz |
Merge "simpleperf: move kernel_start_addr into Binary msg."
-rw-r--r-- | simpleperf/cmd_inject.cpp | 19 | ||||
-rw-r--r-- | simpleperf/etm_branch_list.proto | 15 |
2 files changed, 23 insertions, 11 deletions
diff --git a/simpleperf/cmd_inject.cpp b/simpleperf/cmd_inject.cpp index 36332c95..d90bd517 100644 --- a/simpleperf/cmd_inject.cpp +++ b/simpleperf/cmd_inject.cpp @@ -360,7 +360,9 @@ class InjectCommand : public Command { auto branch_map = BuildBranchMap(binary_proto); if (dso_p->type() == DSO_KERNEL) { - ModifyBranchMapForKernel(branch_list_proto, dso_p, branch_map); + if (!ModifyBranchMapForKernel(binary_proto, dso_p, branch_map)) { + return false; + } } if (auto result = ConvertBranchMapToInstrRanges(dso_p, branch_map, callback); !result.ok()) { @@ -386,11 +388,15 @@ class InjectCommand : public Command { return branch_map; } - void ModifyBranchMapForKernel(const proto::ETMBranchList& branch_list_proto, Dso* dso, + bool ModifyBranchMapForKernel(const proto::ETMBranchList_Binary& binary_proto, Dso* dso, BranchMap& branch_map) { - uint64_t kernel_map_start_addr = branch_list_proto.kernel_start_addr(); + if (!binary_proto.has_kernel_info()) { + LOG(ERROR) << "no kernel info"; + return false; + } + uint64_t kernel_map_start_addr = binary_proto.kernel_info().kernel_start_addr(); if (kernel_map_start_addr == 0) { - return; + return true; } // Addresses are still kernel ip addrs in memory. Need to convert them to vaddrs in vmlinux. BranchMap new_branch_map; @@ -399,6 +405,7 @@ class InjectCommand : public Command { new_branch_map[vaddr_in_file] = std::move(p.second); } branch_map = std::move(new_branch_map); + return true; } bool WriteOutput() { @@ -534,11 +541,11 @@ class InjectCommand : public Command { if (dso->GetDebugFilePath() == dso->Path()) { // vmlinux isn't available. We still use kernel ip addr. Put kernel start addr in proto // for address conversion later. - branch_list_proto.set_kernel_start_addr(kernel_map_start_addr_); + binary_proto->mutable_kernel_info()->set_kernel_start_addr(kernel_map_start_addr_); } else { // vmlinux is available. We have converted kernel ip addr to vaddr in vmlinux. So no need // to put kernel start addr in proto. - branch_list_proto.set_kernel_start_addr(0); + binary_proto->mutable_kernel_info()->set_kernel_start_addr(0); } } } diff --git a/simpleperf/etm_branch_list.proto b/simpleperf/etm_branch_list.proto index 396f7525..c66b0d5e 100644 --- a/simpleperf/etm_branch_list.proto +++ b/simpleperf/etm_branch_list.proto @@ -47,15 +47,20 @@ message ETMBranchList { KERNEL_MODULE = 2; } BinaryType type = 4; + + message KernelBinaryInfo { + // kernel_start_addr is used to convert kernel ip address to vaddr in vmlinux. + // If it is zero, the Address in KERNEL binary has been converted to vaddr. Otherwise, + // the Address in KERNEL binary is still ip address, and need to be converted later. + uint64 kernel_start_addr = 1; + } + + KernelBinaryInfo kernel_info = 5; + } // Used to identify format in generated proto files. // Should always be "simpleperf:EtmBranchList". string magic = 1; repeated Binary binaries = 2; - - // kernel_start_addr is used to convert kernel ip address to vaddr in vmlinux. - // If it is zero, the Address in KERNEL binary has been converted to vaddr. - // Otherwise, the Address in KERNEL binary is still ip address, and need to be converted later. - uint64 kernel_start_addr = 3; } |