/* * Copyright (C) 2019 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "src/kallsyms/lazy_kernel_symbolizer.h" #include #include "perfetto/ext/base/file_utils.h" #include "perfetto/ext/base/temp_file.h" #include "test/gtest_and_gmock.h" namespace perfetto { namespace { const char kUnrestrictedKallsyms[] = R"( 0000000000000000 A fixed_percpu_data 0000000000000000 A __per_cpu_start 0000000000001000 A cpu_debug_store 0000000000002000 A irq_stack_backing_store 0000000000006000 A cpu_tss_rw 0000000000009000 A gdt_page 000000000000a000 A entry_stack_storage 000000000000b000 A exception_stacks 0000000000010000 A espfix_stack 0000000000010008 A espfix_waddr 0000000000010010 A cpu_llc_id 0000000000010020 A mce_banks_array 0000000000010220 A mce_num_banks 0000000000010228 A cpu_sibling_map 0000000000010230 A cpu_core_map 0000000000010238 A cpu_die_map 0000000000010240 A cpu_info 0000000000010330 A cpu_llc_shared_map 0000000000010338 A cpu_number 0000000000010340 A this_cpu_off 0000000000010348 A x86_cpu_to_apicid 000000000001034a A x86_bios_cpu_apicid 000000000001034c A x86_cpu_to_acpiid 0000000000010350 A sched_core_priority 0000000000011000 A svm_data 0000000000011008 A current_tsc_ratio 0000000000011010 A saved_epb 0000000000011018 A cluster_masks 0000000000011020 A x86_cpu_to_logical_apicid 0000000000011028 A ipi_mask 0000000000011030 A menu_devices 0000000000011098 A cpu_loops_per_jiffy 00000000000110a0 A cpu_hw_events 00000000000123b0 A pmc_prev_left 00000000000125b0 A perf_nmi_tstamp 0000000000013000 A bts_ctx 0000000000016000 A insn_buffer 0000000000016008 A pt_ctx 00000000000160b0 A cpu_tsc_khz 00000000000160b8 A current_vcpu 00000000000160c0 A loaded_vmcss_on_cpu 00000000000160d0 A current_vmcs 00000000000160d8 A vmxarea 00000000000160e0 A blocked_vcpu_on_cpu 00000000000160f0 A blocked_vcpu_on_cpu_lock 00000000000160f8 A irq_regs 0000000000016100 A nmi_state 0000000000016108 A nmi_cr2 0000000000016110 A update_debug_stack 0000000000016118 A last_nmi_rip 0000000000016120 A nmi_stats 0000000000016130 A swallow_nmi 0000000000016140 A vector_irq 0000000000028458 A processor_device_array 0000000000028460 A acpi_cpuidle_device 0000000000028470 A acpi_cstate 00000000000284c0 A cpufreq_thermal_reduction_pctg 00000000000284c8 A cpc_desc_ptr 00000000000284d0 A cpu_pcc_subspace_idx 00000000000284d8 A irq_randomness 00000000000284f8 A batched_entropy_u64 0000000000028540 A batched_entropy_u32 00000000000285c0 A drm_unplug_srcu_srcu_data 0000000000028740 A device_links_srcu_srcu_data 00000000000288c0 A cpu_sys_devices 00000000000288c8 A ci_cpu_cacheinfo 00000000000288e0 A ci_cache_dev 00000000000288e8 A ci_index_dev 0000000000028900 A wakeup_srcu_srcu_data 0000000000028a80 A flush_idx 0000000000028ac0 A dax_srcu_srcu_data 0000000000028c40 A cpufreq_cpu_data 0000000000028c80 A cpufreq_transition_notifier_list_head_srcu_data 0000000000028e00 A cpu_dbs 0000000000028e30 A cpuidle_devices 0000000000028e38 A cpuidle_dev 00000000000290f8 A netdev_alloc_cache 0000000000029110 A napi_alloc_cache 0000000000029330 A flush_works 0000000000029360 A bpf_redirect_info 0000000000029388 A bpf_sp 0000000000029588 A nf_skb_duplicated 000000000002958c A xt_recseq 0000000000029590 A rt_cache_stat 00000000000295b0 A tsq_tasklet 00000000000295e8 A xfrm_trans_tasklet 0000000000029628 A radix_tree_preloads 0000000000029640 A irq_stat 00000000000296c0 A cyc2ns 0000000000029700 A cpu_tlbstate 0000000000029780 A flush_tlb_info 00000000000297c0 A cpu_worker_pools 0000000000029ec0 A runqueues 000000000002aa80 A sched_clock_data 000000000002aac0 A osq_node 000000000002ab00 A qnodes 000000000002ab40 A rcu_data 000000000002ae80 A cfd_data 000000000002aec0 A call_single_queue 000000000002af00 A csd_data 000000000002af40 A softnet_data 000000000002b200 A rt_uncached_list 000000000002b240 A rt6_uncached_list 000000000002b258 A __per_cpu_end ffffffffb7e00000 T startup_64 ffffffffb7e00000 T _stext ffffffffb7e00000 T _text ffffffffb7e00030 T secondary_startup_64 ffffffffb7e000e0 T verify_cpu ffffffffb7e001e0 T start_cpu0 ffffffffb7e001f0 T __startup_64 )"; const char kRestrictedKallsyms[] = R"( 0000000000000000 A fixed_percpu_data 0000000000000000 A __per_cpu_start 0000000000000000 A cpu_debug_store 0000000000000000 A irq_stack_backing_store 0000000000000000 A cpu_tss_rw 0000000000000000 A gdt_page 0000000000000000 A entry_stack_storage 0000000000000000 A exception_stacks 0000000000000000 A espfix_stack 0000000000000000 A espfix_waddr 0000000000000000 A cpu_llc_id 0000000000000000 A mce_banks_array 0000000000000000 A mce_num_banks 0000000000000000 A cpu_sibling_map 0000000000000000 A cpu_core_map 0000000000000000 A cpu_die_map 0000000000000000 A cpu_info 0000000000000000 A cpu_llc_shared_map 0000000000000000 A cpu_number 0000000000000000 A this_cpu_off 0000000000000000 A x86_cpu_to_apicid 0000000000000000 A x86_bios_cpu_apicid 0000000000000000 A x86_cpu_to_acpiid 0000000000000000 A sched_core_priority 0000000000000000 A svm_data 0000000000000000 A current_tsc_ratio 0000000000000000 A saved_epb 0000000000000000 A cluster_masks 0000000000000000 A x86_cpu_to_logical_apicid 0000000000000000 A ipi_mask 0000000000000000 A menu_devices 0000000000000000 A cpu_loops_per_jiffy 0000000000000000 A cpu_hw_events 0000000000000000 A pmc_prev_left 0000000000000000 A perf_nmi_tstamp 0000000000000000 A bts_ctx 0000000000000000 A insn_buffer 0000000000000000 A pt_ctx 0000000000000000 A cpu_tsc_khz 0000000000000000 A current_vcpu 0000000000000000 A loaded_vmcss_on_cpu 0000000000000000 A current_vmcs 0000000000000000 A vmxarea 0000000000000000 A blocked_vcpu_on_cpu 0000000000000000 A blocked_vcpu_on_cpu_lock 0000000000000000 A irq_regs 0000000000000000 A nmi_state 0000000000000000 A nmi_cr2 0000000000000000 A update_debug_stack 0000000000000000 A last_nmi_rip 0000000000000000 A nmi_stats 0000000000000000 A swallow_nmi 0000000000000000 A vector_irq 0000000000000000 A processor_device_array 0000000000000000 A acpi_cpuidle_device 0000000000000000 A acpi_cstate 0000000000000000 A cpufreq_thermal_reduction_pctg 0000000000000000 A cpc_desc_ptr 0000000000000000 A cpu_pcc_subspace_idx 0000000000000000 A irq_randomness 0000000000000000 A batched_entropy_u64 0000000000000000 A batched_entropy_u32 0000000000000000 A drm_unplug_srcu_srcu_data 0000000000000000 A device_links_srcu_srcu_data 0000000000000000 A cpu_sys_devices 0000000000000000 A ci_cpu_cacheinfo 0000000000000000 A ci_cache_dev 0000000000000000 A ci_index_dev 0000000000000000 A wakeup_srcu_srcu_data 0000000000000000 A flush_idx 0000000000000000 A dax_srcu_srcu_data 0000000000000000 A cpufreq_cpu_data 0000000000000000 A cpufreq_transition_notifier_list_head_srcu_data 0000000000000000 A cpu_dbs 0000000000000000 A cpuidle_devices 0000000000000000 A cpuidle_dev 0000000000000000 A netdev_alloc_cache 0000000000000000 A napi_alloc_cache 0000000000000000 A flush_works 0000000000000000 A bpf_redirect_info 0000000000000000 A bpf_sp 0000000000000000 A nf_skb_duplicated 0000000000000000 A xt_recseq 0000000000000000 A rt_cache_stat 0000000000000000 A tsq_tasklet 0000000000000000 A xfrm_trans_tasklet 0000000000000000 A radix_tree_preloads 0000000000000000 A irq_stat 0000000000000000 A cyc2ns 0000000000000000 A cpu_tlbstate 0000000000000000 A flush_tlb_info 0000000000000000 A cpu_worker_pools 0000000000000000 A runqueues 0000000000000000 A sched_clock_data 0000000000000000 A osq_node 0000000000000000 A qnodes 0000000000000000 A rcu_data 0000000000000000 A cfd_data 0000000000000000 A call_single_queue 0000000000000000 A csd_data 0000000000000000 A softnet_data 0000000000000000 A rt_uncached_list 0000000000000000 A rt6_uncached_list 0000000000000000 A __per_cpu_end 0000000000000000 T startup_64 0000000000000000 T _stext 0000000000000000 T _text 0000000000000000 T secondary_startup_64 0000000000000000 T verify_cpu 0000000000000000 T start_cpu0 0000000000000000 T __startup_64 )"; TEST(LazyKernelSymbolizerTest, CanReadKernelSymbolAddresses) { { base::TempFile tmp = base::TempFile::Create(); base::WriteAll(tmp.fd(), kRestrictedKallsyms, sizeof(kRestrictedKallsyms)); base::FlushFile(tmp.fd()); EXPECT_FALSE( LazyKernelSymbolizer::CanReadKernelSymbolAddresses(tmp.path().c_str())); } { base::TempFile tmp = base::TempFile::Create(); base::WriteAll(tmp.fd(), kUnrestrictedKallsyms, sizeof(kUnrestrictedKallsyms)); base::FlushFile(tmp.fd()); EXPECT_TRUE( LazyKernelSymbolizer::CanReadKernelSymbolAddresses(tmp.path().c_str())); } } } // namespace } // namespace perfetto