diff options
| author | 2023-01-18 03:03:34 +0000 | |
|---|---|---|
| committer | 2023-01-18 03:03:34 +0000 | |
| commit | 6a63d3b8134738177f84eb62cb0cb900927599db (patch) | |
| tree | 89c62c2c33b7c63fe60c381864b88bc87dfff944 | |
| parent | 21a99283b21e58c9eeb63800c6670c0060c5363b (diff) | |
| parent | 760147acdb503c4b5d10056e9a97b92c5b5aff90 (diff) | |
Merge "libbinder: Add binderRpcTestService for Trusty" am: a754657354 am: 637054bcee am: 760147acdb
Original change: https://android-review.googlesource.com/c/platform/frameworks/native/+/2168913
Change-Id: I5ffd90aa7e59330711dc283ebcfb6c1e22a5d5d5
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
| -rw-r--r-- | libs/binder/Android.bp | 52 | ||||
| -rw-r--r-- | libs/binder/tests/Android.bp | 24 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcTest.cpp | 10 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcTestCommon.cpp | 2 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcTestCommon.h | 144 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcTestService.cpp | 69 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcTestServiceTrusty.cpp | 107 | ||||
| -rw-r--r-- | libs/binder/tests/binderRpcUniversalTests.cpp | 2 | ||||
| -rw-r--r-- | libs/binder/trusty/binderRpcTest/aidl/rules.mk | 30 | ||||
| -rw-r--r-- | libs/binder/trusty/binderRpcTest/service/manifest.json | 10 | ||||
| -rw-r--r-- | libs/binder/trusty/binderRpcTest/service/rules.mk | 33 | ||||
| -rw-r--r-- | libs/binder/trusty/include/binder/RpcServerTrusty.h | 5 | ||||
| -rw-r--r-- | libs/binder/trusty/include_mock/lib/tipc/tipc.h | 29 | ||||
| -rw-r--r-- | libs/binder/trusty/include_mock/lk/err_ptr.h | 19 | ||||
| -rw-r--r-- | libs/binder/trusty/include_mock/trusty_ipc.h | 3 | ||||
| -rw-r--r-- | libs/binder/trusty/rules.mk | 5 | ||||
| -rw-r--r-- | libs/binder/trusty/usertests-inc.mk | 17 |
17 files changed, 463 insertions, 98 deletions
diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index 6bf7049fae..19445d15d2 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -195,18 +195,25 @@ cc_defaults { ], } -cc_library_shared { - name: "libbinder_on_trusty_mock", - defaults: ["libbinder_common_defaults"], +cc_library_headers { + name: "trusty_mock_headers", + host_supported: true, - srcs: [ - // Trusty-specific files - "trusty/logging.cpp", - "trusty/OS.cpp", - "trusty/RpcServerTrusty.cpp", - "trusty/RpcTransportTipcTrusty.cpp", - "trusty/TrustyStatus.cpp", - "trusty/socket.cpp", + export_include_dirs: [ + "trusty/include", + "trusty/include_mock", + ], + + visibility: [ + ":__subpackages__", + ], +} + +cc_defaults { + name: "trusty_mock_defaults", + + header_libs: [ + "trusty_mock_headers", ], cflags: [ @@ -227,16 +234,29 @@ cc_library_shared { ], rtti: false, - local_include_dirs: [ - "trusty/include", - "trusty/include_mock", - ], - visibility: [ ":__subpackages__", ], } +cc_library_shared { + name: "libbinder_on_trusty_mock", + defaults: [ + "libbinder_common_defaults", + "trusty_mock_defaults", + ], + + srcs: [ + // Trusty-specific files + "trusty/logging.cpp", + "trusty/OS.cpp", + "trusty/RpcServerTrusty.cpp", + "trusty/RpcTransportTipcTrusty.cpp", + "trusty/TrustyStatus.cpp", + "trusty/socket.cpp", + ], +} + cc_defaults { name: "libbinder_kernel_defaults", srcs: [ diff --git a/libs/binder/tests/Android.bp b/libs/binder/tests/Android.bp index 5db3187320..bab4e73a4c 100644 --- a/libs/binder/tests/Android.bp +++ b/libs/binder/tests/Android.bp @@ -336,6 +336,29 @@ cc_test { ], } +cc_binary { + name: "binderRpcTestService_on_trusty_mock", + defaults: [ + "trusty_mock_defaults", + ], + + srcs: [ + "binderRpcTestCommon.cpp", + "binderRpcTestServiceTrusty.cpp", + ], + + shared_libs: [ + "libbinder_on_trusty_mock", + "libbase", + "libutils", + "libcutils", + ], + + static_libs: [ + "binderRpcTestIface-cpp", + ], +} + cc_test { name: "binderRpcTest", defaults: [ @@ -347,6 +370,7 @@ cc_test { // Add the Trusty mock library as a fake dependency so it gets built required: [ "libbinder_on_trusty_mock", + "binderRpcTestService_on_trusty_mock", ], } diff --git a/libs/binder/tests/binderRpcTest.cpp b/libs/binder/tests/binderRpcTest.cpp index 8afa49b911..9be5b879d4 100644 --- a/libs/binder/tests/binderRpcTest.cpp +++ b/libs/binder/tests/binderRpcTest.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include <aidl/IBinderRpcTest.h> #include <android-base/stringprintf.h> #include <chrono> @@ -1100,15 +1101,6 @@ static std::vector<SocketType> testSocketTypes(bool hasPreconnected = true) { return ret; } -static std::vector<uint32_t> testVersions() { - std::vector<uint32_t> versions; - for (size_t i = 0; i < RPC_WIRE_PROTOCOL_VERSION_NEXT; i++) { - versions.push_back(i); - } - versions.push_back(RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL); - return versions; -} - INSTANTIATE_TEST_CASE_P(PerSocket, BinderRpc, ::testing::Combine(::testing::ValuesIn(testSocketTypes()), ::testing::ValuesIn(RpcSecurityValues()), diff --git a/libs/binder/tests/binderRpcTestCommon.cpp b/libs/binder/tests/binderRpcTestCommon.cpp index 0d9aa952eb..fe9a5a1af7 100644 --- a/libs/binder/tests/binderRpcTestCommon.cpp +++ b/libs/binder/tests/binderRpcTestCommon.cpp @@ -19,6 +19,6 @@ namespace android { std::atomic<int32_t> MyBinderRpcSession::gNum; -sp<IBinder> MyBinderRpcTest::mHeldBinder; +sp<IBinder> MyBinderRpcTestBase::mHeldBinder; } // namespace android diff --git a/libs/binder/tests/binderRpcTestCommon.h b/libs/binder/tests/binderRpcTestCommon.h index 654e16c3be..262d7e4570 100644 --- a/libs/binder/tests/binderRpcTestCommon.h +++ b/libs/binder/tests/binderRpcTestCommon.h @@ -22,37 +22,42 @@ #include <BnBinderRpcCallback.h> #include <BnBinderRpcSession.h> #include <BnBinderRpcTest.h> -#include <aidl/IBinderRpcTest.h> -#include <android-base/file.h> -#include <android-base/logging.h> -#include <android-base/properties.h> -#include <android/binder_auto_utils.h> -#include <android/binder_libbinder.h> +#include <android-base/stringprintf.h> #include <binder/Binder.h> #include <binder/BpBinder.h> #include <binder/IPCThreadState.h> #include <binder/IServiceManager.h> -#include <binder/ProcessState.h> #include <binder/RpcServer.h> #include <binder/RpcSession.h> #include <binder/RpcThreads.h> -#include <binder/RpcTlsTestUtils.h> -#include <binder/RpcTlsUtils.h> #include <binder/RpcTransport.h> #include <binder/RpcTransportRaw.h> -#include <binder/RpcTransportTls.h> #include <unistd.h> +#include <cinttypes> #include <string> #include <vector> +#ifndef __TRUSTY__ +#include <android-base/file.h> +#include <android-base/logging.h> +#include <android-base/properties.h> +#include <android/binder_auto_utils.h> +#include <android/binder_libbinder.h> +#include <binder/ProcessState.h> +#include <binder/RpcTlsTestUtils.h> +#include <binder/RpcTlsUtils.h> +#include <binder/RpcTransportTls.h> + #include <signal.h> -#include "../BuildFlags.h" -#include "../FdTrigger.h" #include "../OS.h" // for testing UnixBootstrap clients #include "../RpcSocketAddress.h" // for testing preconnected clients -#include "../RpcState.h" // for debugging #include "../vm_sockets.h" // for VMADDR_* +#endif // __TRUSTY__ + +#include "../BuildFlags.h" +#include "../FdTrigger.h" +#include "../RpcState.h" // for debugging #include "utils/Errors.h" namespace android { @@ -65,6 +70,19 @@ static inline std::vector<RpcSecurity> RpcSecurityValues() { return {RpcSecurity::RAW, RpcSecurity::TLS}; } +static inline std::vector<uint32_t> testVersions() { + std::vector<uint32_t> versions; + for (size_t i = 0; i < RPC_WIRE_PROTOCOL_VERSION_NEXT; i++) { + versions.push_back(i); + } + versions.push_back(RPC_WIRE_PROTOCOL_VERSION_EXPERIMENTAL); + return versions; +} + +static inline std::string trustyIpcPort(uint32_t serverVersion) { + return base::StringPrintf("com.android.trusty.binderRpcTestService.V%" PRIu32, serverVersion); +} + enum class SocketType { PRECONNECTED, UNIX, @@ -118,6 +136,7 @@ struct BinderRpcOptions { bool allowConnectFailure = false; }; +#ifndef __TRUSTY__ static inline void writeString(android::base::borrowed_fd fd, std::string_view str) { uint64_t length = str.length(); CHECK(android::base::WriteFully(fd, &length, sizeof(length))); @@ -182,6 +201,7 @@ static inline base::unique_fd mockFileDescriptor(std::string contents) { }).detach(); return readFd; } +#endif // __TRUSTY__ // A threadsafe channel where writes block until the value is read. template <typename T> @@ -252,9 +272,12 @@ public: std::vector<std::string> mValues; }; -class MyBinderRpcTest : public BnBinderRpcTest { +// Base class for all concrete implementations of MyBinderRpcTest. +// Sub-classes that want to provide a full implementation should derive +// from this class instead of MyBinderRpcTestDefault below so the compiler +// checks that all methods are implemented. +class MyBinderRpcTestBase : public BnBinderRpcTest { public: - wp<RpcServer> server; int port = 0; Status sendString(const std::string& str) override { @@ -269,18 +292,6 @@ public: *out = port; return Status::ok(); } - Status countBinders(std::vector<int32_t>* out) override { - sp<RpcServer> spServer = server.promote(); - if (spServer == nullptr) { - return Status::fromExceptionCode(Status::EX_NULL_POINTER); - } - out->clear(); - for (auto session : spServer->listSessions()) { - size_t count = session->state()->countBinders(); - out->push_back(count); - } - return Status::ok(); - } Status getNullBinder(sp<IBinder>* out) override { out->clear(); return Status::ok(); @@ -381,62 +392,55 @@ public: return doCallback(callback, oneway, delayed, value); } - Status die(bool cleanup) override { - if (cleanup) { - exit(1); - } else { - _exit(1); - } - } - - Status scheduleShutdown() override { - sp<RpcServer> strongServer = server.promote(); - if (strongServer == nullptr) { +protected: + // Generic version of countBinders that works with both + // RpcServer and RpcServerTrusty + template <typename T> + Status countBindersImpl(const wp<T>& server, std::vector<int32_t>* out) { + sp<T> spServer = server.promote(); + if (spServer == nullptr) { return Status::fromExceptionCode(Status::EX_NULL_POINTER); } - RpcMaybeThread([=] { - LOG_ALWAYS_FATAL_IF(!strongServer->shutdown(), "Could not shutdown"); - }).detach(); - return Status::ok(); - } - - Status useKernelBinderCallingId() override { - // this is WRONG! It does not make sense when using RPC binder, and - // because it is SO wrong, and so much code calls this, it should abort! - - if constexpr (kEnableKernelIpc) { - (void)IPCThreadState::self()->getCallingPid(); + out->clear(); + for (auto session : spServer->listSessions()) { + size_t count = session->state()->countBinders(); + out->push_back(count); } return Status::ok(); } +}; - Status echoAsFile(const std::string& content, android::os::ParcelFileDescriptor* out) override { - out->reset(mockFileDescriptor(content)); - return Status::ok(); +// Default implementation of MyBinderRpcTest that can be used as-is +// or derived from by classes that only want to implement a subset of +// the unimplemented methods +class MyBinderRpcTestDefault : public MyBinderRpcTestBase { +public: + Status countBinders(std::vector<int32_t>* /*out*/) override { + return Status::fromStatusT(UNKNOWN_TRANSACTION); } - Status concatFiles(const std::vector<android::os::ParcelFileDescriptor>& files, - android::os::ParcelFileDescriptor* out) override { - std::string acc; - for (const auto& file : files) { - std::string result; - CHECK(android::base::ReadFdToString(file.get(), &result)); - acc.append(result); - } - out->reset(mockFileDescriptor(acc)); - return Status::ok(); + Status die(bool /*cleanup*/) override { return Status::fromStatusT(UNKNOWN_TRANSACTION); } + + Status scheduleShutdown() override { return Status::fromStatusT(UNKNOWN_TRANSACTION); } + + Status useKernelBinderCallingId() override { return Status::fromStatusT(UNKNOWN_TRANSACTION); } + + Status echoAsFile(const std::string& /*content*/, + android::os::ParcelFileDescriptor* /*out*/) override { + return Status::fromStatusT(UNKNOWN_TRANSACTION); } - HandoffChannel<android::base::unique_fd> mFdChannel; + Status concatFiles(const std::vector<android::os::ParcelFileDescriptor>& /*files*/, + android::os::ParcelFileDescriptor* /*out*/) override { + return Status::fromStatusT(UNKNOWN_TRANSACTION); + } - Status blockingSendFdOneway(const android::os::ParcelFileDescriptor& fd) override { - mFdChannel.write(android::base::unique_fd(fcntl(fd.get(), F_DUPFD_CLOEXEC, 0))); - return Status::ok(); + Status blockingSendFdOneway(const android::os::ParcelFileDescriptor& /*fd*/) override { + return Status::fromStatusT(UNKNOWN_TRANSACTION); } - Status blockingRecvFd(android::os::ParcelFileDescriptor* fd) override { - fd->reset(mFdChannel.read()); - return Status::ok(); + Status blockingRecvFd(android::os::ParcelFileDescriptor* /*fd*/) override { + return Status::fromStatusT(UNKNOWN_TRANSACTION); } }; diff --git a/libs/binder/tests/binderRpcTestService.cpp b/libs/binder/tests/binderRpcTestService.cpp index cc9726ba6f..714f0636f9 100644 --- a/libs/binder/tests/binderRpcTestService.cpp +++ b/libs/binder/tests/binderRpcTestService.cpp @@ -18,6 +18,73 @@ using namespace android; +class MyBinderRpcTestAndroid : public MyBinderRpcTestBase { +public: + wp<RpcServer> server; + + Status countBinders(std::vector<int32_t>* out) override { + return countBindersImpl(server, out); + } + + Status die(bool cleanup) override { + if (cleanup) { + exit(1); + } else { + _exit(1); + } + } + + Status scheduleShutdown() override { + sp<RpcServer> strongServer = server.promote(); + if (strongServer == nullptr) { + return Status::fromExceptionCode(Status::EX_NULL_POINTER); + } + RpcMaybeThread([=] { + LOG_ALWAYS_FATAL_IF(!strongServer->shutdown(), "Could not shutdown"); + }).detach(); + return Status::ok(); + } + + Status useKernelBinderCallingId() override { + // this is WRONG! It does not make sense when using RPC binder, and + // because it is SO wrong, and so much code calls this, it should abort! + + if constexpr (kEnableKernelIpc) { + (void)IPCThreadState::self()->getCallingPid(); + } + return Status::ok(); + } + + Status echoAsFile(const std::string& content, android::os::ParcelFileDescriptor* out) override { + out->reset(mockFileDescriptor(content)); + return Status::ok(); + } + + Status concatFiles(const std::vector<android::os::ParcelFileDescriptor>& files, + android::os::ParcelFileDescriptor* out) override { + std::string acc; + for (const auto& file : files) { + std::string result; + CHECK(android::base::ReadFdToString(file.get(), &result)); + acc.append(result); + } + out->reset(mockFileDescriptor(acc)); + return Status::ok(); + } + + HandoffChannel<android::base::unique_fd> mFdChannel; + + Status blockingSendFdOneway(const android::os::ParcelFileDescriptor& fd) override { + mFdChannel.write(android::base::unique_fd(fcntl(fd.get(), F_DUPFD_CLOEXEC, 0))); + return Status::ok(); + } + + Status blockingRecvFd(android::os::ParcelFileDescriptor* fd) override { + fd->reset(mFdChannel.read()); + return Status::ok(); + } +}; + int main(int argc, const char* argv[]) { LOG_ALWAYS_FATAL_IF(argc != 3, "Invalid number of arguments: %d", argc); base::unique_fd writeEnd(atoi(argv[1])); @@ -88,7 +155,7 @@ int main(int argc, const char* argv[]) { // sizeof(sa_family_t)==2 in addrlen CHECK_GE(len, sizeof(sa_family_t)); const sockaddr* addr = reinterpret_cast<const sockaddr*>(addrPtr); - sp<MyBinderRpcTest> service = sp<MyBinderRpcTest>::make(); + sp<MyBinderRpcTestAndroid> service = sp<MyBinderRpcTestAndroid>::make(); switch (addr->sa_family) { case AF_UNIX: // nothing to save diff --git a/libs/binder/tests/binderRpcTestServiceTrusty.cpp b/libs/binder/tests/binderRpcTestServiceTrusty.cpp new file mode 100644 index 0000000000..85573895e9 --- /dev/null +++ b/libs/binder/tests/binderRpcTestServiceTrusty.cpp @@ -0,0 +1,107 @@ +/* + * Copyright (C) 2022 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 TLOG_TAG "binderRpcTestService" + +#include <android-base/stringprintf.h> +#include <binder/RpcServerTrusty.h> +#include <inttypes.h> +#include <lib/tipc/tipc.h> +#include <lk/err_ptr.h> +#include <stdio.h> +#include <trusty_log.h> +#include <vector> + +#include "binderRpcTestCommon.h" + +using namespace android; +using android::base::StringPrintf; +using binder::Status; + +static int gConnectionCounter = 0; + +class MyBinderRpcTestTrusty : public MyBinderRpcTestDefault { +public: + wp<RpcServerTrusty> server; + + Status countBinders(std::vector<int32_t>* out) override { + return countBindersImpl(server, out); + } + + Status scheduleShutdown() override { + // TODO: Trusty does not support shutting down the tipc event loop, + // so we just terminate the service app since it is marked + // restart_on_exit + exit(EXIT_SUCCESS); + } + + // TODO(b/242940548): implement echoAsFile and concatFiles +}; + +struct ServerInfo { + std::unique_ptr<std::string> port; + sp<RpcServerTrusty> server; +}; + +int main(void) { + TLOGI("Starting service\n"); + + tipc_hset* hset = tipc_hset_create(); + if (IS_ERR(hset)) { + TLOGE("Failed to create handle set (%d)\n", PTR_ERR(hset)); + return EXIT_FAILURE; + } + + const auto port_acl = RpcServerTrusty::PortAcl{ + .flags = IPC_PORT_ALLOW_NS_CONNECT | IPC_PORT_ALLOW_TA_CONNECT, + }; + + std::vector<ServerInfo> servers; + for (auto serverVersion : testVersions()) { + ServerInfo serverInfo{ + .port = std::make_unique<std::string>(trustyIpcPort(serverVersion)), + }; + TLOGI("Adding service port '%s'\n", serverInfo.port->c_str()); + + // Message size needs to be large enough to cover all messages sent by the + // tests: SendAndGetResultBackBig sends two large strings. + constexpr size_t max_msg_size = 4096; + auto serverOrErr = + RpcServerTrusty::make(hset, serverInfo.port->c_str(), + std::shared_ptr<const RpcServerTrusty::PortAcl>(&port_acl), + max_msg_size); + if (!serverOrErr.ok()) { + TLOGE("Failed to create RpcServer (%d)\n", serverOrErr.error()); + return EXIT_FAILURE; + } + + auto server = std::move(*serverOrErr); + serverInfo.server = server; + serverInfo.server->setProtocolVersion(serverVersion); + serverInfo.server->setPerSessionRootObject([=](const void* /*addrPtr*/, size_t /*len*/) { + auto service = sp<MyBinderRpcTestTrusty>::make(); + // Assign a unique connection identifier to service->port so + // getClientPort returns a unique value per connection + service->port = ++gConnectionCounter; + service->server = server; + return service; + }); + + servers.push_back(std::move(serverInfo)); + } + + return tipc_run_event_loop(hset); +} diff --git a/libs/binder/tests/binderRpcUniversalTests.cpp b/libs/binder/tests/binderRpcUniversalTests.cpp index f960442859..9cd8a829c0 100644 --- a/libs/binder/tests/binderRpcUniversalTests.cpp +++ b/libs/binder/tests/binderRpcUniversalTests.cpp @@ -327,7 +327,7 @@ TEST_P(BinderRpc, NestedTransactions) { {RpcSession::FileDescriptorTransportMode::UNIX}, }); - auto nastyNester = sp<MyBinderRpcTest>::make(); + auto nastyNester = sp<MyBinderRpcTestDefault>::make(); EXPECT_OK(proc.rootIface->nestMe(nastyNester, 10)); wp<IBinder> weak = nastyNester; diff --git a/libs/binder/trusty/binderRpcTest/aidl/rules.mk b/libs/binder/trusty/binderRpcTest/aidl/rules.mk new file mode 100644 index 0000000000..1afd32487a --- /dev/null +++ b/libs/binder/trusty/binderRpcTest/aidl/rules.mk @@ -0,0 +1,30 @@ +# Copyright (C) 2022 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. +# + +LOCAL_DIR := $(GET_LOCAL_DIR) +LIBBINDER_TESTS_DIR := frameworks/native/libs/binder/tests + +MODULE := $(LOCAL_DIR) + +MODULE_AIDLS := \ + $(LIBBINDER_TESTS_DIR)/BinderRpcTestClientInfo.aidl \ + $(LIBBINDER_TESTS_DIR)/BinderRpcTestServerConfig.aidl \ + $(LIBBINDER_TESTS_DIR)/BinderRpcTestServerInfo.aidl \ + $(LIBBINDER_TESTS_DIR)/IBinderRpcCallback.aidl \ + $(LIBBINDER_TESTS_DIR)/IBinderRpcSession.aidl \ + $(LIBBINDER_TESTS_DIR)/IBinderRpcTest.aidl \ + $(LIBBINDER_TESTS_DIR)/ParcelableCertificateData.aidl \ + +include make/aidl.mk diff --git a/libs/binder/trusty/binderRpcTest/service/manifest.json b/libs/binder/trusty/binderRpcTest/service/manifest.json new file mode 100644 index 0000000000..1c4f7ee0d1 --- /dev/null +++ b/libs/binder/trusty/binderRpcTest/service/manifest.json @@ -0,0 +1,10 @@ +{ + "uuid": "87e424e5-69d7-4bbd-8b7c-7e24812cbc94", + "app_name": "binderRpcTestService", + "min_heap": 65536, + "min_stack": 16384, + "mgmt_flags": { + "restart_on_exit": true, + "non_critical_app": true + } +} diff --git a/libs/binder/trusty/binderRpcTest/service/rules.mk b/libs/binder/trusty/binderRpcTest/service/rules.mk new file mode 100644 index 0000000000..5d1a51dca2 --- /dev/null +++ b/libs/binder/trusty/binderRpcTest/service/rules.mk @@ -0,0 +1,33 @@ +# Copyright (C) 2022 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. +# + +LOCAL_DIR := $(GET_LOCAL_DIR) +LIBBINDER_TESTS_DIR := frameworks/native/libs/binder/tests + +MODULE := $(LOCAL_DIR) + +MANIFEST := $(LOCAL_DIR)/manifest.json + +MODULE_SRCS := \ + $(LIBBINDER_TESTS_DIR)/binderRpcTestCommon.cpp \ + $(LIBBINDER_TESTS_DIR)/binderRpcTestServiceTrusty.cpp \ + +MODULE_LIBRARY_DEPS := \ + frameworks/native/libs/binder/trusty \ + frameworks/native/libs/binder/trusty/binderRpcTest/aidl \ + trusty/user/base/lib/libstdc++-trusty \ + trusty/user/base/lib/tipc \ + +include make/trusted_app.mk diff --git a/libs/binder/trusty/include/binder/RpcServerTrusty.h b/libs/binder/trusty/include/binder/RpcServerTrusty.h index 7d9dd8c648..6678eb8fec 100644 --- a/libs/binder/trusty/include/binder/RpcServerTrusty.h +++ b/libs/binder/trusty/include/binder/RpcServerTrusty.h @@ -71,6 +71,11 @@ public: } sp<IBinder> getRootObject() { return mRpcServer->getRootObject(); } + /** + * For debugging! + */ + std::vector<sp<RpcSession>> listSessions() { return mRpcServer->listSessions(); } + private: // Both this class and RpcServer have multiple non-copyable fields, // including mPortAcl below which can't be copied because mUuidPtrs diff --git a/libs/binder/trusty/include_mock/lib/tipc/tipc.h b/libs/binder/trusty/include_mock/lib/tipc/tipc.h new file mode 100644 index 0000000000..f295be4980 --- /dev/null +++ b/libs/binder/trusty/include_mock/lib/tipc/tipc.h @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2022 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 + +__BEGIN_DECLS + +struct tipc_hset; + +struct tipc_hset* tipc_hset_create(void) { + return nullptr; +} +int tipc_run_event_loop(struct tipc_hset*) { + return 0; +} + +__END_DECLS diff --git a/libs/binder/trusty/include_mock/lk/err_ptr.h b/libs/binder/trusty/include_mock/lk/err_ptr.h new file mode 100644 index 0000000000..ab3fbbacf6 --- /dev/null +++ b/libs/binder/trusty/include_mock/lk/err_ptr.h @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2022 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 + +#define IS_ERR(x) (!(x)) +#define PTR_ERR(x) (!!(x)) diff --git a/libs/binder/trusty/include_mock/trusty_ipc.h b/libs/binder/trusty/include_mock/trusty_ipc.h index a2170cea64..43ab84a424 100644 --- a/libs/binder/trusty/include_mock/trusty_ipc.h +++ b/libs/binder/trusty/include_mock/trusty_ipc.h @@ -24,6 +24,9 @@ #define INFINITE_TIME 1 #define IPC_MAX_MSG_HANDLES 8 +#define IPC_PORT_ALLOW_TA_CONNECT 0x1 +#define IPC_PORT_ALLOW_NS_CONNECT 0x2 + #define IPC_HANDLE_POLL_HUP 0x1 #define IPC_HANDLE_POLL_MSG 0x2 #define IPC_HANDLE_POLL_SEND_UNBLOCKED 0x4 diff --git a/libs/binder/trusty/rules.mk b/libs/binder/trusty/rules.mk index 4e5cd18726..42db29a2ef 100644 --- a/libs/binder/trusty/rules.mk +++ b/libs/binder/trusty/rules.mk @@ -79,6 +79,11 @@ MODULE_EXPORT_COMPILEFLAGS += \ -DBINDER_RPC_SINGLE_THREADED \ -D__ANDROID_VNDK__ \ +# libbinder has some deprecated declarations that we want to produce warnings +# not errors +MODULE_EXPORT_COMPILEFLAGS += \ + -Wno-error=deprecated-declarations \ + MODULE_LIBRARY_DEPS += \ trusty/user/base/lib/libstdc++-trusty \ trusty/user/base/lib/tipc \ diff --git a/libs/binder/trusty/usertests-inc.mk b/libs/binder/trusty/usertests-inc.mk new file mode 100644 index 0000000000..2f5a7f479b --- /dev/null +++ b/libs/binder/trusty/usertests-inc.mk @@ -0,0 +1,17 @@ +# Copyright (C) 2022 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. +# + +TRUSTY_USER_TESTS += \ + frameworks/native/libs/binder/trusty/binderRpcTest/service \ |