diff options
author | Wei Wang <wvw@google.com> | 2019-05-10 15:28:42 -0700 |
---|---|---|
committer | Wei Wang <wvw@google.com> | 2019-05-16 14:06:49 -0700 |
commit | bdc01697f47f61d7bc1dc3feeede2fc4dc9a156d (patch) | |
tree | eacc44808796c1f92d7fa5607720c43292dad46c /atrace | |
parent | a1f868e78ee87bff55d10ad60f28f1e4a803043c (diff) | |
download | pixel-bdc01697f47f61d7bc1dc3feeede2fc4dc9a156d.tar.gz |
add generic Pixel atrace HAL
Bug: 110111068
Bug: 131630776
Bug: 131352179
Test: take a trace
Change-Id: Ie6d8cde30a548a3fda617f1221e4e2dda2ae29d0
Diffstat (limited to 'atrace')
-rw-r--r-- | atrace/Android.bp | 35 | ||||
-rw-r--r-- | atrace/AtraceDevice.cpp | 120 | ||||
-rw-r--r-- | atrace/AtraceDevice.h | 50 | ||||
-rw-r--r-- | atrace/android.hardware.atrace@1.0-service.pixel.rc | 19 | ||||
-rw-r--r-- | atrace/android.hardware.atrace@1.0-service.pixel.xml | 11 | ||||
-rw-r--r-- | atrace/service.cpp | 42 |
6 files changed, 277 insertions, 0 deletions
diff --git a/atrace/Android.bp b/atrace/Android.bp new file mode 100644 index 00000000..560f47b1 --- /dev/null +++ b/atrace/Android.bp @@ -0,0 +1,35 @@ +// +// 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. + +cc_binary { + name: "android.hardware.atrace@1.0-service.pixel", + defaults: ["hidl_defaults"], + relative_install_path: "hw", + vendor: true, + init_rc: ["android.hardware.atrace@1.0-service.pixel.rc"], + vintf_fragments: ["android.hardware.atrace@1.0-service.pixel.xml"], + srcs: [ + "AtraceDevice.cpp", + "service.cpp", + ], + shared_libs: [ + "liblog", + "libbase", + "libutils", + "libhidlbase", + "libhidltransport", + "android.hardware.atrace@1.0", + ], +} diff --git a/atrace/AtraceDevice.cpp b/atrace/AtraceDevice.cpp new file mode 100644 index 00000000..ba13cd21 --- /dev/null +++ b/atrace/AtraceDevice.cpp @@ -0,0 +1,120 @@ +/* + * 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 <android-base/file.h> +#include <android-base/logging.h> + +#include "AtraceDevice.h" + +namespace android { +namespace hardware { +namespace atrace { +namespace V1_0 { +namespace implementation { + +using ::android::hardware::atrace::V1_0::Status; +using ::android::hardware::atrace::V1_0::TracingCategory; + +struct TracingConfig { + std::string description; + // path and if error on failure + std::vector<std::pair<std::string, bool>> paths; +}; + +// This is a map stores categories and their sysfs paths with required flags +const std::map<std::string, TracingConfig> kTracingMap = { + { + "gfx", + {"Graphics", + {{"/sys/kernel/debug/tracing/events/mdss/enable", false}, + {"/sys/kernel/debug/tracing/events/sde/enable", false}, + {"/sys/kernel/debug/tracing/events/mali_systrace/enable", false}}}, + }, + { + "ion", + {"ION allocation", + {{"/sys/kernel/debug/tracing/events/kmem/ion_alloc_buffer_start/enable", false}}}, + }, + { + "tz", + {"Trust zone", + {{"/sys/kernel/debug/tracing/events/scm/enable", false}, + {"/sys/kernel/debug/tracing/events/systrace/enable", false}}}, + }, + { + "freq", + {"Clocks", {{"/sys/kernel/debug/tracing/events/msm_bus/enable", false}}}, + }, +}; + +// Methods from ::android::hardware::atrace::V1_0::IAtraceDevice follow. +Return<void> AtraceDevice::listCategories(listCategories_cb _hidl_cb) { + hidl_vec<TracingCategory> categories; + categories.resize(kTracingMap.size()); + std::size_t i = 0; + for (auto &c : kTracingMap) { + categories[i].name = c.first; + categories[i].description = c.second.description; + i++; + } + _hidl_cb(categories); + return Void(); +} + +Return<::android::hardware::atrace::V1_0::Status> AtraceDevice::enableCategories( + const hidl_vec<hidl_string> &categories) { + if (!categories.size()) { + return Status::ERROR_INVALID_ARGUMENT; + } + for (auto &c : categories) { + if (kTracingMap.count(c)) { + for (auto &p : kTracingMap.at(c).paths) { + if (!android::base::WriteStringToFile("1", p.first)) { + LOG(ERROR) << "Failed to disable tracing on: " << p.first; + if (p.second) { + // disable before return + disableAllCategories(); + return Status::ERROR_TRACING_POINT; + } + } + } + } else { + return Status::ERROR_INVALID_ARGUMENT; + } + } + return Status::SUCCESS; +} + +Return<::android::hardware::atrace::V1_0::Status> AtraceDevice::disableAllCategories() { + auto ret = Status::SUCCESS; + for (auto &c : kTracingMap) { + for (auto &p : c.second.paths) { + if (!android::base::WriteStringToFile("0", p.first)) { + LOG(ERROR) << "Failed to enable tracing on: " << p.first; + if (p.second) { + ret = Status::ERROR_TRACING_POINT; + } + } + } + } + return ret; +} + +} // namespace implementation +} // namespace V1_0 +} // namespace atrace +} // namespace hardware +} // namespace android diff --git a/atrace/AtraceDevice.h b/atrace/AtraceDevice.h new file mode 100644 index 00000000..a15cd6c5 --- /dev/null +++ b/atrace/AtraceDevice.h @@ -0,0 +1,50 @@ +/* + * 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. + */ + +#pragma once + +#include <android/hardware/atrace/1.0/IAtraceDevice.h> +#include <hidl/Status.h> + +namespace android { +namespace hardware { +namespace atrace { +namespace V1_0 { +namespace implementation { + +using ::android::sp; +using ::android::hardware::hidl_array; +using ::android::hardware::hidl_memory; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::Void; + +struct AtraceDevice : public IAtraceDevice { + // Methods from ::android::hardware::atrace::V1_0::IAtraceDevice follow. + Return<void> listCategories(listCategories_cb _hidl_cb) override; + Return<::android::hardware::atrace::V1_0::Status> enableCategories( + const hidl_vec<hidl_string> &categories) override; + Return<::android::hardware::atrace::V1_0::Status> disableAllCategories() override; + + // Methods from ::android::hidl::base::V1_0::IBase follow. +}; + +} // namespace implementation +} // namespace V1_0 +} // namespace atrace +} // namespace hardware +} // namespace android diff --git a/atrace/android.hardware.atrace@1.0-service.pixel.rc b/atrace/android.hardware.atrace@1.0-service.pixel.rc new file mode 100644 index 00000000..ef50fd0a --- /dev/null +++ b/atrace/android.hardware.atrace@1.0-service.pixel.rc @@ -0,0 +1,19 @@ +on late-init + # vendor graphics trace points + chmod 0666 /sys/kernel/debug/tracing/events/sde/enable + chmod 0666 /sys/kernel/debug/tracing/events/mdss/enable + chmod 0666 /sys/kernel/debug/tracing/events/mali_systrace/enable + # ion allocation trace point + chmod 0666 /sys/kernel/debug/tracing/events/kmem/ion_alloc_buffer_start/enable + # scm trace point + chmod 0666 /sys/kernel/debug/tracing/events/scm/enable + # system bus clk trace point + chmod 0666 /sys/kernel/debug/tracing/events/msm_bus/enable + # legacy systrace point + chmod 0666 /sys/kernel/debug/tracing/events/systrace/enable + +service vendor.atrace-hal-1-0 /vendor/bin/hw/android.hardware.atrace@1.0-service.pixel + interface android.hardware.atrace@1.0::IAtraceDevice default + class early_hal + user system + group system diff --git a/atrace/android.hardware.atrace@1.0-service.pixel.xml b/atrace/android.hardware.atrace@1.0-service.pixel.xml new file mode 100644 index 00000000..fd3631ca --- /dev/null +++ b/atrace/android.hardware.atrace@1.0-service.pixel.xml @@ -0,0 +1,11 @@ +<manifest version="1.0" type="device"> + <hal format="hidl"> + <name>android.hardware.atrace</name> + <transport>hwbinder</transport> + <version>1.0</version> + <interface> + <name>IAtraceDevice</name> + <instance>default</instance> + </interface> + </hal> +</manifest> diff --git a/atrace/service.cpp b/atrace/service.cpp new file mode 100644 index 00000000..423c39d0 --- /dev/null +++ b/atrace/service.cpp @@ -0,0 +1,42 @@ +/* + * 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. + */ + +#define LOG_TAG "android.hardware.atrace@1.0-service.pixel" + +#include <hidl/HidlSupport.h> +#include <hidl/HidlTransportSupport.h> + +#include "AtraceDevice.h" + +using ::android::OK; +using ::android::sp; +using ::android::hardware::configureRpcThreadpool; +using ::android::hardware::joinRpcThreadpool; +using ::android::hardware::atrace::V1_0::IAtraceDevice; +using ::android::hardware::atrace::V1_0::implementation::AtraceDevice; + +int main(int /* argc */, char * /* argv */ []) { + sp<IAtraceDevice> atrace = new AtraceDevice; + configureRpcThreadpool(1, true /* will join */); + if (atrace->registerAsService() != OK) { + ALOGE("Could not register service."); + return 1; + } + joinRpcThreadpool(); + + ALOGE("Service exited!"); + return 1; +} |