diff --git a/atrace/1.0/Android.bp b/atrace/1.0/Android.bp new file mode 100644 index 0000000000..f7c9078333 --- /dev/null +++ b/atrace/1.0/Android.bp @@ -0,0 +1,22 @@ +// This file is autogenerated by hidl-gen -Landroidbp. + +hidl_interface { + name: "android.hardware.atrace@1.0", + root: "android.hardware", + vndk: { + enabled: true, + }, + srcs: [ + "types.hal", + "IAtraceDevice.hal", + ], + interfaces: [ + "android.hidl.base@1.0", + ], + types: [ + "Status", + "TracingCategory", + ], + gen_java: true, +} + diff --git a/atrace/1.0/IAtraceDevice.hal b/atrace/1.0/IAtraceDevice.hal new file mode 100644 index 0000000000..b6e78b41dc --- /dev/null +++ b/atrace/1.0/IAtraceDevice.hal @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2018 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. + */ + +package android.hardware.atrace@1.0; + +interface IAtraceDevice { + /** + * Get vendor extended atrace points. + * + * + * @return categories of tracing points the device extended. + */ + listCategories() generates (vec categories); + + /** + * A hook when atrace set to enable specific categories, so HAL + * can enable kernel tracing points and/or notify other things + * for userspace tracing turning on. + * + * @param categories A vector of strings of categories (corresponding to + * TracingCategory.name) atrace needs to be enabled. + * + * @return status SUCCESS on success, + * ERROR_TRACING_POINT on error with enabling categories, + * ERROR_INVALID_ARGUMENT on invalid argument passed. + */ + enableCategories(vec categories) generates (Status status); + + /** + * A hook when atrace set to clean up tracing categories, so HAL + * can disable all kernel tracing points and/or notify other things + * for userspace tracing turning off. + * + * @return status SUCCESS on success, + * ERROR_TRACING_POINT on error with disabling categories. + */ + disableAllCategories() generates (Status status); +}; diff --git a/atrace/1.0/default/Android.bp b/atrace/1.0/default/Android.bp new file mode 100644 index 0000000000..bcaf064245 --- /dev/null +++ b/atrace/1.0/default/Android.bp @@ -0,0 +1,35 @@ +// +// Copyright (C) 2018 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", + defaults: ["hidl_defaults"], + relative_install_path: "hw", + vendor: true, + init_rc: ["android.hardware.atrace@1.0-service.rc"], + vintf_fragments: ["android.hardware.atrace@1.0-service.xml"], + srcs: [ + "AtraceDevice.cpp", + "service.cpp", + ], + shared_libs: [ + "liblog", + "libbase", + "libutils", + "libhidlbase", + "libhidltransport", + "android.hardware.atrace@1.0", + ], +} diff --git a/atrace/1.0/default/AtraceDevice.cpp b/atrace/1.0/default/AtraceDevice.cpp new file mode 100644 index 0000000000..43bcd9a29c --- /dev/null +++ b/atrace/1.0/default/AtraceDevice.cpp @@ -0,0 +1,110 @@ +/* + * Copyright (C) 2018 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 +#include + +#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; + std::vector> paths; +}; + +// This is a map stores categories and their sysfs paths with required flags +const std::map kTracingMap = { + // gfx + { + "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", true}}}, + }, +}; + +// Methods from ::android::hardware::atrace::V1_0::IAtraceDevice follow. +Return AtraceDevice::listCategories(listCategories_cb _hidl_cb) { + hidl_vec 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& 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 enable 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/1.0/default/AtraceDevice.h b/atrace/1.0/default/AtraceDevice.h new file mode 100644 index 0000000000..e700f89129 --- /dev/null +++ b/atrace/1.0/default/AtraceDevice.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2018 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. + */ + +#ifndef ANDROID_HARDWARE_ATRACE_V1_0_ATRACEDEVICE_H +#define ANDROID_HARDWARE_ATRACE_V1_0_ATRACEDEVICE_H + +#include +#include +#include + +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 listCategories(listCategories_cb _hidl_cb) override; + Return<::android::hardware::atrace::V1_0::Status> enableCategories( + const hidl_vec& 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 + +#endif // ANDROID_HARDWARE_ATRACE_V1_0_ATRACEDEVICE_H diff --git a/atrace/1.0/default/android.hardware.atrace@1.0-service.rc b/atrace/1.0/default/android.hardware.atrace@1.0-service.rc new file mode 100644 index 0000000000..eb54c39a61 --- /dev/null +++ b/atrace/1.0/default/android.hardware.atrace@1.0-service.rc @@ -0,0 +1,13 @@ +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 + +service vendor.atrace-hal-1-0 /vendor/bin/hw/android.hardware.atrace@1.0-service + interface android.hardware.atrace@1.0::IAtraceDevice default + class early_hal + user system + group system diff --git a/atrace/1.0/default/android.hardware.atrace@1.0-service.xml b/atrace/1.0/default/android.hardware.atrace@1.0-service.xml new file mode 100644 index 0000000000..fd3631caf5 --- /dev/null +++ b/atrace/1.0/default/android.hardware.atrace@1.0-service.xml @@ -0,0 +1,11 @@ + + + android.hardware.atrace + hwbinder + 1.0 + + IAtraceDevice + default + + + diff --git a/atrace/1.0/default/service.cpp b/atrace/1.0/default/service.cpp new file mode 100644 index 0000000000..662fd73657 --- /dev/null +++ b/atrace/1.0/default/service.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2018 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" + +#include +#include + +#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::Status; +using ::android::hardware::atrace::V1_0::TracingCategory; +using ::android::hardware::atrace::V1_0::implementation::AtraceDevice; + +int main(int /* argc */, char* /* argv */ []) { + sp 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; +} diff --git a/atrace/1.0/types.hal b/atrace/1.0/types.hal new file mode 100644 index 0000000000..f137ef6253 --- /dev/null +++ b/atrace/1.0/types.hal @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2018 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. + */ + +package android.hardware.atrace@1.0; + +enum Status : uint32_t { + /** + * Operation completed without errors. + */ + SUCCESS = 0, + /** + * Operation failed with errors on enabling tracing point. + */ + ERROR_TRACING_POINT = 1, + /** + * Operation failed because of invalid argument. + */ + ERROR_INVALID_ARGUMENT = 2 +}; + +struct TracingCategory { + /** + * Tracing category name, unique to frameworks's category. + */ + string name; + /** + * Tracing category description. + */ + string description; +}; diff --git a/atrace/1.0/vts/functional/Android.bp b/atrace/1.0/vts/functional/Android.bp new file mode 100644 index 0000000000..6b50fb5bf7 --- /dev/null +++ b/atrace/1.0/vts/functional/Android.bp @@ -0,0 +1,22 @@ +// +// Copyright (C) 2018 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_test { + name: "VtsHalAtraceV1_0TargetTest", + defaults: ["VtsHalTargetTestDefaults"], + srcs: ["VtsHalAtraceV1_0TargetTest.cpp"], + static_libs: ["android.hardware.atrace@1.0"], +} diff --git a/atrace/1.0/vts/functional/VtsHalAtraceV1_0TargetTest.cpp b/atrace/1.0/vts/functional/VtsHalAtraceV1_0TargetTest.cpp new file mode 100644 index 0000000000..c62c2f08e3 --- /dev/null +++ b/atrace/1.0/vts/functional/VtsHalAtraceV1_0TargetTest.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2018 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 + +#include + +#include +#include + +using ::android::sp; +using ::android::hardware::hidl_string; +using ::android::hardware::hidl_vec; +using ::android::hardware::Return; +using ::android::hardware::atrace::V1_0::IAtraceDevice; +using ::android::hardware::atrace::V1_0::Status; + +// Test environment for Boot HIDL HAL. +class AtraceHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { + public: + // get the test environment singleton + static AtraceHidlEnvironment* Instance() { + static AtraceHidlEnvironment* instance = new AtraceHidlEnvironment; + return instance; + } + + virtual void registerTestServices() override { registerTestService(); } + + private: + AtraceHidlEnvironment() {} +}; + +/** + * There is no expected behaviour that can be tested so these tests check the + * HAL doesn't crash with different execution orders. + */ +struct AtraceHidlTest : public ::testing::VtsHalHidlTargetTestBase { + virtual void SetUp() override { + atrace = ::testing::VtsHalHidlTargetTestBase::getService( + AtraceHidlEnvironment::Instance()->getServiceName()); + ASSERT_NE(atrace, nullptr); + } + + sp atrace; +}; + +hidl_vec getVendorCategoryName(sp atrace) { + std::unordered_set categories_set; + Return ret = atrace->listCategories([&](const auto& list) { + for (const auto& category : list) { + std::string name = category.name; + if (categories_set.count(name)) { + ADD_FAILURE() << "Duplicate category: " << name; + } else { + categories_set.emplace(name); + } + } + }); + if (!ret.isOk()) { + ADD_FAILURE(); + } + hidl_vec categories; + categories.resize(categories_set.size()); + std::size_t i = 0; + for (auto& c : categories_set) { + categories[i++] = c; + } + return categories; +} + +/* list categories from vendors. */ +TEST_F(AtraceHidlTest, listCategories) { + hidl_vec vnd_categories = getVendorCategoryName(atrace); + EXPECT_NE(0, vnd_categories.size()); +} + +/* enable categories. */ +TEST_F(AtraceHidlTest, enableCategories) { + hidl_vec vnd_categories = getVendorCategoryName(atrace); + // empty Category with ERROR_INVALID_ARGUMENT + hidl_vec empty_categories; + auto ret = atrace->enableCategories(empty_categories); + ASSERT_TRUE(ret.isOk()); + EXPECT_EQ(Status::ERROR_INVALID_ARGUMENT, ret); + // non-empty categories SUCCESS + ret = atrace->enableCategories(vnd_categories); + ASSERT_TRUE(ret.isOk()); + EXPECT_EQ(Status::SUCCESS, ret); +} + +/* enable categories. */ +TEST_F(AtraceHidlTest, disableAllCategories) { + auto ret = atrace->disableAllCategories(); + ASSERT_TRUE(ret.isOk()); + EXPECT_EQ(Status::SUCCESS, ret); +} + +int main(int argc, char** argv) { + ::testing::AddGlobalTestEnvironment(AtraceHidlEnvironment::Instance()); + ::testing::InitGoogleTest(&argc, argv); + AtraceHidlEnvironment::Instance()->init(&argc, argv); + int status = RUN_ALL_TESTS(); + ALOGI("Test result = %d", status); + return status; +} diff --git a/compatibility_matrices/compatibility_matrix.current.xml b/compatibility_matrices/compatibility_matrix.current.xml index 88d1151840..ff5b3e8d70 100644 --- a/compatibility_matrices/compatibility_matrix.current.xml +++ b/compatibility_matrices/compatibility_matrix.current.xml @@ -1,4 +1,12 @@ + + android.hardware.atrace + 1.0 + + IAtraceDevice + default + + android.hardware.audio 4.0