diff options
-rw-r--r-- | libs/binder/Android.bp | 4 | ||||
-rw-r--r-- | libs/binder/liblog_stub/Android.bp | 44 | ||||
-rw-r--r-- | libs/binder/liblog_stub/include/android/log.h | 49 | ||||
-rw-r--r-- | libs/binder/liblog_stub/include/log/log.h | 89 | ||||
-rw-r--r-- | libs/binder/trusty/OS.cpp | 44 | ||||
-rw-r--r-- | libs/binder/trusty/binderRpcTest/service/manifest.json | 2 | ||||
-rw-r--r-- | libs/binder/trusty/include/log/log.h | 122 | ||||
-rw-r--r-- | libs/binder/trusty/include_mock/trusty_log.h | 3 | ||||
-rw-r--r-- | libs/binder/trusty/kernel/rules.mk | 2 | ||||
-rw-r--r-- | libs/binder/trusty/rules.mk | 2 |
10 files changed, 235 insertions, 126 deletions
diff --git a/libs/binder/Android.bp b/libs/binder/Android.bp index 90c9ff838d..f1cc5f05ec 100644 --- a/libs/binder/Android.bp +++ b/libs/binder/Android.bp @@ -217,6 +217,7 @@ cc_defaults { host_supported: true, header_libs: [ + "liblog_stub", "trusty_mock_headers", ], @@ -262,9 +263,6 @@ cc_library_shared { "trusty/TrustyStatus.cpp", "trusty/socket.cpp", ], - shared_libs: [ - "liblog", - ], } cc_defaults { diff --git a/libs/binder/liblog_stub/Android.bp b/libs/binder/liblog_stub/Android.bp new file mode 100644 index 0000000000..f2ca22fdb0 --- /dev/null +++ b/libs/binder/liblog_stub/Android.bp @@ -0,0 +1,44 @@ +// Copyright (C) 2023 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 { + // See: http://go/android-license-faq + // A large-scale-change added 'default_applicable_licenses' to import + // all of the 'license_kinds' from "frameworks_native_license" + // to get the below license kinds: + // SPDX-license-identifier-Apache-2.0 + default_applicable_licenses: ["frameworks_native_license"], +} + +cc_library_headers { + name: "liblog_stub", + export_include_dirs: ["include"], + + host_supported: true, + native_bridge_supported: true, + product_available: true, + recovery_available: true, + vendor_available: true, + + target: { + windows: { + enabled: true, + }, + }, + + visibility: [ + "//frameworks/native/libs/binder:__subpackages__", + "//system/core/libutils/binder", + ], +} diff --git a/libs/binder/liblog_stub/include/android/log.h b/libs/binder/liblog_stub/include/android/log.h new file mode 100644 index 0000000000..9dcd9262db --- /dev/null +++ b/libs/binder/liblog_stub/include/android/log.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2023 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 + +extern "C" { + +/** + * Android log priority values, in increasing order of priority. + */ +typedef enum android_LogPriority { + /** For internal use only. */ + ANDROID_LOG_UNKNOWN = 0, + /** The default priority, for internal use only. */ + ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */ + /** Verbose logging. Should typically be disabled for a release apk. */ + ANDROID_LOG_VERBOSE, + /** Debug logging. Should typically be disabled for a release apk. */ + ANDROID_LOG_DEBUG, + /** Informational logging. Should typically be disabled for a release apk. */ + ANDROID_LOG_INFO, + /** Warning logging. For use with recoverable failures. */ + ANDROID_LOG_WARN, + /** Error logging. For use with unrecoverable failures. */ + ANDROID_LOG_ERROR, + /** Fatal logging. For use when aborting. */ + ANDROID_LOG_FATAL, + /** For internal use only. */ + ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */ +} android_LogPriority; + +typedef void (*__android_logger_function)(const struct __android_log_message* log_message); +inline void __android_log_set_logger(__android_logger_function) {} +inline void __android_log_stderr_logger(const struct __android_log_message*) {} + +} // extern "C" diff --git a/libs/binder/liblog_stub/include/log/log.h b/libs/binder/liblog_stub/include/log/log.h new file mode 100644 index 0000000000..3b656076b3 --- /dev/null +++ b/libs/binder/liblog_stub/include/log/log.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2023 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 <cstdio> +#include <cstdlib> + +#include <android/log.h> + +extern "C" { + +#ifndef ANDROID_LOG_STUB_MIN_PRIORITY +#define ANDROID_LOG_STUB_MIN_PRIORITY ANDROID_LOG_INFO +#endif + +#ifndef LOG_TAG +#define LOG_TAG "" +#endif + +constexpr bool __android_log_stub_is_loggable(android_LogPriority priority) { + return ANDROID_LOG_STUB_MIN_PRIORITY <= priority; +} + +int __android_log_print(int prio, const char* tag, const char* fmt, ...) + __attribute__((format(printf, 3, 4))) +#ifdef ANDROID_LOG_STUB_WEAK_PRINT + __attribute__((weak)) +#endif + ; + +#define IF_ALOG(priority, tag) \ + if (__android_log_stub_is_loggable(ANDROID_##priority) && __android_log_print) +#define IF_ALOGV() IF_ALOG(LOG_VERBOSE, LOG_TAG) +#define IF_ALOGD() IF_ALOG(LOG_DEBUG, LOG_TAG) +#define IF_ALOGI() IF_ALOG(LOG_INFO, LOG_TAG) +#define IF_ALOGW() IF_ALOG(LOG_WARN, LOG_TAG) +#define IF_ALOGE() IF_ALOG(LOG_ERROR, LOG_TAG) + +#define ALOG(priority, tag, fmt, ...) \ + do { \ + if (false)[[/*VERY*/ unlikely]] { /* ignore unused __VA_ARGS__ */ \ + std::fprintf(stderr, fmt __VA_OPT__(, ) __VA_ARGS__); \ + } \ + IF_ALOG(priority, tag) { \ + __android_log_print(ANDROID_##priority, tag, \ + tag ": " fmt "\n" __VA_OPT__(, ) __VA_ARGS__); \ + } \ + if constexpr (ANDROID_##priority == ANDROID_LOG_FATAL) std::abort(); \ + } while (false) +#define ALOGV(...) ALOG(LOG_VERBOSE, LOG_TAG, __VA_ARGS__) +#define ALOGD(...) ALOG(LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define ALOGI(...) ALOG(LOG_INFO, LOG_TAG, __VA_ARGS__) +#define ALOGW(...) ALOG(LOG_WARN, LOG_TAG, __VA_ARGS__) +#define ALOGE(...) ALOG(LOG_ERROR, LOG_TAG, __VA_ARGS__) +#define LOG_FATAL(...) ALOG(LOG_FATAL, LOG_TAG, __VA_ARGS__) +#define LOG_ALWAYS_FATAL LOG_FATAL + +#define ALOG_IF(cond, priority, tag, ...) \ + if (cond) [[unlikely]] \ + ALOG(priority, tag, #cond ": " __VA_ARGS__) +#define ALOGV_IF(cond, ...) ALOG_IF(cond, LOG_VERBOSE, LOG_TAG, __VA_ARGS__) +#define ALOGD_IF(cond, ...) ALOG_IF(cond, LOG_DEBUG, LOG_TAG, __VA_ARGS__) +#define ALOGI_IF(cond, ...) ALOG_IF(cond, LOG_INFO, LOG_TAG, __VA_ARGS__) +#define ALOGW_IF(cond, ...) ALOG_IF(cond, LOG_WARN, LOG_TAG, __VA_ARGS__) +#define ALOGE_IF(cond, ...) ALOG_IF(cond, LOG_ERROR, LOG_TAG, __VA_ARGS__) +#define LOG_FATAL_IF(cond, ...) ALOG_IF(cond, LOG_FATAL, LOG_TAG, __VA_ARGS__) +#define LOG_ALWAYS_FATAL_IF LOG_FATAL_IF +#define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ##__VA_ARGS__) + +inline int android_errorWriteLog(int tag, const char* subTag) { + ALOGE("android_errorWriteLog(%x, %s)", tag, subTag); + return 0; +} + +} // extern "C" diff --git a/libs/binder/trusty/OS.cpp b/libs/binder/trusty/OS.cpp index 99da1ebc6d..9869bf3460 100644 --- a/libs/binder/trusty/OS.cpp +++ b/libs/binder/trusty/OS.cpp @@ -22,10 +22,14 @@ #endif #include <binder/RpcTransportTipcTrusty.h> +#include <log/log.h> +#include <trusty_log.h> #include "../OS.h" #include "TrustyStatus.h" +#include <cstdarg> + using android::binder::borrowed_fd; using android::binder::unique_fd; @@ -87,3 +91,43 @@ ssize_t receiveMessageFromSocket( } } // namespace android::binder::os + +int __android_log_print(int prio [[maybe_unused]], const char* tag, const char* fmt, ...) { +#ifdef TRUSTY_USERSPACE +#define trusty_tlog _tlog +#define trusty_vtlog _vtlog +#else + // mapping taken from kernel trusty_log.h (TLOGx) + int kernelLogLevel; + if (prio <= ANDROID_LOG_DEBUG) { + kernelLogLevel = LK_DEBUGLEVEL_ALWAYS; + } else if (prio == ANDROID_LOG_INFO) { + kernelLogLevel = LK_DEBUGLEVEL_SPEW; + } else if (prio == ANDROID_LOG_WARN) { + kernelLogLevel = LK_DEBUGLEVEL_INFO; + } else if (prio == ANDROID_LOG_ERROR) { + kernelLogLevel = LK_DEBUGLEVEL_CRITICAL; + } else { /* prio >= ANDROID_LOG_FATAL */ + kernelLogLevel = LK_DEBUGLEVEL_CRITICAL; + } +#if LK_DEBUGLEVEL_NO_ALIASES + auto LK_DEBUGLEVEL_kernelLogLevel = kernelLogLevel; +#endif + +#define trusty_tlog(...) _tlog(kernelLogLevel, __VA_ARGS__) +#define trusty_vtlog(...) _vtlog(kernelLogLevel, __VA_ARGS__) +#endif + + va_list args; + va_start(args, fmt); + trusty_tlog((tag[0] == '\0') ? "libbinder" : "libbinder-"); + trusty_vtlog(fmt, args); + va_end(args); + + return 1; +} + +// TODO(b/285204695): remove once trusty mock doesn't depend on libbase +extern "C" int __android_log_buf_print(int, int, const char*, const char*, ...) { + return -ENOSYS; +} diff --git a/libs/binder/trusty/binderRpcTest/service/manifest.json b/libs/binder/trusty/binderRpcTest/service/manifest.json index 1c4f7ee0d1..d2a1fc0a48 100644 --- a/libs/binder/trusty/binderRpcTest/service/manifest.json +++ b/libs/binder/trusty/binderRpcTest/service/manifest.json @@ -2,7 +2,7 @@ "uuid": "87e424e5-69d7-4bbd-8b7c-7e24812cbc94", "app_name": "binderRpcTestService", "min_heap": 65536, - "min_stack": 16384, + "min_stack": 20480, "mgmt_flags": { "restart_on_exit": true, "non_critical_app": true diff --git a/libs/binder/trusty/include/log/log.h b/libs/binder/trusty/include/log/log.h deleted file mode 100644 index bf877a3179..0000000000 --- a/libs/binder/trusty/include/log/log.h +++ /dev/null @@ -1,122 +0,0 @@ -/* - * 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 BINDER_LOG_LEVEL_NONE 0 -#define BINDER_LOG_LEVEL_NORMAL 1 -#define BINDER_LOG_LEVEL_VERBOSE 2 - -#ifndef BINDER_LOG_LEVEL -#define BINDER_LOG_LEVEL BINDER_LOG_LEVEL_NORMAL -#endif // BINDER_LOG_LEVEL - -#ifndef TLOG_TAG -#ifdef LOG_TAG -#define TLOG_TAG "libbinder-" LOG_TAG -#else // LOG_TAG -#define TLOG_TAG "libbinder" -#endif // LOG_TAG -#endif // TLOG_TAG - -#include <stdlib.h> -#include <trusty_log.h> - -static inline void __ignore_va_args__(...) {} - -#if BINDER_LOG_LEVEL >= BINDER_LOG_LEVEL_NORMAL -#define ALOGD(fmt, ...) TLOGD(fmt "\n", ##__VA_ARGS__) -#define ALOGI(fmt, ...) TLOGI(fmt "\n", ##__VA_ARGS__) -#define ALOGW(fmt, ...) TLOGW(fmt "\n", ##__VA_ARGS__) -#define ALOGE(fmt, ...) TLOGE(fmt "\n", ##__VA_ARGS__) -#else // BINDER_LOG_LEVEL >= BINDER_LOG_LEVEL_NORMAL -#define ALOGD(fmt, ...) \ - while (0) { \ - __ignore_va_args__(__VA_ARGS__); \ - } -#define ALOGI(fmt, ...) \ - while (0) { \ - __ignore_va_args__(__VA_ARGS__); \ - } -#define ALOGW(fmt, ...) \ - while (0) { \ - __ignore_va_args__(__VA_ARGS__); \ - } -#define ALOGE(fmt, ...) \ - while (0) { \ - __ignore_va_args__(__VA_ARGS__); \ - } -#endif // BINDER_LOG_LEVEL >= BINDER_LOG_LEVEL_NORMAL - -#if BINDER_LOG_LEVEL >= BINDER_LOG_LEVEL_VERBOSE -#define IF_ALOGV() if (TLOG_LVL >= TLOG_LVL_INFO) -#define ALOGV(fmt, ...) TLOGI(fmt "\n", ##__VA_ARGS__) -#else // BINDER_LOG_LEVEL >= BINDER_LOG_LEVEL_VERBOSE -#define IF_ALOGV() if (false) -#define ALOGV(fmt, ...) \ - while (0) { \ - __ignore_va_args__(__VA_ARGS__); \ - } -#endif // BINDER_LOG_LEVEL >= BINDER_LOG_LEVEL_VERBOSE - -#define ALOGI_IF(cond, ...) \ - do { \ - if (cond) { \ - ALOGI(#cond ": " __VA_ARGS__); \ - } \ - } while (0) -#define ALOGE_IF(cond, ...) \ - do { \ - if (cond) { \ - ALOGE(#cond ": " __VA_ARGS__); \ - } \ - } while (0) -#define ALOGW_IF(cond, ...) \ - do { \ - if (cond) { \ - ALOGW(#cond ": " __VA_ARGS__); \ - } \ - } while (0) - -#define LOG_ALWAYS_FATAL(fmt, ...) \ - do { \ - TLOGE("libbinder fatal error: " fmt "\n", ##__VA_ARGS__); \ - abort(); \ - } while (0) -#define LOG_ALWAYS_FATAL_IF(cond, ...) \ - do { \ - if (cond) { \ - LOG_ALWAYS_FATAL(#cond ": " __VA_ARGS__); \ - } \ - } while (0) -#define LOG_FATAL(fmt, ...) \ - do { \ - TLOGE("libbinder fatal error: " fmt "\n", ##__VA_ARGS__); \ - abort(); \ - } while (0) -#define LOG_FATAL_IF(cond, ...) \ - do { \ - if (cond) { \ - LOG_FATAL(#cond ": " __VA_ARGS__); \ - } \ - } while (0) - -#define ALOG_ASSERT(cond, ...) LOG_FATAL_IF(!(cond), ##__VA_ARGS__) - -#define android_errorWriteLog(tag, subTag) \ - do { \ - TLOGE("android_errorWriteLog: tag:%x subTag:%s\n", tag, subTag); \ - } while (0) diff --git a/libs/binder/trusty/include_mock/trusty_log.h b/libs/binder/trusty/include_mock/trusty_log.h index d51e75280c..9aa90310c0 100644 --- a/libs/binder/trusty/include_mock/trusty_log.h +++ b/libs/binder/trusty/include_mock/trusty_log.h @@ -24,3 +24,6 @@ #define TLOGW(fmt, ...) printf(fmt, ##__VA_ARGS__) #define TLOGE(fmt, ...) printf(fmt, ##__VA_ARGS__) #define TLOGC(fmt, ...) printf(fmt, ##__VA_ARGS__) + +#define _tlog(fmt, ...) printf(fmt, ##__VA_ARGS__) +#define _vtlog(fmt, args) vprintf(fmt, args) diff --git a/libs/binder/trusty/kernel/rules.mk b/libs/binder/trusty/kernel/rules.mk index 2a13eadda3..788184d2ce 100644 --- a/libs/binder/trusty/kernel/rules.mk +++ b/libs/binder/trusty/kernel/rules.mk @@ -20,6 +20,7 @@ MODULE := $(LOCAL_DIR) LIBBINDER_DIR := frameworks/native/libs/binder # TODO(b/302723053): remove libbase after aidl prebuilt gets updated to December release LIBBASE_DIR := system/libbase +LIBLOG_STUB_DIR := $(LIBBINDER_DIR)/liblog_stub LIBUTILS_BINDER_DIR := system/core/libutils/binder FMTLIB_DIR := external/fmtlib @@ -53,6 +54,7 @@ MODULE_INCLUDES += \ GLOBAL_INCLUDES += \ $(LOCAL_DIR)/include \ $(LOCAL_DIR)/../include \ + $(LIBLOG_STUB_DIR)/include \ $(LIBBINDER_DIR)/include \ $(LIBBINDER_DIR)/ndk/include_cpp \ $(LIBBASE_DIR)/include \ diff --git a/libs/binder/trusty/rules.mk b/libs/binder/trusty/rules.mk index e2b386d710..e0f821f2c9 100644 --- a/libs/binder/trusty/rules.mk +++ b/libs/binder/trusty/rules.mk @@ -20,6 +20,7 @@ MODULE := $(LOCAL_DIR) LIBBINDER_DIR := frameworks/native/libs/binder # TODO(b/302723053): remove libbase after aidl prebuilt gets updated to December release LIBBASE_DIR := system/libbase +LIBLOG_STUB_DIR := $(LIBBINDER_DIR)/liblog_stub LIBUTILS_BINDER_DIR := system/core/libutils/binder FMTLIB_DIR := external/fmtlib @@ -54,6 +55,7 @@ MODULE_SRCS := \ MODULE_EXPORT_INCLUDES += \ $(LOCAL_DIR)/include \ + $(LIBLOG_STUB_DIR)/include \ $(LIBBINDER_DIR)/include \ $(LIBBASE_DIR)/include \ $(LIBUTILS_BINDER_DIR)/include \ |